aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/.bear-tidy-config21
-rw-r--r--src/.clang-tidy7
-rw-r--r--src/CMakeLists.txt454
-rw-r--r--src/Makefile.am1138
-rw-r--r--src/Makefile.bench.include111
-rw-r--r--src/Makefile.crc32c.include81
-rw-r--r--src/Makefile.leveldb.include153
-rw-r--r--src/Makefile.minisketch.include39
-rw-r--r--src/Makefile.qt.include409
-rw-r--r--src/Makefile.qt_locale.include124
-rw-r--r--src/Makefile.qttest.include74
-rw-r--r--src/Makefile.test.include488
-rw-r--r--src/Makefile.test_fuzz.include26
-rw-r--r--src/Makefile.test_util.include55
-rw-r--r--src/Makefile.univalue.include6
-rw-r--r--src/addrdb.cpp4
-rw-r--r--src/addresstype.cpp4
-rw-r--r--src/addresstype.h11
-rw-r--r--src/addrman.cpp106
-rw-r--r--src/addrman.h5
-rw-r--r--src/addrman_impl.h37
-rw-r--r--src/arith_uint256.h10
-rw-r--r--src/banman.cpp6
-rw-r--r--src/bech32.cpp3
-rw-r--r--src/bech32.h3
-rw-r--r--src/bench/.gitignore1
-rw-r--r--src/bench/CMakeLists.txt84
-rw-r--r--src/bench/addrman.cpp8
-rw-r--r--src/bench/base58.cpp5
-rw-r--r--src/bench/bech32.cpp9
-rw-r--r--src/bench/bench.cpp7
-rw-r--r--src/bench/bench.h5
-rw-r--r--src/bench/bench_bitcoin.cpp7
-rw-r--r--src/bench/bip324_ecdh.cpp2
-rw-r--r--src/bench/block_assemble.cpp12
-rw-r--r--src/bench/ccoins_caching.cpp5
-rw-r--r--src/bench/chacha20.cpp5
-rw-r--r--src/bench/checkblock.cpp13
-rw-r--r--src/bench/checkblockindex.cpp2
-rw-r--r--src/bench/checkqueue.cpp4
-rw-r--r--src/bench/cluster_linearize.cpp419
-rw-r--r--src/bench/coin_selection.cpp15
-rw-r--r--src/bench/crypto_hash.cpp23
-rw-r--r--src/bench/data.cpp14
-rw-r--r--src/bench/data.h19
-rw-r--r--src/bench/descriptors.cpp11
-rw-r--r--src/bench/disconnected_transactions.cpp11
-rw-r--r--src/bench/duplicate_inputs.cpp15
-rw-r--r--src/bench/ellswift.cpp7
-rw-r--r--src/bench/gcs_filter.cpp5
-rw-r--r--src/bench/hashpadding.cpp2
-rw-r--r--src/bench/index_blockfilter.cpp26
-rw-r--r--src/bench/load_external.cpp17
-rw-r--r--src/bench/lockedpool.cpp3
-rw-r--r--src/bench/logging.cpp66
-rw-r--r--src/bench/mempool_eviction.cpp11
-rw-r--r--src/bench/mempool_stress.cpp13
-rw-r--r--src/bench/merkle_root.cpp3
-rw-r--r--src/bench/peer_eviction.cpp5
-rw-r--r--src/bench/poly1305.cpp5
-rw-r--r--src/bench/pool.cpp4
-rw-r--r--src/bench/prevector.cpp6
-rw-r--r--src/bench/random.cpp105
-rw-r--r--src/bench/readblock.cpp15
-rw-r--r--src/bench/rollingbloom.cpp2
-rw-r--r--src/bench/rpc_blockchain.cpp16
-rw-r--r--src/bench/rpc_mempool.cpp11
-rw-r--r--src/bench/sign_transaction.cpp106
-rw-r--r--src/bench/streams_findbyte.cpp2
-rw-r--r--src/bench/strencodings.cpp5
-rw-r--r--src/bench/verify_script.cpp11
-rw-r--r--src/bench/wallet_balance.cpp16
-rw-r--r--src/bench/wallet_create.cpp19
-rw-r--r--src/bench/wallet_create_tx.cpp29
-rw-r--r--src/bench/wallet_ismine.cpp23
-rw-r--r--src/bench/wallet_loading.cpp24
-rw-r--r--src/bench/xor.cpp2
-rw-r--r--src/bitcoin-chainstate.cpp17
-rw-r--r--src/bitcoin-cli.cpp17
-rw-r--r--src/bitcoin-tx.cpp12
-rw-r--r--src/bitcoin-wallet.cpp2
-rw-r--r--src/bitcoind.cpp7
-rw-r--r--src/blockencodings.cpp6
-rw-r--r--src/blockencodings.h4
-rw-r--r--src/chain.h13
-rw-r--r--src/chainparams.cpp2
-rw-r--r--src/chainparamsbase.cpp9
-rw-r--r--src/chainparamsbase.h4
-rw-r--r--src/chainparamsseeds.h3826
-rw-r--r--src/clientversion.cpp6
-rw-r--r--src/cluster_linearize.h1282
-rw-r--r--src/coins.cpp131
-rw-r--r--src/coins.h157
-rw-r--r--src/common/args.cpp31
-rw-r--r--src/common/args.h11
-rw-r--r--src/common/bloom.cpp2
-rw-r--r--src/common/messages.cpp32
-rw-r--r--src/common/messages.h2
-rw-r--r--src/common/netif.cpp303
-rw-r--r--src/common/netif.h19
-rw-r--r--src/common/pcp.cpp524
-rw-r--r--src/common/pcp.h68
-rw-r--r--src/consensus/consensus.h7
-rw-r--r--src/consensus/params.h5
-rw-r--r--src/core_io.h9
-rw-r--r--src/core_read.cpp11
-rw-r--r--src/crypto/CMakeLists.txt68
-rw-r--r--src/crypto/common.h6
-rw-r--r--src/crypto/muhash.h2
-rw-r--r--src/crypto/sha256.cpp7
-rw-r--r--src/crypto/sha256_x86_shani.cpp2
-rw-r--r--src/crypto/sha3.h2
-rw-r--r--src/cuckoocache.h14
-rw-r--r--src/dbwrapper.cpp8
-rw-r--r--src/external_signer.cpp4
-rw-r--r--src/flatfile.cpp8
-rw-r--r--src/flatfile.h8
-rw-r--r--src/headerssync.cpp30
-rw-r--r--src/headerssync.h2
-rw-r--r--src/httprpc.cpp11
-rw-r--r--src/httpserver.cpp48
-rw-r--r--src/httpserver.h4
-rw-r--r--src/index/base.cpp7
-rw-r--r--src/index/base.h10
-rw-r--r--src/index/blockfilterindex.cpp10
-rw-r--r--src/index/blockfilterindex.h4
-rw-r--r--src/index/coinstatsindex.cpp6
-rw-r--r--src/index/coinstatsindex.h4
-rw-r--r--src/index/disktxpos.h2
-rw-r--r--src/index/txindex.cpp5
-rw-r--r--src/init.cpp516
-rw-r--r--src/init.h6
-rw-r--r--src/init/bitcoin-gui.cpp5
-rw-r--r--src/init/bitcoin-node.cpp1
-rw-r--r--src/init/common.cpp4
-rw-r--r--src/interfaces/chain.h43
-rw-r--r--src/interfaces/echo.h2
-rw-r--r--src/interfaces/handler.h2
-rw-r--r--src/interfaces/init.h1
-rw-r--r--src/interfaces/ipc.h16
-rw-r--r--src/interfaces/mining.h56
-rw-r--r--src/interfaces/node.h15
-rw-r--r--src/interfaces/types.h20
-rw-r--r--src/interfaces/wallet.h7
-rw-r--r--src/ipc/CMakeLists.txt23
-rw-r--r--src/ipc/capnp/.gitignore2
-rw-r--r--src/ipc/capnp/common-types.h139
-rw-r--r--src/ipc/capnp/common.capnp16
-rw-r--r--src/ipc/capnp/init-types.h1
-rw-r--r--src/ipc/capnp/init.capnp3
-rw-r--r--src/ipc/capnp/mining-types.h26
-rw-r--r--src/ipc/capnp/mining.capnp50
-rw-r--r--src/ipc/capnp/mining.cpp47
-rw-r--r--src/ipc/capnp/protocol.cpp15
-rw-r--r--src/ipc/interfaces.cpp34
-rw-r--r--src/ipc/process.cpp96
-rw-r--r--src/ipc/process.h10
-rw-r--r--src/ipc/protocol.h28
-rw-r--r--src/kernel/CMakeLists.txt146
-rw-r--r--src/kernel/blockmanager_opts.h3
-rw-r--r--src/kernel/chainparams.cpp288
-rw-r--r--src/kernel/chainparams.h9
-rw-r--r--src/kernel/chainstatemanager_opts.h3
-rw-r--r--src/kernel/context.cpp11
-rw-r--r--src/kernel/mempool_options.h2
-rw-r--r--src/kernel/notifications_interface.h2
-rw-r--r--src/kernel/validation_cache_sizes.h20
-rw-r--r--src/key.cpp61
-rw-r--r--src/key.h87
-rw-r--r--src/key_io.cpp4
-rw-r--r--src/logging.cpp174
-rw-r--r--src/logging.h162
-rw-r--r--src/logging/timer.h4
-rw-r--r--src/mapport.cpp208
-rw-r--r--src/mapport.h4
-rw-r--r--src/merkleblock.h2
-rw-r--r--src/net.cpp262
-rw-r--r--src/net.h25
-rw-r--r--src/net_processing.cpp664
-rw-r--r--src/net_processing.h8
-rw-r--r--src/net_types.h2
-rw-r--r--src/netaddress.cpp4
-rw-r--r--src/netaddress.h4
-rw-r--r--src/netbase.cpp33
-rw-r--r--src/netbase.h7
-rw-r--r--src/node/blockmanager_args.cpp1
-rw-r--r--src/node/blockstorage.cpp155
-rw-r--r--src/node/blockstorage.h49
-rw-r--r--src/node/caches.cpp1
-rw-r--r--src/node/chainstatemanager_args.cpp25
-rw-r--r--src/node/context.h2
-rw-r--r--src/node/interface_ui.h3
-rw-r--r--src/node/interfaces.cpp127
-rw-r--r--src/node/kernel_notifications.cpp6
-rw-r--r--src/node/kernel_notifications.h12
-rw-r--r--src/node/mempool_args.cpp3
-rw-r--r--src/node/mempool_persist.cpp (renamed from src/kernel/mempool_persist.cpp)10
-rw-r--r--src/node/mempool_persist.h (renamed from src/kernel/mempool_persist.h)10
-rw-r--r--src/node/miner.cpp33
-rw-r--r--src/node/miner.h36
-rw-r--r--src/node/mini_miner.cpp22
-rw-r--r--src/node/transaction.cpp2
-rw-r--r--src/node/txreconciliation.cpp2
-rw-r--r--src/node/types.h22
-rw-r--r--src/node/utxo_snapshot.cpp6
-rw-r--r--src/node/utxo_snapshot.h13
-rw-r--r--src/node/validation_cache_args.cpp34
-rw-r--r--src/node/validation_cache_args.h17
-rw-r--r--src/node/warnings.cpp3
-rw-r--r--src/policy/feerate.h4
-rw-r--r--src/policy/fees.cpp20
-rw-r--r--src/policy/fees.h2
-rw-r--r--src/policy/policy.cpp5
-rw-r--r--src/policy/truc_policy.cpp (renamed from src/policy/v3_policy.cpp)84
-rw-r--r--src/policy/truc_policy.h94
-rw-r--r--src/policy/v3_policy.h93
-rw-r--r--src/pow.cpp25
-rw-r--r--src/pow.h1
-rw-r--r--src/prevector.h31
-rw-r--r--src/primitives/block.h2
-rw-r--r--src/psbt.h15
-rw-r--r--src/pubkey.cpp11
-rw-r--r--src/pubkey.h2
-rw-r--r--src/qt/CMakeLists.txt330
-rw-r--r--src/qt/Makefile11
-rw-r--r--src/qt/README.md6
-rw-r--r--src/qt/askpassphrasedialog.cpp8
-rw-r--r--src/qt/askpassphrasedialog.h1
-rw-r--r--src/qt/bitcoin.cpp19
-rw-r--r--src/qt/bitcoin_locale.qrc2
-rw-r--r--src/qt/bitcoingui.cpp49
-rw-r--r--src/qt/bitcoinstrings.cpp55
-rw-r--r--src/qt/clientmodel.cpp9
-rw-r--r--src/qt/clientmodel.h6
-rw-r--r--src/qt/coincontroldialog.cpp26
-rw-r--r--src/qt/forms/debugwindow.ui204
-rw-r--r--src/qt/forms/optionsdialog.ui6
-rw-r--r--src/qt/guiconstants.h1
-rw-r--r--src/qt/guiutil.cpp58
-rw-r--r--src/qt/guiutil.h3
-rw-r--r--src/qt/locale/bitcoin_af.ts315
-rw-r--r--src/qt/locale/bitcoin_am.ts189
-rw-r--r--src/qt/locale/bitcoin_ar.ts2986
-rw-r--r--src/qt/locale/bitcoin_az.ts124
-rw-r--r--src/qt/locale/bitcoin_az@latin.ts79
-rw-r--r--src/qt/locale/bitcoin_be.ts12
-rw-r--r--src/qt/locale/bitcoin_bg.ts42
-rw-r--r--src/qt/locale/bitcoin_bn.ts8
-rw-r--r--src/qt/locale/bitcoin_bs.ts21
-rw-r--r--src/qt/locale/bitcoin_ca.ts209
-rw-r--r--src/qt/locale/bitcoin_cmn.ts305
-rw-r--r--src/qt/locale/bitcoin_cs.ts78
-rw-r--r--src/qt/locale/bitcoin_da.ts98
-rw-r--r--src/qt/locale/bitcoin_de.ts416
-rw-r--r--src/qt/locale/bitcoin_de_AT.ts4582
-rw-r--r--src/qt/locale/bitcoin_de_CH.ts238
-rw-r--r--src/qt/locale/bitcoin_el.ts299
-rw-r--r--src/qt/locale/bitcoin_en.ts488
-rw-r--r--src/qt/locale/bitcoin_en.xlf3569
-rw-r--r--src/qt/locale/bitcoin_eo.ts60
-rw-r--r--src/qt/locale/bitcoin_es.ts517
-rw-r--r--src/qt/locale/bitcoin_es_CL.ts297
-rw-r--r--src/qt/locale/bitcoin_es_CO.ts306
-rw-r--r--src/qt/locale/bitcoin_es_DO.ts1610
-rw-r--r--src/qt/locale/bitcoin_es_MX.ts737
-rw-r--r--src/qt/locale/bitcoin_es_SV.ts2058
-rw-r--r--src/qt/locale/bitcoin_es_VE.ts1652
-rw-r--r--src/qt/locale/bitcoin_et.ts4
-rw-r--r--src/qt/locale/bitcoin_eu.ts20
-rw-r--r--src/qt/locale/bitcoin_fa.ts2571
-rw-r--r--src/qt/locale/bitcoin_fi.ts638
-rw-r--r--src/qt/locale/bitcoin_fil.ts62
-rw-r--r--src/qt/locale/bitcoin_fo.ts20
-rw-r--r--src/qt/locale/bitcoin_fr.ts394
-rw-r--r--src/qt/locale/bitcoin_fr_CM.ts243
-rw-r--r--src/qt/locale/bitcoin_fr_LU.ts243
-rw-r--r--src/qt/locale/bitcoin_ga.ts1770
-rw-r--r--src/qt/locale/bitcoin_ga_IE.ts1793
-rw-r--r--src/qt/locale/bitcoin_gl.ts92
-rw-r--r--src/qt/locale/bitcoin_gl_ES.ts93
-rw-r--r--src/qt/locale/bitcoin_gu.ts2704
-rw-r--r--src/qt/locale/bitcoin_hak.ts307
-rw-r--r--src/qt/locale/bitcoin_he.ts75
-rw-r--r--src/qt/locale/bitcoin_hi.ts202
-rw-r--r--src/qt/locale/bitcoin_hr.ts49
-rw-r--r--src/qt/locale/bitcoin_hu.ts263
-rw-r--r--src/qt/locale/bitcoin_id.ts299
-rw-r--r--src/qt/locale/bitcoin_it.ts221
-rw-r--r--src/qt/locale/bitcoin_ja.ts323
-rw-r--r--src/qt/locale/bitcoin_ka.ts36
-rw-r--r--src/qt/locale/bitcoin_kk.ts6
-rw-r--r--src/qt/locale/bitcoin_kk@latin.ts6
-rw-r--r--src/qt/locale/bitcoin_km.ts144
-rw-r--r--src/qt/locale/bitcoin_ko.ts74
-rw-r--r--src/qt/locale/bitcoin_ku.ts22
-rw-r--r--src/qt/locale/bitcoin_ku_IQ.ts20
-rw-r--r--src/qt/locale/bitcoin_la.ts980
-rw-r--r--src/qt/locale/bitcoin_lt.ts36
-rw-r--r--src/qt/locale/bitcoin_lv.ts4
-rw-r--r--src/qt/locale/bitcoin_mi.ts6
-rw-r--r--src/qt/locale/bitcoin_mk.ts28
-rw-r--r--src/qt/locale/bitcoin_ml.ts92
-rw-r--r--src/qt/locale/bitcoin_mn.ts4
-rw-r--r--src/qt/locale/bitcoin_ms.ts39
-rw-r--r--src/qt/locale/bitcoin_mt.ts21
-rw-r--r--src/qt/locale/bitcoin_my.ts31
-rw-r--r--src/qt/locale/bitcoin_nb.ts84
-rw-r--r--src/qt/locale/bitcoin_ne.ts4
-rw-r--r--src/qt/locale/bitcoin_nl.ts105
-rw-r--r--src/qt/locale/bitcoin_pam.ts4
-rw-r--r--src/qt/locale/bitcoin_pl.ts302
-rw-r--r--src/qt/locale/bitcoin_pt.ts1410
-rw-r--r--src/qt/locale/bitcoin_pt_BR.ts224
-rw-r--r--src/qt/locale/bitcoin_ro.ts289
-rw-r--r--src/qt/locale/bitcoin_ru.ts2612
-rw-r--r--src/qt/locale/bitcoin_si.ts32
-rw-r--r--src/qt/locale/bitcoin_sk.ts46
-rw-r--r--src/qt/locale/bitcoin_sl.ts158
-rw-r--r--src/qt/locale/bitcoin_sn.ts4
-rw-r--r--src/qt/locale/bitcoin_sr.ts66
-rw-r--r--src/qt/locale/bitcoin_sr@ijekavianlatin.ts72
-rw-r--r--src/qt/locale/bitcoin_sr@latin.ts68
-rw-r--r--src/qt/locale/bitcoin_sv.ts166
-rw-r--r--src/qt/locale/bitcoin_sw.ts362
-rw-r--r--src/qt/locale/bitcoin_szl.ts23
-rw-r--r--src/qt/locale/bitcoin_ta.ts76
-rw-r--r--src/qt/locale/bitcoin_te.ts41
-rw-r--r--src/qt/locale/bitcoin_th.ts340
-rw-r--r--src/qt/locale/bitcoin_tk.ts33
-rw-r--r--src/qt/locale/bitcoin_tl.ts33
-rw-r--r--src/qt/locale/bitcoin_tr.ts464
-rw-r--r--src/qt/locale/bitcoin_uk.ts91
-rw-r--r--src/qt/locale/bitcoin_ur.ts154
-rw-r--r--src/qt/locale/bitcoin_uz.ts82
-rw-r--r--src/qt/locale/bitcoin_uz@Cyrl.ts26
-rw-r--r--src/qt/locale/bitcoin_uz@Latn.ts68
-rw-r--r--src/qt/locale/bitcoin_vi.ts86
-rw-r--r--src/qt/locale/bitcoin_yue.ts279
-rw-r--r--src/qt/locale/bitcoin_zh-Hans.ts131
-rw-r--r--src/qt/locale/bitcoin_zh-Hant.ts305
-rw-r--r--src/qt/locale/bitcoin_zh.ts383
-rw-r--r--src/qt/locale/bitcoin_zh_CN.ts135
-rw-r--r--src/qt/locale/bitcoin_zh_HK.ts301
-rw-r--r--src/qt/locale/bitcoin_zh_TW.ts202
-rw-r--r--src/qt/modaloverlay.cpp10
-rw-r--r--src/qt/networkstyle.cpp1
-rw-r--r--src/qt/optionsdialog.cpp23
-rw-r--r--src/qt/optionsmodel.cpp4
-rw-r--r--src/qt/rpcconsole.cpp29
-rw-r--r--src/qt/rpcconsole.h2
-rw-r--r--src/qt/test/CMakeLists.txt56
-rw-r--r--src/qt/test/Makefile6
-rw-r--r--src/qt/test/test_main.cpp16
-rw-r--r--src/qt/test/wallettests.cpp8
-rw-r--r--src/qt/transactiondesc.h2
-rw-r--r--src/qt/transactiontablemodel.cpp2
-rw-r--r--src/qt/transactionview.cpp6
-rw-r--r--src/qt/walletcontroller.cpp59
-rw-r--r--src/qt/walletcontroller.h9
-rw-r--r--src/qt/walletmodel.cpp3
-rw-r--r--src/random.cpp191
-rw-r--r--src/random.h486
-rw-r--r--src/randomenv.cpp8
-rw-r--r--src/rest.cpp60
-rw-r--r--src/reverse_iterator.h39
-rw-r--r--src/rpc/blockchain.cpp527
-rw-r--r--src/rpc/blockchain.h10
-rw-r--r--src/rpc/client.cpp5
-rw-r--r--src/rpc/fees.cpp15
-rw-r--r--src/rpc/mempool.cpp10
-rw-r--r--src/rpc/mining.cpp160
-rw-r--r--src/rpc/node.cpp7
-rw-r--r--src/rpc/output_script.cpp126
-rw-r--r--src/rpc/protocol.h3
-rw-r--r--src/rpc/rawtransaction.cpp39
-rw-r--r--src/rpc/request.cpp4
-rw-r--r--src/rpc/server.cpp38
-rw-r--r--src/rpc/server.h13
-rw-r--r--src/rpc/txoutproof.cpp5
-rw-r--r--src/rpc/util.cpp45
-rw-r--r--src/script/descriptor.cpp581
-rw-r--r--src/script/descriptor.h4
-rw-r--r--src/script/interpreter.cpp6
-rw-r--r--src/script/interpreter.h2
-rw-r--r--src/script/miniscript.h33
-rw-r--r--src/script/script.cpp17
-rw-r--r--src/script/script.h79
-rw-r--r--src/script/sigcache.cpp131
-rw-r--r--src/script/sigcache.h51
-rw-r--r--src/script/sign.cpp26
-rw-r--r--src/script/sign.h23
-rw-r--r--src/script/signingprovider.h2
-rw-r--r--src/script/solver.cpp4
-rw-r--r--src/script/solver.h1
-rw-r--r--src/secp256k1/.cirrus.yml3
-rw-r--r--src/secp256k1/.github/workflows/ci.yml59
-rw-r--r--src/secp256k1/.gitignore1
-rw-r--r--src/secp256k1/CHANGELOG.md20
-rw-r--r--src/secp256k1/CMakeLists.txt28
-rw-r--r--src/secp256k1/CONTRIBUTING.md1
-rw-r--r--src/secp256k1/Makefile.am11
-rw-r--r--src/secp256k1/README.md3
-rwxr-xr-xsrc/secp256k1/ci/ci.sh3
-rw-r--r--src/secp256k1/ci/linux-debian.Dockerfile2
-rw-r--r--src/secp256k1/configure.ac8
-rw-r--r--src/secp256k1/doc/release-process.md5
-rw-r--r--src/secp256k1/examples/CMakeLists.txt4
-rw-r--r--src/secp256k1/examples/ecdh.c2
-rw-r--r--src/secp256k1/examples/ecdsa.c2
-rw-r--r--src/secp256k1/examples/ellswift.c123
-rw-r--r--src/secp256k1/examples/schnorr.c6
-rw-r--r--src/secp256k1/include/secp256k1_ellswift.h2
-rw-r--r--src/secp256k1/src/modules/ellswift/tests_impl.h6
-rw-r--r--src/secp256k1/src/modules/schnorrsig/main_impl.h2
-rw-r--r--src/secp256k1/src/modules/schnorrsig/tests_impl.h10
-rw-r--r--src/secp256k1/src/testrand_impl.h2
-rw-r--r--src/secp256k1/src/tests.c14
-rw-r--r--src/secp256k1/src/testutil.h6
-rw-r--r--src/serialize.h2
-rw-r--r--src/signet.cpp15
-rw-r--r--src/span.h9
-rw-r--r--src/streams.cpp64
-rw-r--r--src/streams.h20
-rw-r--r--src/support/cleanse.cpp8
-rw-r--r--src/support/lockedpool.cpp4
-rw-r--r--src/support/lockedpool.h2
-rw-r--r--src/sync.h2
-rw-r--r--src/test/.gitignore2
-rw-r--r--src/test/CMakeLists.txt216
-rw-r--r--src/test/Makefile6
-rw-r--r--src/test/README.md87
-rw-r--r--src/test/addrman_tests.cpp55
-rw-r--r--src/test/argsman_tests.cpp18
-rw-r--r--src/test/arith_uint256_tests.cpp88
-rw-r--r--src/test/base32_tests.cpp4
-rw-r--r--src/test/base58_tests.cpp13
-rw-r--r--src/test/base64_tests.cpp4
-rw-r--r--src/test/bip324_tests.cpp25
-rw-r--r--src/test/blockchain_tests.cpp41
-rw-r--r--src/test/blockencodings_tests.cpp6
-rw-r--r--src/test/blockfilter_index_tests.cpp2
-rw-r--r--src/test/blockfilter_tests.cpp9
-rw-r--r--src/test/blockmanager_tests.cpp5
-rw-r--r--src/test/bloom_tests.cpp174
-rw-r--r--src/test/checkqueue_tests.cpp20
-rw-r--r--src/test/cluster_linearize_tests.cpp138
-rw-r--r--src/test/coins_tests.cpp176
-rw-r--r--src/test/coinscachepair_tests.cpp219
-rw-r--r--src/test/compress_tests.cpp2
-rw-r--r--src/test/crypto_tests.cpp84
-rw-r--r--src/test/cuckoocache_tests.cpp54
-rw-r--r--src/test/dbwrapper_tests.cpp46
-rw-r--r--src/test/denialofservice_tests.cpp12
-rw-r--r--src/test/descriptor_tests.cpp437
-rw-r--r--src/test/fuzz/CMakeLists.txt147
-rw-r--r--src/test/fuzz/addrman.cpp44
-rw-r--r--src/test/fuzz/autofile.cpp1
-rw-r--r--src/test/fuzz/banman.cpp8
-rw-r--r--src/test/fuzz/bech32.cpp5
-rw-r--r--src/test/fuzz/bip324.cpp17
-rw-r--r--src/test/fuzz/bitset.cpp16
-rw-r--r--src/test/fuzz/block_header.cpp2
-rw-r--r--src/test/fuzz/block_index.cpp133
-rw-r--r--src/test/fuzz/buffered_file.cpp4
-rw-r--r--src/test/fuzz/cluster_linearize.cpp1021
-rw-r--r--src/test/fuzz/coins_view.cpp16
-rw-r--r--src/test/fuzz/coinscache_sim.cpp8
-rw-r--r--src/test/fuzz/connman.cpp16
-rw-r--r--src/test/fuzz/crypto.cpp8
-rw-r--r--src/test/fuzz/crypto_chacha20.cpp33
-rw-r--r--src/test/fuzz/crypto_chacha20poly1305.cpp200
-rw-r--r--src/test/fuzz/crypto_common.cpp4
-rw-r--r--src/test/fuzz/cuckoocache.cpp4
-rw-r--r--src/test/fuzz/descriptor_parse.cpp42
-rw-r--r--src/test/fuzz/fuzz.cpp13
-rw-r--r--src/test/fuzz/hex.cpp23
-rw-r--r--src/test/fuzz/integer.cpp8
-rw-r--r--src/test/fuzz/kitchen_sink.cpp2
-rw-r--r--src/test/fuzz/message.cpp4
-rw-r--r--src/test/fuzz/mini_miner.cpp6
-rw-r--r--src/test/fuzz/miniscript.cpp8
-rw-r--r--src/test/fuzz/muhash.cpp6
-rw-r--r--src/test/fuzz/net.cpp12
-rw-r--r--src/test/fuzz/p2p_handshake.cpp107
-rw-r--r--src/test/fuzz/p2p_headers_presync.cpp216
-rw-r--r--src/test/fuzz/p2p_transport_serialization.cpp24
-rw-r--r--src/test/fuzz/package_eval.cpp6
-rw-r--r--src/test/fuzz/parse_univalue.cpp4
-rw-r--r--src/test/fuzz/policy_estimator.cpp13
-rw-r--r--src/test/fuzz/poolresource.cpp37
-rw-r--r--src/test/fuzz/pow.cpp2
-rw-r--r--src/test/fuzz/prevector.cpp47
-rw-r--r--src/test/fuzz/process_message.cpp2
-rw-r--r--src/test/fuzz/process_messages.cpp2
-rw-r--r--src/test/fuzz/random.cpp1
-rw-r--r--src/test/fuzz/rpc.cpp2
-rw-r--r--src/test/fuzz/script.cpp1
-rw-r--r--src/test/fuzz/script_format.cpp4
-rw-r--r--src/test/fuzz/script_interpreter.cpp10
-rw-r--r--src/test/fuzz/script_sigcache.cpp20
-rw-r--r--src/test/fuzz/script_sign.cpp10
-rw-r--r--src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp2
-rw-r--r--src/test/fuzz/socks5.cpp8
-rw-r--r--src/test/fuzz/span.cpp6
-rw-r--r--src/test/fuzz/string.cpp3
-rw-r--r--src/test/fuzz/system.cpp18
-rw-r--r--src/test/fuzz/tx_pool.cpp6
-rw-r--r--src/test/fuzz/txorphan.cpp8
-rw-r--r--src/test/fuzz/util.cpp3
-rw-r--r--src/test/fuzz/util/CMakeLists.txt23
-rw-r--r--src/test/fuzz/util/descriptor.cpp59
-rw-r--r--src/test/fuzz/util/descriptor.h21
-rw-r--r--src/test/fuzz/util/net.cpp16
-rw-r--r--src/test/fuzz/utxo_snapshot.cpp151
-rw-r--r--src/test/fuzz/utxo_total_supply.cpp2
-rw-r--r--src/test/fuzz/validation_load_mempool.cpp6
-rw-r--r--src/test/fuzz/vecdeque.cpp22
-rw-r--r--src/test/hash_tests.cpp6
-rw-r--r--src/test/i2p_tests.cpp4
-rw-r--r--src/test/ipc_test.capnp7
-rw-r--r--src/test/ipc_test.cpp132
-rw-r--r--src/test/ipc_test.h9
-rw-r--r--src/test/ipc_test_types.h12
-rw-r--r--src/test/ipc_tests.cpp33
-rw-r--r--src/test/key_io_tests.cpp5
-rw-r--r--src/test/key_tests.cpp67
-rw-r--r--src/test/logging_tests.cpp30
-rw-r--r--src/test/merkle_tests.cpp4
-rw-r--r--src/test/merkleblock_tests.cpp6
-rw-r--r--src/test/miner_tests.cpp7
-rw-r--r--src/test/miniscript_tests.cpp39
-rw-r--r--src/test/minisketch_tests.cpp10
-rw-r--r--src/test/multisig_tests.cpp1
-rw-r--r--src/test/net_peer_connection_tests.cpp12
-rw-r--r--src/test/net_peer_eviction_tests.cpp4
-rw-r--r--src/test/net_tests.cpp253
-rw-r--r--src/test/orphanage_tests.cpp90
-rw-r--r--src/test/pmt_tests.cpp16
-rw-r--r--src/test/policyestimator_tests.cpp5
-rw-r--r--src/test/pool_tests.cpp8
-rw-r--r--src/test/pow_tests.cpp19
-rw-r--r--src/test/prevector_tests.cpp93
-rw-r--r--src/test/raii_event_tests.cpp8
-rw-r--r--src/test/random_tests.cpp149
-rw-r--r--src/test/script_p2sh_tests.cpp4
-rw-r--r--src/test/script_standard_tests.cpp35
-rw-r--r--src/test/script_tests.cpp131
-rw-r--r--src/test/serfloat_tests.cpp4
-rw-r--r--src/test/sighash_tests.cpp32
-rw-r--r--src/test/skiplist_tests.cpp10
-rw-r--r--src/test/streams_tests.cpp25
-rw-r--r--src/test/system_tests.cpp11
-rw-r--r--src/test/transaction_tests.cpp42
-rw-r--r--src/test/txpackage_tests.cpp55
-rw-r--r--src/test/txrequest_tests.cpp120
-rw-r--r--src/test/txvalidation_tests.cpp100
-rw-r--r--src/test/txvalidationcache_tests.cpp38
-rw-r--r--src/test/uint256_tests.cpp420
-rw-r--r--src/test/util/CMakeLists.txt29
-rw-r--r--src/test/util/chainstate.h6
-rw-r--r--src/test/util/cluster_linearize.h345
-rw-r--r--src/test/util/coins.cpp6
-rw-r--r--src/test/util/coins.h3
-rw-r--r--src/test/util/json.cpp8
-rw-r--r--src/test/util/json.h8
-rw-r--r--src/test/util/net.cpp31
-rw-r--r--src/test/util/net.h5
-rw-r--r--src/test/util/random.cpp43
-rw-r--r--src/test/util/random.h70
-rw-r--r--src/test/util/setup_common.cpp143
-rw-r--r--src/test/util/setup_common.h83
-rw-r--r--src/test/util/transaction_utils.cpp42
-rw-r--r--src/test/util/transaction_utils.h24
-rw-r--r--src/test/util/txmempool.cpp22
-rw-r--r--src/test/util/txmempool.h14
-rw-r--r--src/test/util/xoroshiro128plusplus.h71
-rw-r--r--src/test/util_string_tests.cpp85
-rw-r--r--src/test/util_tests.cpp117
-rw-r--r--src/test/validation_block_tests.cpp8
-rw-r--r--src/test/validation_chainstate_tests.cpp17
-rw-r--r--src/test/validation_chainstatemanager_tests.cpp87
-rw-r--r--src/test/validation_flush_tests.cpp14
-rw-r--r--src/test/validation_tests.cpp6
-rw-r--r--src/test/versionbits_tests.cpp19
-rw-r--r--src/test/xoroshiro128plusplus_tests.cpp29
-rw-r--r--src/threadsafety.h2
-rw-r--r--src/tinyformat.h3
-rw-r--r--src/torcontrol.cpp36
-rw-r--r--src/txdb.cpp14
-rw-r--r--src/txdb.h4
-rw-r--r--src/txmempool.cpp12
-rw-r--r--src/txmempool.h11
-rw-r--r--src/txorphanage.cpp57
-rw-r--r--src/txorphanage.h47
-rw-r--r--src/txrequest.cpp17
-rw-r--r--src/uint256.cpp36
-rw-r--r--src/uint256.h116
-rw-r--r--src/univalue/.gitignore32
-rw-r--r--src/univalue/CMakeLists.txt41
-rw-r--r--src/univalue/lib/.gitignore2
-rw-r--r--src/univalue/sources.mk86
-rw-r--r--src/univalue/test/.gitignore7
-rw-r--r--src/univalue/test/object.cpp14
-rw-r--r--src/util/CMakeLists.txt46
-rw-r--r--src/util/asmap.cpp6
-rw-r--r--src/util/bytevectorhash.cpp4
-rw-r--r--src/util/chaintype.cpp4
-rw-r--r--src/util/chaintype.h1
-rw-r--r--src/util/fs_helpers.cpp2
-rw-r--r--src/util/hasher.cpp12
-rw-r--r--src/util/strencodings.cpp10
-rw-r--r--src/util/strencodings.h81
-rw-r--r--src/util/string.h80
-rw-r--r--src/util/subprocess.h2
-rw-r--r--src/util/task_runner.h2
-rw-r--r--src/util/transaction_identifier.h11
-rw-r--r--src/util/translation.h12
-rw-r--r--src/validation.cpp504
-rw-r--r--src/validation.h81
-rw-r--r--src/validationinterface.cpp10
-rw-r--r--src/validationinterface.h5
-rw-r--r--src/wallet/CMakeLists.txt59
-rw-r--r--src/wallet/bdb.cpp18
-rw-r--r--src/wallet/coincontrol.h2
-rw-r--r--src/wallet/coinselection.cpp65
-rw-r--r--src/wallet/coinselection.h28
-rw-r--r--src/wallet/crypter.cpp66
-rw-r--r--src/wallet/crypter.h12
-rw-r--r--src/wallet/db.cpp35
-rw-r--r--src/wallet/db.h12
-rw-r--r--src/wallet/interfaces.cpp23
-rw-r--r--src/wallet/load.cpp14
-rw-r--r--src/wallet/migrate.h6
-rw-r--r--src/wallet/rpc/addresses.cpp7
-rw-r--r--src/wallet/rpc/backup.cpp203
-rw-r--r--src/wallet/rpc/coins.cpp8
-rw-r--r--src/wallet/rpc/spend.cpp38
-rw-r--r--src/wallet/rpc/transactions.cpp8
-rw-r--r--src/wallet/rpc/util.cpp2
-rw-r--r--src/wallet/rpc/wallet.cpp6
-rw-r--r--src/wallet/scriptpubkeyman.cpp93
-rw-r--r--src/wallet/scriptpubkeyman.h176
-rw-r--r--src/wallet/spend.cpp37
-rw-r--r--src/wallet/sqlite.cpp2
-rw-r--r--src/wallet/sqlite.h4
-rw-r--r--src/wallet/test/CMakeLists.txt32
-rw-r--r--src/wallet/test/coinselector_tests.cpp50
-rw-r--r--src/wallet/test/fuzz/CMakeLists.txt16
-rw-r--r--src/wallet/test/fuzz/coinselection.cpp23
-rw-r--r--src/wallet/test/fuzz/crypter.cpp47
-rw-r--r--src/wallet/test/fuzz/notifications.cpp2
-rw-r--r--src/wallet/test/fuzz/scriptpubkeyman.cpp64
-rw-r--r--src/wallet/test/fuzz/wallet_bdb_parser.cpp15
-rw-r--r--src/wallet/test/ismine_tests.cpp12
-rw-r--r--src/wallet/test/psbt_wallet_tests.cpp13
-rw-r--r--src/wallet/test/util.cpp7
-rw-r--r--src/wallet/test/util.h6
-rw-r--r--src/wallet/test/wallet_crypto_tests.cpp113
-rw-r--r--src/wallet/test/wallet_tests.cpp42
-rw-r--r--src/wallet/wallet.cpp201
-rw-r--r--src/wallet/wallet.h19
-rw-r--r--src/wallet/walletdb.cpp43
-rw-r--r--src/wallet/walletdb.h3
-rw-r--r--src/wallet/walletutil.cpp4
-rw-r--r--src/wallet/walletutil.h10
-rw-r--r--src/walletinitinterface.h2
-rw-r--r--src/zmq/CMakeLists.txt24
-rw-r--r--src/zmq/zmqnotificationinterface.cpp16
-rw-r--r--src/zmq/zmqpublishnotifier.cpp24
-rw-r--r--src/zmq/zmqutil.cpp2
670 files changed, 42536 insertions, 33103 deletions
diff --git a/src/.bear-tidy-config b/src/.bear-tidy-config
deleted file mode 100644
index 0ab30a8d9d..0000000000
--- a/src/.bear-tidy-config
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "output": {
- "content": {
- "include_only_existing_source": true,
- "paths_to_include": [],
- "paths_to_exclude": [
- "src/crc32c",
- "src/crypto/ctaes",
- "src/leveldb",
- "src/minisketch",
- "src/bench/nanobench.cpp",
- "src/bench/nanobench.h",
- "src/secp256k1"
- ]
- },
- "format": {
- "command_as_array": true,
- "drop_output_field": false
- }
- }
-}
diff --git a/src/.clang-tidy b/src/.clang-tidy
index 61adce1d50..1cf270833a 100644
--- a/src/.clang-tidy
+++ b/src/.clang-tidy
@@ -6,12 +6,15 @@ bugprone-move-forwarding-reference,
bugprone-string-constructor,
bugprone-use-after-move,
bugprone-lambda-function-name,
+bugprone-unhandled-self-assignment,
misc-unused-using-decls,
misc-no-recursion,
modernize-use-default-member-init,
modernize-use-emplace,
+modernize-use-equals-default,
modernize-use-noexcept,
modernize-use-nullptr,
+modernize-use-starts-ends-with,
performance-*,
-performance-avoid-endl,
-performance-enum-size,
@@ -23,8 +26,10 @@ readability-const-return-type,
readability-redundant-declaration,
readability-redundant-string-init,
'
+HeaderFilterRegex: '.'
WarningsAsErrors: '*'
CheckOptions:
- key: performance-move-const-arg.CheckTriviallyCopyableMove
value: false
-HeaderFilterRegex: '.'
+ - key: bugprone-unhandled-self-assignment.WarnOnlyIfThisHasSuspiciousField
+ value: false
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000000..d10638e887
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,454 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+include(GNUInstallDirs)
+include(AddWindowsResources)
+
+configure_file(${PROJECT_SOURCE_DIR}/cmake/bitcoin-config.h.in config/bitcoin-config.h USE_SOURCE_PERMISSIONS @ONLY)
+include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+
+add_custom_target(generate_build_info
+ BYPRODUCTS ${PROJECT_BINARY_DIR}/src/bitcoin-build-info.h
+ COMMAND ${CMAKE_COMMAND} -DBUILD_INFO_HEADER_PATH=${PROJECT_BINARY_DIR}/src/bitcoin-build-info.h -DSOURCE_DIR=${PROJECT_SOURCE_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateBuildInfo.cmake
+ COMMENT "Generating bitcoin-build-info.h"
+ VERBATIM
+)
+add_library(bitcoin_clientversion OBJECT EXCLUDE_FROM_ALL
+ clientversion.cpp
+)
+target_link_libraries(bitcoin_clientversion
+ PRIVATE
+ core_interface
+)
+add_dependencies(bitcoin_clientversion generate_build_info)
+
+add_subdirectory(crypto)
+add_subdirectory(univalue)
+add_subdirectory(util)
+if(WITH_MULTIPROCESS)
+ add_subdirectory(ipc)
+endif()
+
+#=============================
+# secp256k1 subtree
+#=============================
+message("")
+message("Configuring secp256k1 subtree...")
+set(SECP256K1_DISABLE_SHARED ON CACHE BOOL "" FORCE)
+set(SECP256K1_ENABLE_MODULE_ECDH OFF CACHE BOOL "" FORCE)
+set(SECP256K1_ENABLE_MODULE_RECOVERY ON CACHE BOOL "" FORCE)
+set(SECP256K1_BUILD_BENCHMARK OFF CACHE BOOL "" FORCE)
+set(SECP256K1_BUILD_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
+set(SECP256K1_BUILD_EXHAUSTIVE_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
+if(NOT BUILD_TESTS)
+ # Always skip the ctime tests, if we are building no other tests.
+ # Otherwise, they are built if Valgrind is available. See SECP256K1_VALGRIND.
+ set(SECP256K1_BUILD_CTIME_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
+endif()
+set(SECP256K1_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
+include(GetTargetInterface)
+# -fsanitize and related flags apply to both C++ and C,
+# so we can pass them down to libsecp256k1 as CFLAGS and LDFLAGS.
+get_target_interface(core_sanitizer_cxx_flags "" sanitize_interface COMPILE_OPTIONS)
+set(SECP256K1_APPEND_CFLAGS ${core_sanitizer_cxx_flags} CACHE STRING "" FORCE)
+unset(core_sanitizer_cxx_flags)
+get_target_interface(core_sanitizer_linker_flags "" sanitize_interface LINK_OPTIONS)
+set(SECP256K1_APPEND_LDFLAGS ${core_sanitizer_linker_flags} CACHE STRING "" FORCE)
+unset(core_sanitizer_linker_flags)
+# We want to build libsecp256k1 with the most tested RelWithDebInfo configuration.
+enable_language(C)
+foreach(config IN LISTS CMAKE_BUILD_TYPE CMAKE_CONFIGURATION_TYPES)
+ if(config STREQUAL "")
+ continue()
+ endif()
+ string(TOUPPER "${config}" config)
+ set(CMAKE_C_FLAGS_${config} "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+endforeach()
+# If the CFLAGS environment variable is defined during building depends
+# and configuring this build system, its content might be duplicated.
+if(DEFINED ENV{CFLAGS})
+ deduplicate_flags(CMAKE_C_FLAGS)
+endif()
+set(CMAKE_EXPORT_COMPILE_COMMANDS OFF)
+add_subdirectory(secp256k1)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+string(APPEND CMAKE_C_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CFLAGS}")
+
+add_library(bitcoin_consensus STATIC EXCLUDE_FROM_ALL
+ arith_uint256.cpp
+ consensus/merkle.cpp
+ consensus/tx_check.cpp
+ hash.cpp
+ primitives/block.cpp
+ primitives/transaction.cpp
+ pubkey.cpp
+ script/interpreter.cpp
+ script/script.cpp
+ script/script_error.cpp
+ uint256.cpp
+)
+target_link_libraries(bitcoin_consensus
+ PRIVATE
+ core_interface
+ bitcoin_crypto
+ secp256k1
+)
+
+if(WITH_ZMQ)
+ add_subdirectory(zmq)
+endif()
+
+# Home for common functionality shared by different executables and libraries.
+# Similar to `bitcoin_util` library, but higher-level.
+add_library(bitcoin_common STATIC EXCLUDE_FROM_ALL
+ addresstype.cpp
+ base58.cpp
+ bech32.cpp
+ chainparams.cpp
+ chainparamsbase.cpp
+ coins.cpp
+ common/args.cpp
+ common/bloom.cpp
+ common/config.cpp
+ common/init.cpp
+ common/interfaces.cpp
+ common/messages.cpp
+ common/netif.cpp
+ common/pcp.cpp
+ common/run_command.cpp
+ common/settings.cpp
+ common/signmessage.cpp
+ common/system.cpp
+ common/url.cpp
+ compressor.cpp
+ core_read.cpp
+ core_write.cpp
+ deploymentinfo.cpp
+ external_signer.cpp
+ init/common.cpp
+ kernel/chainparams.cpp
+ key.cpp
+ key_io.cpp
+ merkleblock.cpp
+ net_permissions.cpp
+ net_types.cpp
+ netaddress.cpp
+ netbase.cpp
+ outputtype.cpp
+ policy/feerate.cpp
+ policy/policy.cpp
+ protocol.cpp
+ psbt.cpp
+ rpc/external_signer.cpp
+ rpc/rawtransaction_util.cpp
+ rpc/request.cpp
+ rpc/util.cpp
+ scheduler.cpp
+ script/descriptor.cpp
+ script/miniscript.cpp
+ script/parsing.cpp
+ script/sign.cpp
+ script/signingprovider.cpp
+ script/solver.cpp
+)
+target_link_libraries(bitcoin_common
+ PRIVATE
+ core_interface
+ bitcoin_consensus
+ bitcoin_util
+ univalue
+ secp256k1
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:USDT::headers>
+ $<$<PLATFORM_ID:Windows>:ws2_32>
+)
+
+
+set(installable_targets)
+if(ENABLE_WALLET)
+ add_subdirectory(wallet)
+
+ if(BUILD_WALLET_TOOL)
+ add_executable(bitcoin-wallet
+ bitcoin-wallet.cpp
+ init/bitcoin-wallet.cpp
+ wallet/wallettool.cpp
+ )
+ add_windows_resources(bitcoin-wallet bitcoin-wallet-res.rc)
+ target_link_libraries(bitcoin-wallet
+ core_interface
+ bitcoin_wallet
+ bitcoin_common
+ bitcoin_util
+ Boost::headers
+ )
+ list(APPEND installable_targets bitcoin-wallet)
+ endif()
+endif()
+
+
+# P2P and RPC server functionality used by `bitcoind` and `bitcoin-qt` executables.
+add_library(bitcoin_node STATIC EXCLUDE_FROM_ALL
+ addrdb.cpp
+ addrman.cpp
+ banman.cpp
+ bip324.cpp
+ blockencodings.cpp
+ blockfilter.cpp
+ chain.cpp
+ consensus/tx_verify.cpp
+ dbwrapper.cpp
+ deploymentstatus.cpp
+ flatfile.cpp
+ headerssync.cpp
+ httprpc.cpp
+ httpserver.cpp
+ i2p.cpp
+ index/base.cpp
+ index/blockfilterindex.cpp
+ index/coinstatsindex.cpp
+ index/txindex.cpp
+ init.cpp
+ kernel/chain.cpp
+ kernel/checks.cpp
+ kernel/coinstats.cpp
+ kernel/context.cpp
+ kernel/cs_main.cpp
+ kernel/disconnected_transactions.cpp
+ kernel/mempool_removal_reason.cpp
+ mapport.cpp
+ net.cpp
+ net_processing.cpp
+ netgroup.cpp
+ node/abort.cpp
+ node/blockmanager_args.cpp
+ node/blockstorage.cpp
+ node/caches.cpp
+ node/chainstate.cpp
+ node/chainstatemanager_args.cpp
+ node/coin.cpp
+ node/coins_view_args.cpp
+ node/connection_types.cpp
+ node/context.cpp
+ node/database_args.cpp
+ node/eviction.cpp
+ node/interface_ui.cpp
+ node/interfaces.cpp
+ node/kernel_notifications.cpp
+ node/mempool_args.cpp
+ node/mempool_persist.cpp
+ node/mempool_persist_args.cpp
+ node/miner.cpp
+ node/mini_miner.cpp
+ node/minisketchwrapper.cpp
+ node/peerman_args.cpp
+ node/psbt.cpp
+ node/timeoffsets.cpp
+ node/transaction.cpp
+ node/txreconciliation.cpp
+ node/utxo_snapshot.cpp
+ node/warnings.cpp
+ noui.cpp
+ policy/fees.cpp
+ policy/fees_args.cpp
+ policy/packages.cpp
+ policy/rbf.cpp
+ policy/settings.cpp
+ policy/truc_policy.cpp
+ pow.cpp
+ rest.cpp
+ rpc/blockchain.cpp
+ rpc/fees.cpp
+ rpc/mempool.cpp
+ rpc/mining.cpp
+ rpc/net.cpp
+ rpc/node.cpp
+ rpc/output_script.cpp
+ rpc/rawtransaction.cpp
+ rpc/server.cpp
+ rpc/server_util.cpp
+ rpc/signmessage.cpp
+ rpc/txoutproof.cpp
+ script/sigcache.cpp
+ signet.cpp
+ torcontrol.cpp
+ txdb.cpp
+ txmempool.cpp
+ txorphanage.cpp
+ txrequest.cpp
+ validation.cpp
+ validationinterface.cpp
+ versionbits.cpp
+ $<$<TARGET_EXISTS:bitcoin_wallet>:wallet/init.cpp>
+ $<$<NOT:$<TARGET_EXISTS:bitcoin_wallet>>:dummywallet.cpp>
+)
+target_link_libraries(bitcoin_node
+ PRIVATE
+ core_interface
+ bitcoin_common
+ bitcoin_util
+ leveldb
+ minisketch
+ univalue
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:libevent::libevent>
+ $<TARGET_NAME_IF_EXISTS:libevent::pthreads>
+ $<TARGET_NAME_IF_EXISTS:MiniUPnPc::MiniUPnPc>
+ $<TARGET_NAME_IF_EXISTS:bitcoin_zmq>
+ $<TARGET_NAME_IF_EXISTS:USDT::headers>
+)
+
+
+# Bitcoin Core bitcoind.
+if(BUILD_DAEMON)
+ add_executable(bitcoind
+ bitcoind.cpp
+ init/bitcoind.cpp
+ )
+ add_windows_resources(bitcoind bitcoind-res.rc)
+ target_link_libraries(bitcoind
+ core_interface
+ bitcoin_node
+ $<TARGET_NAME_IF_EXISTS:bitcoin_wallet>
+ )
+ list(APPEND installable_targets bitcoind)
+endif()
+if(WITH_MULTIPROCESS)
+ add_executable(bitcoin-node
+ bitcoind.cpp
+ init/bitcoin-node.cpp
+ )
+ target_link_libraries(bitcoin-node
+ core_interface
+ bitcoin_node
+ bitcoin_ipc
+ $<TARGET_NAME_IF_EXISTS:bitcoin_wallet>
+ )
+ list(APPEND installable_targets bitcoin-node)
+
+ if(BUILD_TESTS)
+ # bitcoin_ipc_test library target is defined here in src/CMakeLists.txt
+ # instead of src/test/CMakeLists.txt so capnp files in src/test/ are able to
+ # reference capnp files in src/ipc/capnp/ by relative path. The Cap'n Proto
+ # compiler only allows importing by relative path when the importing and
+ # imported files are underneath the same compilation source prefix, so the
+ # source prefix must be src/, not src/test/
+ add_library(bitcoin_ipc_test STATIC EXCLUDE_FROM_ALL
+ test/ipc_test.cpp
+ )
+ target_capnp_sources(bitcoin_ipc_test ${PROJECT_SOURCE_DIR}
+ test/ipc_test.capnp
+ )
+ add_dependencies(bitcoin_ipc_test bitcoin_ipc_headers)
+ endif()
+endif()
+
+
+add_library(bitcoin_cli STATIC EXCLUDE_FROM_ALL
+ compat/stdin.cpp
+ rpc/client.cpp
+)
+target_link_libraries(bitcoin_cli
+ PUBLIC
+ core_interface
+ univalue
+)
+
+
+# Bitcoin Core RPC client
+if(BUILD_CLI)
+ add_executable(bitcoin-cli bitcoin-cli.cpp)
+ add_windows_resources(bitcoin-cli bitcoin-cli-res.rc)
+ target_link_libraries(bitcoin-cli
+ core_interface
+ bitcoin_cli
+ bitcoin_common
+ bitcoin_util
+ $<TARGET_NAME_IF_EXISTS:libevent::libevent>
+ )
+ list(APPEND installable_targets bitcoin-cli)
+endif()
+
+
+if(BUILD_TX)
+ add_executable(bitcoin-tx bitcoin-tx.cpp)
+ add_windows_resources(bitcoin-tx bitcoin-tx-res.rc)
+ target_link_libraries(bitcoin-tx
+ core_interface
+ bitcoin_common
+ bitcoin_util
+ univalue
+ )
+ list(APPEND installable_targets bitcoin-tx)
+endif()
+
+
+if(BUILD_UTIL)
+ add_executable(bitcoin-util bitcoin-util.cpp)
+ add_windows_resources(bitcoin-util bitcoin-util-res.rc)
+ target_link_libraries(bitcoin-util
+ core_interface
+ bitcoin_common
+ bitcoin_util
+ )
+ list(APPEND installable_targets bitcoin-util)
+endif()
+
+
+if(BUILD_GUI)
+ add_subdirectory(qt)
+endif()
+
+
+if(BUILD_KERNEL_LIB)
+ add_subdirectory(kernel)
+endif()
+
+if(BUILD_UTIL_CHAINSTATE)
+ add_executable(bitcoin-chainstate
+ bitcoin-chainstate.cpp
+ )
+ # TODO: The `SKIP_BUILD_RPATH` property setting can be deleted
+ # in the future after reordering Guix script commands to
+ # perform binary checks after the installation step.
+ # Relevant discussions:
+ # - https://github.com/hebasto/bitcoin/pull/236#issuecomment-2183120953
+ # - https://github.com/bitcoin/bitcoin/pull/30312#issuecomment-2191235833
+ set_target_properties(bitcoin-chainstate PROPERTIES
+ SKIP_BUILD_RPATH OFF
+ )
+ target_link_libraries(bitcoin-chainstate
+ PRIVATE
+ core_interface
+ bitcoinkernel
+ )
+endif()
+
+
+add_subdirectory(test/util)
+if(BUILD_BENCH)
+ add_subdirectory(bench)
+endif()
+
+if(BUILD_TESTS)
+ add_subdirectory(test)
+endif()
+
+if(BUILD_FUZZ_BINARY)
+ add_subdirectory(test/fuzz)
+endif()
+
+
+install(TARGETS ${installable_targets}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+unset(installable_targets)
+
+if(INSTALL_MAN)
+ # TODO: these stubs are no longer needed. man pages should be generated at install time.
+ install(DIRECTORY ../doc/man/
+ DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
+ FILES_MATCHING PATTERN *.1
+ )
+endif()
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644
index 0c47a737d0..0000000000
--- a/src/Makefile.am
+++ /dev/null
@@ -1,1138 +0,0 @@
-# Copyright (c) 2013-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-# Pattern rule to print variables, e.g. make print-top_srcdir
-print-%: FORCE
- @echo '$*'='$($*)'
-
-DIST_SUBDIRS = secp256k1
-
-AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS)
-AM_CXXFLAGS = $(CORE_CXXFLAGS) $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_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)
-EXTRA_LIBRARIES =
-
-lib_LTLIBRARIES =
-noinst_LTLIBRARIES =
-
-bin_PROGRAMS =
-noinst_PROGRAMS =
-check_PROGRAMS =
-TESTS =
-BENCHMARKS =
-
-BITCOIN_INCLUDES=-I$(builddir) -I$(srcdir)/$(MINISKETCH_INCLUDE_DIR_INT) -I$(srcdir)/secp256k1/include -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT)
-
-LIBBITCOIN_NODE=libbitcoin_node.a
-LIBBITCOIN_COMMON=libbitcoin_common.a
-LIBBITCOIN_CONSENSUS=libbitcoin_consensus.a
-LIBBITCOIN_CLI=libbitcoin_cli.a
-LIBBITCOIN_UTIL=libbitcoin_util.a
-LIBBITCOIN_CRYPTO_BASE=crypto/libbitcoin_crypto_base.la
-LIBBITCOINQT=qt/libbitcoinqt.a
-LIBSECP256K1=secp256k1/libsecp256k1.la
-
-if ENABLE_ZMQ
-LIBBITCOIN_ZMQ=libbitcoin_zmq.a
-endif
-if BUILD_BITCOIN_KERNEL_LIB
-LIBBITCOINKERNEL=libbitcoinkernel.la
-endif
-if ENABLE_WALLET
-LIBBITCOIN_WALLET=libbitcoin_wallet.a
-LIBBITCOIN_WALLET_TOOL=libbitcoin_wallet_tool.a
-endif
-
-LIBBITCOIN_CRYPTO = $(LIBBITCOIN_CRYPTO_BASE)
-if ENABLE_SSE41
-LIBBITCOIN_CRYPTO_SSE41 = crypto/libbitcoin_crypto_sse41.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_SSE41)
-endif
-if ENABLE_AVX2
-LIBBITCOIN_CRYPTO_AVX2 = crypto/libbitcoin_crypto_avx2.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_AVX2)
-endif
-if ENABLE_X86_SHANI
-LIBBITCOIN_CRYPTO_X86_SHANI = crypto/libbitcoin_crypto_x86_shani.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_X86_SHANI)
-endif
-if ENABLE_ARM_SHANI
-LIBBITCOIN_CRYPTO_ARM_SHANI = crypto/libbitcoin_crypto_arm_shani.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_ARM_SHANI)
-endif
-noinst_LTLIBRARIES += $(LIBBITCOIN_CRYPTO)
-
-$(LIBSECP256K1): $(wildcard secp256k1/src/*.h) $(wildcard secp256k1/src/*.c) $(wildcard secp256k1/include/*)
- $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F)
-
-# Make is not made aware of per-object dependencies to avoid limiting building parallelization
-# But to build the less dependent modules first, we manually select their order here:
-EXTRA_LIBRARIES += \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_NODE) \
- $(LIBBITCOIN_CLI) \
- $(LIBBITCOIN_IPC) \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_WALLET_TOOL) \
- $(LIBBITCOIN_ZMQ)
-
-if BUILD_BITCOIND
- bin_PROGRAMS += bitcoind
-endif
-
-if BUILD_BITCOIN_NODE
- bin_PROGRAMS += bitcoin-node
-endif
-
-if BUILD_BITCOIN_CLI
- bin_PROGRAMS += bitcoin-cli
-endif
-
-if BUILD_BITCOIN_TX
- bin_PROGRAMS += bitcoin-tx
-endif
-
-if ENABLE_WALLET
-if BUILD_BITCOIN_WALLET
- bin_PROGRAMS += bitcoin-wallet
-endif
-endif
-
-if BUILD_BITCOIN_UTIL
- bin_PROGRAMS += bitcoin-util
-endif
-
-if BUILD_BITCOIN_CHAINSTATE
- bin_PROGRAMS += bitcoin-chainstate
-endif
-
-.PHONY: FORCE check-symbols check-security
-# bitcoin core #
-BITCOIN_CORE_H = \
- addresstype.h \
- addrdb.h \
- addrman.h \
- addrman_impl.h \
- attributes.h \
- banman.h \
- base58.h \
- bech32.h \
- bip324.h \
- blockencodings.h \
- blockfilter.h \
- chain.h \
- chainparams.h \
- chainparamsbase.h \
- chainparamsseeds.h \
- checkqueue.h \
- clientversion.h \
- coins.h \
- common/args.h \
- common/bloom.h \
- common/init.h \
- common/run_command.h \
- common/types.h \
- common/url.h \
- compat/assumptions.h \
- compat/byteswap.h \
- compat/compat.h \
- compat/cpuid.h \
- compat/endian.h \
- common/messages.h \
- common/settings.h \
- common/signmessage.h \
- common/system.h \
- compressor.h \
- consensus/consensus.h \
- consensus/tx_check.h \
- consensus/tx_verify.h \
- core_io.h \
- core_memusage.h \
- cuckoocache.h \
- dbwrapper.h \
- deploymentinfo.h \
- deploymentstatus.h \
- external_signer.h \
- flatfile.h \
- headerssync.h \
- httprpc.h \
- httpserver.h \
- i2p.h \
- index/base.h \
- index/blockfilterindex.h \
- index/coinstatsindex.h \
- index/disktxpos.h \
- index/txindex.h \
- indirectmap.h \
- init.h \
- init/common.h \
- interfaces/chain.h \
- interfaces/echo.h \
- interfaces/handler.h \
- interfaces/init.h \
- interfaces/ipc.h \
- interfaces/mining.h \
- interfaces/node.h \
- interfaces/wallet.h \
- kernel/blockmanager_opts.h \
- kernel/chain.h \
- kernel/chainparams.h \
- kernel/chainstatemanager_opts.h \
- kernel/checks.h \
- kernel/coinstats.h \
- kernel/context.h \
- kernel/cs_main.h \
- kernel/disconnected_transactions.h \
- kernel/mempool_entry.h \
- kernel/mempool_limits.h \
- kernel/mempool_options.h \
- kernel/mempool_persist.h \
- kernel/mempool_removal_reason.h \
- kernel/messagestartchars.h \
- kernel/notifications_interface.h \
- kernel/validation_cache_sizes.h \
- kernel/warning.h \
- key.h \
- key_io.h \
- logging.h \
- logging/timer.h \
- mapport.h \
- memusage.h \
- merkleblock.h \
- net.h \
- net_permissions.h \
- net_processing.h \
- net_types.h \
- netaddress.h \
- netbase.h \
- netgroup.h \
- netmessagemaker.h \
- node/abort.h \
- node/blockmanager_args.h \
- node/blockstorage.h \
- node/caches.h \
- node/chainstate.h \
- node/chainstatemanager_args.h \
- node/coin.h \
- node/coins_view_args.h \
- node/connection_types.h \
- node/context.h \
- node/database_args.h \
- node/eviction.h \
- node/interface_ui.h \
- node/kernel_notifications.h \
- node/mempool_args.h \
- node/mempool_persist_args.h \
- node/miner.h \
- node/mini_miner.h \
- node/minisketchwrapper.h \
- node/peerman_args.h \
- node/protocol_version.h \
- node/psbt.h \
- node/timeoffsets.h \
- node/transaction.h \
- node/txreconciliation.h \
- node/types.h \
- node/utxo_snapshot.h \
- node/validation_cache_args.h \
- node/warnings.h \
- noui.h \
- outputtype.h \
- policy/v3_policy.h \
- policy/feerate.h \
- policy/fees.h \
- policy/fees_args.h \
- policy/packages.h \
- policy/policy.h \
- policy/rbf.h \
- policy/settings.h \
- pow.h \
- protocol.h \
- psbt.h \
- random.h \
- randomenv.h \
- rest.h \
- reverse_iterator.h \
- rpc/blockchain.h \
- rpc/client.h \
- rpc/mempool.h \
- rpc/mining.h \
- rpc/protocol.h \
- rpc/rawtransaction_util.h \
- rpc/register.h \
- rpc/request.h \
- rpc/server.h \
- rpc/server_util.h \
- rpc/util.h \
- scheduler.h \
- script/descriptor.h \
- script/keyorigin.h \
- script/miniscript.h \
- script/parsing.h \
- script/sigcache.h \
- script/sign.h \
- script/signingprovider.h \
- script/solver.h \
- signet.h \
- streams.h \
- support/allocators/pool.h \
- support/allocators/secure.h \
- support/allocators/zeroafterfree.h \
- support/cleanse.h \
- support/events.h \
- support/lockedpool.h \
- sync.h \
- threadsafety.h \
- torcontrol.h \
- txdb.h \
- txmempool.h \
- txorphanage.h \
- txrequest.h \
- undo.h \
- util/any.h \
- util/asmap.h \
- util/batchpriority.h \
- util/bip32.h \
- util/bitdeque.h \
- util/bitset.h \
- util/bytevectorhash.h \
- util/chaintype.h \
- util/check.h \
- util/epochguard.h \
- util/exception.h \
- util/fastrange.h \
- util/feefrac.h \
- util/fs.h \
- util/fs_helpers.h \
- util/golombrice.h \
- util/hash_type.h \
- util/hasher.h \
- util/insert.h \
- util/macros.h \
- util/moneystr.h \
- util/overflow.h \
- util/overloaded.h \
- util/rbf.h \
- util/readwritefile.h \
- util/result.h \
- util/serfloat.h \
- util/signalinterrupt.h \
- util/sock.h \
- util/strencodings.h \
- util/string.h \
- util/subprocess.h \
- util/syserror.h \
- util/task_runner.h \
- util/thread.h \
- util/threadinterrupt.h \
- util/threadnames.h \
- util/time.h \
- util/tokenpipe.h \
- util/trace.h \
- util/transaction_identifier.h \
- util/translation.h \
- util/types.h \
- util/ui_change_type.h \
- util/vecdeque.h \
- util/vector.h \
- validation.h \
- validationinterface.h \
- versionbits.h \
- wallet/bdb.h \
- wallet/coincontrol.h \
- wallet/coinselection.h \
- wallet/context.h \
- wallet/crypter.h \
- wallet/db.h \
- wallet/dump.h \
- wallet/external_signer_scriptpubkeyman.h \
- wallet/feebumper.h \
- wallet/fees.h \
- wallet/load.h \
- wallet/migrate.h \
- wallet/receive.h \
- wallet/rpc/util.h \
- wallet/rpc/wallet.h \
- wallet/salvage.h \
- wallet/scriptpubkeyman.h \
- wallet/spend.h \
- wallet/sqlite.h \
- wallet/transaction.h \
- wallet/types.h \
- wallet/wallet.h \
- wallet/walletdb.h \
- wallet/wallettool.h \
- wallet/walletutil.h \
- walletinitinterface.h \
- zmq/zmqabstractnotifier.h \
- zmq/zmqnotificationinterface.h \
- zmq/zmqpublishnotifier.h \
- zmq/zmqrpc.h \
- zmq/zmqutil.h
-
-
-obj/build.h: FORCE
- @$(MKDIR_P) $(builddir)/obj
- $(AM_V_GEN) $(top_srcdir)/share/genbuild.sh "$(abs_top_builddir)/src/obj/build.h" \
- "$(abs_top_srcdir)"
-libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h
-
-# node #
-libbitcoin_node_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(LEVELDB_CPPFLAGS) $(BOOST_CPPFLAGS) $(MINIUPNPC_CPPFLAGS) $(NATPMP_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS)
-libbitcoin_node_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_node_a_SOURCES = \
- addrdb.cpp \
- addrman.cpp \
- banman.cpp \
- bip324.cpp \
- blockencodings.cpp \
- blockfilter.cpp \
- chain.cpp \
- consensus/tx_verify.cpp \
- dbwrapper.cpp \
- deploymentstatus.cpp \
- flatfile.cpp \
- headerssync.cpp \
- httprpc.cpp \
- httpserver.cpp \
- i2p.cpp \
- index/base.cpp \
- index/blockfilterindex.cpp \
- index/coinstatsindex.cpp \
- index/txindex.cpp \
- init.cpp \
- kernel/chain.cpp \
- kernel/checks.cpp \
- kernel/coinstats.cpp \
- kernel/context.cpp \
- kernel/cs_main.cpp \
- kernel/disconnected_transactions.cpp \
- kernel/mempool_persist.cpp \
- kernel/mempool_removal_reason.cpp \
- mapport.cpp \
- net.cpp \
- net_processing.cpp \
- netgroup.cpp \
- node/abort.cpp \
- node/blockmanager_args.cpp \
- node/blockstorage.cpp \
- node/caches.cpp \
- node/chainstate.cpp \
- node/chainstatemanager_args.cpp \
- node/coin.cpp \
- node/coins_view_args.cpp \
- node/connection_types.cpp \
- node/context.cpp \
- node/database_args.cpp \
- node/eviction.cpp \
- node/interface_ui.cpp \
- node/interfaces.cpp \
- node/kernel_notifications.cpp \
- node/mempool_args.cpp \
- node/mempool_persist_args.cpp \
- node/miner.cpp \
- node/mini_miner.cpp \
- node/minisketchwrapper.cpp \
- node/peerman_args.cpp \
- node/psbt.cpp \
- node/timeoffsets.cpp \
- node/transaction.cpp \
- node/txreconciliation.cpp \
- node/utxo_snapshot.cpp \
- node/validation_cache_args.cpp \
- node/warnings.cpp \
- noui.cpp \
- policy/v3_policy.cpp \
- policy/fees.cpp \
- policy/fees_args.cpp \
- policy/packages.cpp \
- policy/rbf.cpp \
- policy/settings.cpp \
- pow.cpp \
- rest.cpp \
- rpc/blockchain.cpp \
- rpc/fees.cpp \
- rpc/mempool.cpp \
- rpc/mining.cpp \
- rpc/net.cpp \
- rpc/node.cpp \
- rpc/output_script.cpp \
- rpc/rawtransaction.cpp \
- rpc/server.cpp \
- rpc/server_util.cpp \
- rpc/signmessage.cpp \
- rpc/txoutproof.cpp \
- script/sigcache.cpp \
- signet.cpp \
- torcontrol.cpp \
- txdb.cpp \
- txmempool.cpp \
- txorphanage.cpp \
- txrequest.cpp \
- validation.cpp \
- validationinterface.cpp \
- versionbits.cpp \
- $(BITCOIN_CORE_H)
-
-if ENABLE_WALLET
-libbitcoin_node_a_SOURCES += wallet/init.cpp
-libbitcoin_node_a_CPPFLAGS += $(BDB_CPPFLAGS)
-endif
-if !ENABLE_WALLET
-libbitcoin_node_a_SOURCES += dummywallet.cpp
-endif
-#
-
-# zmq #
-if ENABLE_ZMQ
-libbitcoin_zmq_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(ZMQ_CFLAGS)
-libbitcoin_zmq_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_zmq_a_SOURCES = \
- zmq/zmqabstractnotifier.cpp \
- zmq/zmqnotificationinterface.cpp \
- zmq/zmqpublishnotifier.cpp \
- zmq/zmqrpc.cpp \
- zmq/zmqutil.cpp
-endif
-#
-
-# wallet #
-libbitcoin_wallet_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(BDB_CPPFLAGS) $(SQLITE_CFLAGS)
-libbitcoin_wallet_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_wallet_a_SOURCES = \
- wallet/coincontrol.cpp \
- wallet/context.cpp \
- wallet/crypter.cpp \
- wallet/db.cpp \
- wallet/dump.cpp \
- wallet/external_signer_scriptpubkeyman.cpp \
- wallet/feebumper.cpp \
- wallet/fees.cpp \
- wallet/interfaces.cpp \
- wallet/load.cpp \
- wallet/migrate.cpp \
- wallet/receive.cpp \
- wallet/rpc/addresses.cpp \
- wallet/rpc/backup.cpp \
- wallet/rpc/coins.cpp \
- wallet/rpc/encrypt.cpp \
- wallet/rpc/spend.cpp \
- wallet/rpc/signmessage.cpp \
- wallet/rpc/transactions.cpp \
- wallet/rpc/util.cpp \
- wallet/rpc/wallet.cpp \
- wallet/scriptpubkeyman.cpp \
- wallet/spend.cpp \
- wallet/transaction.cpp \
- wallet/wallet.cpp \
- wallet/walletdb.cpp \
- wallet/walletutil.cpp \
- wallet/coinselection.cpp \
- $(BITCOIN_CORE_H)
-
-if USE_SQLITE
-libbitcoin_wallet_a_SOURCES += wallet/sqlite.cpp
-endif
-if USE_BDB
-libbitcoin_wallet_a_SOURCES += wallet/bdb.cpp wallet/salvage.cpp
-endif
-#
-
-# wallet tool #
-libbitcoin_wallet_tool_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libbitcoin_wallet_tool_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_wallet_tool_a_SOURCES = \
- wallet/wallettool.cpp \
- $(BITCOIN_CORE_H)
-#
-
-# 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
-# static version of this library. We don't need a dynamic version, and a dynamic
-# version can't be used on windows anyway because the library doesn't currently
-# export DLL symbols.
-crypto_libbitcoin_crypto_base_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_base_la_LDFLAGS = $(AM_LDFLAGS) -static
-
-crypto_libbitcoin_crypto_base_la_SOURCES = \
- crypto/aes.cpp \
- crypto/aes.h \
- crypto/chacha20.h \
- crypto/chacha20.cpp \
- crypto/chacha20poly1305.h \
- crypto/chacha20poly1305.cpp \
- crypto/common.h \
- crypto/hex_base.cpp \
- crypto/hex_base.h \
- crypto/hkdf_sha256_32.cpp \
- crypto/hkdf_sha256_32.h \
- crypto/hmac_sha256.cpp \
- crypto/hmac_sha256.h \
- crypto/hmac_sha512.cpp \
- crypto/hmac_sha512.h \
- crypto/poly1305.h \
- crypto/poly1305.cpp \
- crypto/muhash.h \
- crypto/muhash.cpp \
- crypto/ripemd160.cpp \
- crypto/ripemd160.h \
- crypto/sha1.cpp \
- crypto/sha1.h \
- crypto/sha256.cpp \
- crypto/sha256.h \
- crypto/sha256_sse4.cpp \
- crypto/sha3.cpp \
- crypto/sha3.h \
- crypto/sha512.cpp \
- crypto/sha512.h \
- crypto/siphash.cpp \
- crypto/siphash.h \
- support/cleanse.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
-crypto_libbitcoin_crypto_sse41_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_sse41_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_sse41_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_sse41_la_CXXFLAGS += $(SSE41_CXXFLAGS)
-crypto_libbitcoin_crypto_sse41_la_CPPFLAGS += -DENABLE_SSE41
-crypto_libbitcoin_crypto_sse41_la_SOURCES = crypto/sha256_sse41.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
-crypto_libbitcoin_crypto_avx2_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_avx2_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_avx2_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_avx2_la_CXXFLAGS += $(AVX2_CXXFLAGS)
-crypto_libbitcoin_crypto_avx2_la_CPPFLAGS += -DENABLE_AVX2
-crypto_libbitcoin_crypto_avx2_la_SOURCES = crypto/sha256_avx2.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
-crypto_libbitcoin_crypto_x86_shani_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_x86_shani_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_x86_shani_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_x86_shani_la_CXXFLAGS += $(X86_SHANI_CXXFLAGS)
-crypto_libbitcoin_crypto_x86_shani_la_CPPFLAGS += -DENABLE_X86_SHANI
-crypto_libbitcoin_crypto_x86_shani_la_SOURCES = crypto/sha256_x86_shani.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
-crypto_libbitcoin_crypto_arm_shani_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_arm_shani_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_arm_shani_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_arm_shani_la_CXXFLAGS += $(ARM_SHANI_CXXFLAGS)
-crypto_libbitcoin_crypto_arm_shani_la_CPPFLAGS += -DENABLE_ARM_SHANI
-crypto_libbitcoin_crypto_arm_shani_la_SOURCES = crypto/sha256_arm_shani.cpp
-#
-
-# consensus #
-libbitcoin_consensus_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-libbitcoin_consensus_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_consensus_a_SOURCES = \
- arith_uint256.cpp \
- arith_uint256.h \
- consensus/amount.h \
- consensus/merkle.cpp \
- consensus/merkle.h \
- consensus/params.h \
- consensus/tx_check.cpp \
- consensus/validation.h \
- hash.cpp \
- hash.h \
- prevector.h \
- primitives/block.cpp \
- primitives/block.h \
- primitives/transaction.cpp \
- primitives/transaction.h \
- pubkey.cpp \
- pubkey.h \
- script/interpreter.cpp \
- script/interpreter.h \
- script/script.cpp \
- script/script.h \
- script/script_error.cpp \
- script/script_error.h \
- serialize.h \
- span.h \
- tinyformat.h \
- uint256.cpp \
- uint256.h
-#
-
-# common #
-libbitcoin_common_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libbitcoin_common_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_common_a_SOURCES = \
- addresstype.cpp \
- base58.cpp \
- bech32.cpp \
- chainparamsbase.cpp \
- chainparams.cpp \
- coins.cpp \
- common/args.cpp \
- common/bloom.cpp \
- common/config.cpp \
- common/init.cpp \
- common/interfaces.cpp \
- common/messages.cpp \
- common/run_command.cpp \
- common/settings.cpp \
- common/signmessage.cpp \
- common/system.cpp \
- common/url.cpp \
- compressor.cpp \
- core_read.cpp \
- core_write.cpp \
- deploymentinfo.cpp \
- external_signer.cpp \
- init/common.cpp \
- kernel/chainparams.cpp \
- key.cpp \
- key_io.cpp \
- merkleblock.cpp \
- net_types.cpp \
- netaddress.cpp \
- netbase.cpp \
- net_permissions.cpp \
- outputtype.cpp \
- policy/v3_policy.cpp \
- policy/feerate.cpp \
- policy/policy.cpp \
- protocol.cpp \
- psbt.cpp \
- rpc/external_signer.cpp \
- rpc/rawtransaction_util.cpp \
- rpc/request.cpp \
- rpc/util.cpp \
- scheduler.cpp \
- script/descriptor.cpp \
- script/miniscript.cpp \
- script/parsing.cpp \
- script/sign.cpp \
- script/signingprovider.cpp \
- script/solver.cpp \
- $(BITCOIN_CORE_H)
-#
-
-# util #
-libbitcoin_util_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-libbitcoin_util_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_util_a_SOURCES = \
- support/lockedpool.cpp \
- clientversion.cpp \
- logging.cpp \
- random.cpp \
- randomenv.cpp \
- streams.cpp \
- sync.cpp \
- util/asmap.cpp \
- util/batchpriority.cpp \
- util/bip32.cpp \
- util/bytevectorhash.cpp \
- util/chaintype.cpp \
- util/check.cpp \
- util/exception.cpp \
- util/feefrac.cpp \
- util/fs.cpp \
- util/fs_helpers.cpp \
- util/hasher.cpp \
- util/sock.cpp \
- util/syserror.cpp \
- util/moneystr.cpp \
- util/rbf.cpp \
- util/readwritefile.cpp \
- util/signalinterrupt.cpp \
- util/thread.cpp \
- util/threadinterrupt.cpp \
- util/threadnames.cpp \
- util/serfloat.cpp \
- util/strencodings.cpp \
- util/string.cpp \
- util/time.cpp \
- util/tokenpipe.cpp \
- $(BITCOIN_CORE_H)
-#
-
-# cli #
-libbitcoin_cli_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-libbitcoin_cli_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libbitcoin_cli_a_SOURCES = \
- compat/stdin.h \
- compat/stdin.cpp \
- rpc/client.cpp \
- $(BITCOIN_CORE_H)
-
-nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h
-#
-
-# bitcoind & bitcoin-node binaries #
-bitcoin_daemon_sources = bitcoind.cpp
-bitcoin_bin_cppflags = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-bitcoin_bin_cxxflags = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bitcoin_bin_ldflags = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-if TARGET_WINDOWS
-bitcoin_daemon_sources += bitcoind-res.rc
-endif
-
-bitcoin_bin_ldadd = \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_ZMQ) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBLEVELDB) \
- $(LIBMEMENV) \
- $(LIBSECP256K1)
-
-bitcoin_bin_ldadd += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(SQLITE_LIBS)
-
-bitcoind_SOURCES = $(bitcoin_daemon_sources) init/bitcoind.cpp
-bitcoind_CPPFLAGS = $(bitcoin_bin_cppflags)
-bitcoind_CXXFLAGS = $(bitcoin_bin_cxxflags)
-bitcoind_LDFLAGS = $(bitcoin_bin_ldflags)
-bitcoind_LDADD = $(LIBBITCOIN_NODE) $(bitcoin_bin_ldadd)
-
-bitcoin_node_SOURCES = $(bitcoin_daemon_sources) init/bitcoin-node.cpp
-bitcoin_node_CPPFLAGS = $(bitcoin_bin_cppflags)
-bitcoin_node_CXXFLAGS = $(bitcoin_bin_cxxflags)
-bitcoin_node_LDFLAGS = $(bitcoin_bin_ldflags)
-bitcoin_node_LDADD = $(LIBBITCOIN_NODE) $(bitcoin_bin_ldadd) $(LIBBITCOIN_IPC) $(LIBMULTIPROCESS_LIBS)
-
-# bitcoin-cli binary #
-bitcoin_cli_SOURCES = bitcoin-cli.cpp
-bitcoin_cli_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS)
-bitcoin_cli_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-if TARGET_WINDOWS
-bitcoin_cli_SOURCES += bitcoin-cli-res.rc
-endif
-
-bitcoin_cli_LDADD = \
- $(LIBBITCOIN_CLI) \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CRYPTO)
-
-bitcoin_cli_LDADD += $(EVENT_LIBS)
-#
-
-# bitcoin-tx binary #
-bitcoin_tx_SOURCES = bitcoin-tx.cpp
-bitcoin_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-bitcoin_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-if TARGET_WINDOWS
-bitcoin_tx_SOURCES += bitcoin-tx-res.rc
-endif
-
-bitcoin_tx_LDADD = \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBSECP256K1)
-#
-
-# bitcoin-wallet binary #
-bitcoin_wallet_SOURCES = bitcoin-wallet.cpp
-bitcoin_wallet_SOURCES += init/bitcoin-wallet.cpp
-bitcoin_wallet_CPPFLAGS = $(bitcoin_bin_cppflags)
-bitcoin_wallet_CXXFLAGS = $(bitcoin_bin_cxxflags)
-bitcoin_wallet_LDFLAGS = $(bitcoin_bin_ldflags)
-bitcoin_wallet_LDADD = \
- $(LIBBITCOIN_WALLET_TOOL) \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBSECP256K1) \
- $(BDB_LIBS) \
- $(SQLITE_LIBS)
-
-if TARGET_WINDOWS
-bitcoin_wallet_SOURCES += bitcoin-wallet-res.rc
-endif
-#
-
-# bitcoin-util binary #
-bitcoin_util_SOURCES = bitcoin-util.cpp
-bitcoin_util_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
-bitcoin_util_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bitcoin_util_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-if TARGET_WINDOWS
-bitcoin_util_SOURCES += bitcoin-util-res.rc
-endif
-
-bitcoin_util_LDADD = \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBUNIVALUE) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBSECP256K1)
-#
-
-# bitcoin-chainstate binary #
-bitcoin_chainstate_SOURCES = bitcoin-chainstate.cpp
-bitcoin_chainstate_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-bitcoin_chainstate_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-
-bitcoin_chainstate_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(PTHREAD_FLAGS) $(LIBTOOL_APP_LDFLAGS) -static
-bitcoin_chainstate_LDADD = $(LIBBITCOINKERNEL)
-
-# libtool is unable to calculate this indirect dependency, presumably because it's a subproject.
-# libsecp256k1 only needs to be linked in when libbitcoinkernel is static.
-bitcoin_chainstate_LDADD += $(LIBSECP256K1)
-#
-
-# bitcoinkernel library #
-if BUILD_BITCOIN_KERNEL_LIB
-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 $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS)
-
-# libbitcoinkernel requires default symbol visibility, explicitly specify that
-# here so that things still work even when user configures with
-# --enable-reduce-exports
-#
-# Note this is a quick hack that will be removed as we incrementally define what
-# to export from the library.
-libbitcoinkernel_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -fvisibility=default
-
-# TODO: libbitcoinkernel is a work in progress consensus engine library, as more
-# and more modules are decoupled from the consensus engine, this list will
-# shrink to only those which are absolutely necessary.
-libbitcoinkernel_la_SOURCES = \
- kernel/bitcoinkernel.cpp \
- arith_uint256.cpp \
- chain.cpp \
- clientversion.cpp \
- coins.cpp \
- compressor.cpp \
- consensus/merkle.cpp \
- consensus/tx_check.cpp \
- consensus/tx_verify.cpp \
- core_read.cpp \
- dbwrapper.cpp \
- deploymentinfo.cpp \
- deploymentstatus.cpp \
- flatfile.cpp \
- hash.cpp \
- kernel/chain.cpp \
- kernel/checks.cpp \
- kernel/chainparams.cpp \
- kernel/coinstats.cpp \
- kernel/context.cpp \
- kernel/cs_main.cpp \
- kernel/disconnected_transactions.cpp \
- kernel/mempool_persist.cpp \
- kernel/mempool_removal_reason.cpp \
- logging.cpp \
- node/blockstorage.cpp \
- node/chainstate.cpp \
- node/utxo_snapshot.cpp \
- policy/v3_policy.cpp \
- policy/feerate.cpp \
- policy/packages.cpp \
- policy/policy.cpp \
- policy/rbf.cpp \
- policy/settings.cpp \
- pow.cpp \
- primitives/block.cpp \
- primitives/transaction.cpp \
- pubkey.cpp \
- random.cpp \
- randomenv.cpp \
- script/interpreter.cpp \
- script/script.cpp \
- script/script_error.cpp \
- script/sigcache.cpp \
- script/solver.cpp \
- signet.cpp \
- streams.cpp \
- support/lockedpool.cpp \
- sync.cpp \
- txdb.cpp \
- txmempool.cpp \
- uint256.cpp \
- util/chaintype.cpp \
- util/check.cpp \
- util/feefrac.cpp \
- util/fs.cpp \
- util/fs_helpers.cpp \
- util/hasher.cpp \
- util/moneystr.cpp \
- util/rbf.cpp \
- util/serfloat.cpp \
- util/signalinterrupt.cpp \
- util/strencodings.cpp \
- util/string.cpp \
- util/syserror.cpp \
- util/threadnames.cpp \
- util/time.cpp \
- util/tokenpipe.cpp \
- validation.cpp \
- validationinterface.cpp \
- versionbits.cpp
-
-# Required for obj/build.h to be generated first.
-# More details: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html
-libbitcoinkernel_la-clientversion.l$(OBJEXT): obj/build.h
-endif # BUILD_BITCOIN_KERNEL_LIB
-#
-
-CTAES_DIST = crypto/ctaes/bench.c
-CTAES_DIST += crypto/ctaes/ctaes.c
-CTAES_DIST += crypto/ctaes/ctaes.h
-CTAES_DIST += crypto/ctaes/README.md
-CTAES_DIST += crypto/ctaes/test.c
-
-CLEANFILES = $(EXTRA_LIBRARIES)
-
-CLEANFILES += *.gcda *.gcno
-CLEANFILES += compat/*.gcda compat/*.gcno
-CLEANFILES += consensus/*.gcda consensus/*.gcno
-CLEANFILES += crc32c/src/*.gcda crc32c/src/*.gcno
-CLEANFILES += crypto/*.gcda crypto/*.gcno
-CLEANFILES += index/*.gcda index/*.gcno
-CLEANFILES += interfaces/*.gcda interfaces/*.gcno
-CLEANFILES += node/*.gcda node/*.gcno
-CLEANFILES += policy/*.gcda policy/*.gcno
-CLEANFILES += primitives/*.gcda primitives/*.gcno
-CLEANFILES += rpc/*.gcda rpc/*.gcno
-CLEANFILES += script/*.gcda script/*.gcno
-CLEANFILES += support/*.gcda support/*.gcno
-CLEANFILES += univalue/*.gcda univalue/*.gcno
-CLEANFILES += util/*.gcda util/*.gcno
-CLEANFILES += wallet/*.gcda wallet/*.gcno
-CLEANFILES += wallet/test/*.gcda wallet/test/*.gcno
-CLEANFILES += zmq/*.gcda zmq/*.gcno
-CLEANFILES += obj/build.h
-
-EXTRA_DIST = $(CTAES_DIST)
-
-
-config/bitcoin-config.h: config/stamp-h1
- @$(MAKE) -C $(top_builddir) $(subdir)/$(@)
-config/stamp-h1: $(top_srcdir)/$(subdir)/config/bitcoin-config.h.in $(top_builddir)/config.status
- $(AM_V_at)$(MAKE) -C $(top_builddir) $(subdir)/$(@)
-$(top_srcdir)/$(subdir)/config/bitcoin-config.h.in: $(am__configure_deps)
- $(AM_V_at)$(MAKE) -C $(top_srcdir) $(subdir)/config/bitcoin-config.h.in
-
-clean-local:
- -$(MAKE) -C secp256k1 clean
- -rm -f leveldb/*/*.gcda leveldb/*/*.gcno leveldb/helpers/memenv/*.gcda leveldb/helpers/memenv/*.gcno
- -rm -f config.h
- -rm -rf test/__pycache__
-
-.rc.o:
- @test -f $(WINDRES) || (echo "windres $(WINDRES) not found, but is required to compile windows resource files"; exit 1)
- ## FIXME: How to get the appropriate modulename_CPPFLAGS in here?
- $(AM_V_GEN) $(WINDRES) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) -DWINDRES_PREPROC -i $< -o $@
-
-check-symbols: $(bin_PROGRAMS)
- @echo "Running symbol and dynamic library checks..."
- $(AM_V_at) $(PYTHON) $(top_srcdir)/contrib/devtools/symbol-check.py $(bin_PROGRAMS)
-
-check-security: $(bin_PROGRAMS)
-if HARDEN
- @echo "Checking binary security..."
- $(AM_V_at) $(PYTHON) $(top_srcdir)/contrib/devtools/security-check.py $(bin_PROGRAMS)
-endif
-
-libbitcoin_ipc_mpgen_input = \
- ipc/capnp/echo.capnp \
- ipc/capnp/init.capnp
-EXTRA_DIST += $(libbitcoin_ipc_mpgen_input)
-%.capnp:
-
-# 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
-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 \
- ipc/capnp/protocol.h \
- ipc/context.h \
- ipc/exception.h \
- ipc/interfaces.cpp \
- ipc/process.cpp \
- ipc/process.h \
- ipc/protocol.h
-libbitcoin_ipc_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libbitcoin_ipc_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) $(LIBMULTIPROCESS_CFLAGS)
-
-include $(MPGEN_PREFIX)/include/mpgen.mk
-libbitcoin_ipc_mpgen_output = \
- $(libbitcoin_ipc_mpgen_input:=.c++) \
- $(libbitcoin_ipc_mpgen_input:=.h) \
- $(libbitcoin_ipc_mpgen_input:=.proxy-client.c++) \
- $(libbitcoin_ipc_mpgen_input:=.proxy-server.c++) \
- $(libbitcoin_ipc_mpgen_input:=.proxy-types.c++) \
- $(libbitcoin_ipc_mpgen_input:=.proxy-types.h) \
- $(libbitcoin_ipc_mpgen_input:=.proxy.h)
-nodist_libbitcoin_ipc_a_SOURCES = $(libbitcoin_ipc_mpgen_output)
-CLEANFILES += $(libbitcoin_ipc_mpgen_output)
-endif
-
-%.raw.h: %.raw
- @$(MKDIR_P) $(@D)
- $(AM_V_GEN) { \
- echo "static unsigned const char $(*F)_raw[] = {" && \
- $(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' && \
- echo "};"; \
- } > "$@.new" && mv -f "$@.new" "$@"
-
-include Makefile.minisketch.include
-
-include Makefile.crc32c.include
-include Makefile.leveldb.include
-
-include Makefile.test_util.include
-include Makefile.test_fuzz.include
-
-include Makefile.test.include
-
-if ENABLE_BENCH
-include Makefile.bench.include
-endif
-
-if ENABLE_QT
-include Makefile.qt.include
-endif
-
-if ENABLE_QT_TESTS
-include Makefile.qttest.include
-endif
-
-include Makefile.univalue.include
diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
deleted file mode 100644
index 2ba72c9e76..0000000000
--- a/src/Makefile.bench.include
+++ /dev/null
@@ -1,111 +0,0 @@
-# Copyright (c) 2015-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-bin_PROGRAMS += bench/bench_bitcoin
-BENCH_SRCDIR = bench
-BENCH_BINARY = bench/bench_bitcoin$(EXEEXT)
-
-RAW_BENCH_FILES = \
- bench/data/block413567.raw
-GENERATED_BENCH_FILES = $(RAW_BENCH_FILES:.raw=.raw.h)
-
-bench_bench_bitcoin_SOURCES = \
- $(RAW_BENCH_FILES) \
- bench/addrman.cpp \
- bench/base58.cpp \
- bench/bech32.cpp \
- bench/bench.cpp \
- bench/bench.h \
- bench/bench_bitcoin.cpp \
- bench/bip324_ecdh.cpp \
- bench/block_assemble.cpp \
- bench/ccoins_caching.cpp \
- bench/chacha20.cpp \
- bench/checkblock.cpp \
- bench/checkblockindex.cpp \
- bench/checkqueue.cpp \
- bench/crypto_hash.cpp \
- bench/data.cpp \
- bench/data.h \
- bench/descriptors.cpp \
- bench/disconnected_transactions.cpp \
- bench/duplicate_inputs.cpp \
- bench/ellswift.cpp \
- bench/examples.cpp \
- bench/gcs_filter.cpp \
- bench/hashpadding.cpp \
- bench/index_blockfilter.cpp \
- bench/load_external.cpp \
- bench/lockedpool.cpp \
- bench/logging.cpp \
- bench/mempool_eviction.cpp \
- bench/mempool_stress.cpp \
- bench/merkle_root.cpp \
- bench/nanobench.cpp \
- bench/nanobench.h \
- bench/parse_hex.cpp \
- bench/peer_eviction.cpp \
- bench/poly1305.cpp \
- bench/pool.cpp \
- bench/prevector.cpp \
- bench/readblock.cpp \
- bench/rollingbloom.cpp \
- bench/rpc_blockchain.cpp \
- bench/rpc_mempool.cpp \
- bench/streams_findbyte.cpp \
- bench/strencodings.cpp \
- bench/util_time.cpp \
- bench/verify_script.cpp \
- bench/xor.cpp
-
-nodist_bench_bench_bitcoin_SOURCES = $(GENERATED_BENCH_FILES)
-
-bench_bench_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/
-bench_bench_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-bench_bench_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-bench_bench_bitcoin_LDADD = \
- $(LIBTEST_UTIL) \
- $(LIBBITCOIN_NODE) \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBLEVELDB) \
- $(LIBMEMENV) \
- $(LIBSECP256K1) \
- $(LIBUNIVALUE) \
- $(EVENT_PTHREADS_LIBS) \
- $(EVENT_LIBS) \
- $(MINIUPNPC_LIBS) \
- $(NATPMP_LIBS)
-
-if ENABLE_ZMQ
-bench_bench_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-
-if ENABLE_WALLET
-bench_bench_bitcoin_SOURCES += bench/coin_selection.cpp
-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
-
-CLEAN_BITCOIN_BENCH = bench/*.gcda bench/*.gcno $(GENERATED_BENCH_FILES)
-
-CLEANFILES += $(CLEAN_BITCOIN_BENCH)
-
-bench/data.cpp: bench/data/block413567.raw.h
-
-bitcoin_bench: $(BENCH_BINARY)
-
-bench: $(BENCH_BINARY) FORCE
- $(BENCH_BINARY)
-
-bitcoin_bench_clean : FORCE
- rm -f $(CLEAN_BITCOIN_BENCH) $(bench_bench_bitcoin_OBJECTS) $(BENCH_BINARY)
diff --git a/src/Makefile.crc32c.include b/src/Makefile.crc32c.include
deleted file mode 100644
index c4dd84991d..0000000000
--- a/src/Makefile.crc32c.include
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright (c) 2019 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-LIBCRC32C_INT = crc32c/libcrc32c.la
-
-noinst_LTLIBRARIES += $(LIBCRC32C_INT)
-
-LIBCRC32C = $(LIBCRC32C_INT)
-
-CRC32C_CPPFLAGS_INT =
-CRC32C_CPPFLAGS_INT += -I$(srcdir)/crc32c/include
-CRC32C_CPPFLAGS_INT += -DHAVE_BUILTIN_PREFETCH=@HAVE_BUILTIN_PREFETCH@
-CRC32C_CPPFLAGS_INT += -DHAVE_MM_PREFETCH=@HAVE_MM_PREFETCH@
-CRC32C_CPPFLAGS_INT += -DHAVE_STRONG_GETAUXVAL=@HAVE_STRONG_GETAUXVAL@
-CRC32C_CPPFLAGS_INT += -DCRC32C_TESTS_BUILT_WITH_GLOG=0
-
-if ENABLE_SSE42
-CRC32C_CPPFLAGS_INT += -DHAVE_SSE42=1
-else
-CRC32C_CPPFLAGS_INT += -DHAVE_SSE42=0
-endif
-
-if ENABLE_ARM_CRC
-CRC32C_CPPFLAGS_INT += -DHAVE_ARM64_CRC32C=1
-else
-CRC32C_CPPFLAGS_INT += -DHAVE_ARM64_CRC32C=0
-endif
-
-if WORDS_BIGENDIAN
-CRC32C_CPPFLAGS_INT += -DBYTE_ORDER_BIG_ENDIAN=1
-else
-CRC32C_CPPFLAGS_INT += -DBYTE_ORDER_BIG_ENDIAN=0
-endif
-
-crc32c_libcrc32c_la_CPPFLAGS = $(AM_CPPFLAGS) $(CRC32C_CPPFLAGS_INT) $(CRC32C_CPPFLAGS)
-
-# Specify -static in both CXXFLAGS and LDFLAGS so libtool will only build a
-# static version of this library. We don't need a dynamic version, and a dynamic
-# version can't be used on windows anyway because the library doesn't currently
-# export DLL symbols.
-crc32c_libcrc32c_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crc32c_libcrc32c_la_LDFLAGS = $(AM_LDFLAGS) -static
-
-crc32c_libcrc32c_la_SOURCES =
-crc32c_libcrc32c_la_SOURCES += crc32c/include/crc32c/crc32c.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_arm64.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_arm64_check.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_internal.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_prefetch.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_read_le.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_round_up.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_sse42_check.h
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_sse42.h
-
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c.cc
-crc32c_libcrc32c_la_SOURCES += crc32c/src/crc32c_portable.cc
-
-if ENABLE_SSE42
-LIBCRC32C_SSE42_INT = crc32c/libcrc32c_sse42.la
-noinst_LTLIBRARIES += $(LIBCRC32C_SSE42_INT)
-LIBCRC32C += $(LIBCRC32C_SSE42_INT)
-
-crc32c_libcrc32c_sse42_la_CPPFLAGS = $(crc32c_libcrc32c_la_CPPFLAGS)
-crc32c_libcrc32c_sse42_la_CXXFLAGS = $(crc32c_libcrc32c_la_CXXFLAGS) $(SSE42_CXXFLAGS)
-crc32c_libcrc32c_sse42_la_LDFLAGS = $(crc32c_libcrc32c_la_LDFLAGS)
-
-crc32c_libcrc32c_sse42_la_SOURCES = crc32c/src/crc32c_sse42.cc
-endif
-
-if ENABLE_ARM_CRC
-LIBCRC32C_ARM_CRC_INT = crc32c/libcrc32c_arm_crc.la
-noinst_LTLIBRARIES += $(LIBCRC32C_ARM_CRC_INT)
-LIBCRC32C += $(LIBCRC32C_ARM_CRC_INT)
-
-crc32c_libcrc32c_arm_crc_la_CPPFLAGS = $(crc32c_libcrc32c_la_CPPFLAGS)
-crc32c_libcrc32c_arm_crc_la_CXXFLAGS = $(crc32c_libcrc32c_la_CXXFLAGS) $(ARM_CRC_CXXFLAGS)
-crc32c_libcrc32c_arm_crc_la_LDFLAGS = $(crc32c_libcrc32c_la_LDFLAGS)
-
-crc32c_libcrc32c_arm_crc_la_SOURCES = crc32c/src/crc32c_arm64.cc
-endif
diff --git a/src/Makefile.leveldb.include b/src/Makefile.leveldb.include
deleted file mode 100644
index bf14fe206b..0000000000
--- a/src/Makefile.leveldb.include
+++ /dev/null
@@ -1,153 +0,0 @@
-# Copyright (c) 2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-LIBLEVELDB_INT = leveldb/libleveldb.la
-LIBMEMENV_INT = leveldb/libmemenv.la
-
-noinst_LTLIBRARIES += $(LIBLEVELDB_INT)
-noinst_LTLIBRARIES += $(LIBMEMENV_INT)
-
-LIBLEVELDB = $(LIBLEVELDB_INT) $(LIBCRC32C)
-LIBMEMENV = $(LIBMEMENV_INT)
-
-LEVELDB_CPPFLAGS =
-LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include
-
-LEVELDB_CPPFLAGS_INT =
-LEVELDB_CPPFLAGS_INT += -I$(srcdir)/leveldb
-LEVELDB_CPPFLAGS_INT += -I$(srcdir)/crc32c/include
-LEVELDB_CPPFLAGS_INT += -D__STDC_LIMIT_MACROS
-LEVELDB_CPPFLAGS_INT += -DHAVE_SNAPPY=0 -DHAVE_CRC32C=1
-LEVELDB_CPPFLAGS_INT += -DHAVE_FDATASYNC=@HAVE_FDATASYNC@
-LEVELDB_CPPFLAGS_INT += -DHAVE_FULLFSYNC=@HAVE_FULLFSYNC@
-LEVELDB_CPPFLAGS_INT += -DHAVE_O_CLOEXEC=@HAVE_O_CLOEXEC@
-LEVELDB_CPPFLAGS_INT += -DFALLTHROUGH_INTENDED=[[fallthrough]]
-
-if WORDS_BIGENDIAN
-LEVELDB_CPPFLAGS_INT += -DLEVELDB_IS_BIG_ENDIAN=1
-else
-LEVELDB_CPPFLAGS_INT += -DLEVELDB_IS_BIG_ENDIAN=0
-endif
-
-if TARGET_WINDOWS
-LEVELDB_CPPFLAGS_INT += -DLEVELDB_PLATFORM_WINDOWS -D_UNICODE -DUNICODE -D__USE_MINGW_ANSI_STDIO=1
-else
-LEVELDB_CPPFLAGS_INT += -DLEVELDB_PLATFORM_POSIX
-endif
-
-leveldb_libleveldb_la_CPPFLAGS = $(AM_CPPFLAGS) $(LEVELDB_CPPFLAGS_INT) $(LEVELDB_CPPFLAGS)
-
-# Specify -static in both CXXFLAGS and LDFLAGS so libtool will only build a
-# static version of this library. We don't need a dynamic version, and a dynamic
-# version can't be used on windows anyway because the library doesn't currently
-# export DLL symbols.
-leveldb_libleveldb_la_CXXFLAGS = $(filter-out -Wconditional-uninitialized -Werror=conditional-uninitialized -Wsuggest-override -Werror=suggest-override, $(AM_CXXFLAGS)) $(PIE_FLAGS) -static
-leveldb_libleveldb_la_LDFLAGS = $(AM_LDFLAGS) -static
-
-leveldb_libleveldb_la_SOURCES=
-leveldb_libleveldb_la_SOURCES += leveldb/port/port_stdcxx.h
-leveldb_libleveldb_la_SOURCES += leveldb/port/port.h
-leveldb_libleveldb_la_SOURCES += leveldb/port/thread_annotations.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/db.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/options.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/comparator.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/filter_policy.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/slice.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/table_builder.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/env.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/export.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/c.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/iterator.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/cache.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/dumpfile.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/table.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/write_batch.h
-leveldb_libleveldb_la_SOURCES += leveldb/include/leveldb/status.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_format.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/memtable.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/version_set.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/write_batch_internal.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/filename.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/version_edit.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/dbformat.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/builder.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_writer.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/db_iter.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/skiplist.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/db_impl.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/table_cache.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/snapshot.h
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_reader.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/filter_block.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/block_builder.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/block.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/two_level_iterator.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/merger.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/format.h
-leveldb_libleveldb_la_SOURCES += leveldb/table/iterator_wrapper.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/crc32c.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/env_posix_test_helper.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/env_windows_test_helper.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/arena.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/random.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/posix_logger.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/hash.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/histogram.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/coding.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/testutil.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/mutexlock.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/logging.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/no_destructor.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/testharness.h
-leveldb_libleveldb_la_SOURCES += leveldb/util/windows_logger.h
-
-leveldb_libleveldb_la_SOURCES += leveldb/db/builder.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/c.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/dbformat.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/db_impl.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/db_iter.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/dumpfile.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/filename.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_reader.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/log_writer.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/memtable.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/repair.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/table_cache.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/version_edit.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/version_set.cc
-leveldb_libleveldb_la_SOURCES += leveldb/db/write_batch.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/block_builder.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/block.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/filter_block.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/format.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/iterator.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/merger.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/table_builder.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/table.cc
-leveldb_libleveldb_la_SOURCES += leveldb/table/two_level_iterator.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/arena.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/bloom.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/cache.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/coding.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/comparator.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/crc32c.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/env.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/filter_policy.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/hash.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/histogram.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/logging.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/options.cc
-leveldb_libleveldb_la_SOURCES += leveldb/util/status.cc
-
-if TARGET_WINDOWS
-leveldb_libleveldb_la_SOURCES += leveldb/util/env_windows.cc
-else
-leveldb_libleveldb_la_SOURCES += leveldb/util/env_posix.cc
-endif
-
-leveldb_libmemenv_la_CPPFLAGS = $(leveldb_libleveldb_la_CPPFLAGS)
-leveldb_libmemenv_la_CXXFLAGS = $(leveldb_libleveldb_la_CXXFLAGS)
-leveldb_libmemenv_la_LDFLAGS = $(leveldb_libleveldb_la_LDFLAGS)
-leveldb_libmemenv_la_SOURCES = leveldb/helpers/memenv/memenv.cc
-leveldb_libmemenv_la_SOURCES += leveldb/helpers/memenv/memenv.h
diff --git a/src/Makefile.minisketch.include b/src/Makefile.minisketch.include
deleted file mode 100644
index c6f894f0ca..0000000000
--- a/src/Makefile.minisketch.include
+++ /dev/null
@@ -1,39 +0,0 @@
-include minisketch/sources.mk
-
-LIBMINISKETCH_CPPFLAGS=
-LIBMINISKETCH_CPPFLAGS += -DDISABLE_DEFAULT_FIELDS -DENABLE_FIELD_32
-
-LIBMINISKETCH = minisketch/libminisketch.a
-MINISKETCH_LIBS = $(LIBMINISKETCH)
-
-if ENABLE_CLMUL
-LIBMINISKETCH_CLMUL = minisketch/libminisketch_clmul.a
-LIBMINISKETCH_CPPFLAGS += -DHAVE_CLMUL
-MINISKETCH_LIBS += $(LIBMINISKETCH_CLMUL)
-endif
-
-EXTRA_LIBRARIES += $(MINISKETCH_LIBS)
-
-minisketch_libminisketch_clmul_a_SOURCES = $(MINISKETCH_FIELD_CLMUL_SOURCES_INT) $(MINISKETCH_FIELD_CLMUL_HEADERS_INT)
-minisketch_libminisketch_clmul_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) $(CLMUL_CXXFLAGS)
-minisketch_libminisketch_clmul_a_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMINISKETCH_CPPFLAGS)
-
-minisketch_libminisketch_a_SOURCES = $(MINISKETCH_FIELD_GENERIC_SOURCES_INT) $(MINISKETCH_LIB_SOURCES_INT)
-minisketch_libminisketch_a_SOURCES += $(MINISKETCH_FIELD_GENERIC_HEADERS_INT) $(MINISKETCH_LIB_HEADERS_INT) $(MINISKETCH_DIST_HEADERS_INT)
-minisketch_libminisketch_a_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMINISKETCH_CPPFLAGS)
-minisketch_libminisketch_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-
-if ENABLE_TESTS
-if !ENABLE_FUZZ
-MINISKETCH_TEST = minisketch/test
-TESTS += $(MINISKETCH_TEST)
-check_PROGRAMS += $(MINISKETCH_TEST)
-
-minisketch_test_SOURCES = $(MINISKETCH_TEST_SOURCES_INT)
-minisketch_test_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMINISKETCH_CPPFLAGS)
-minisketch_test_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-minisketch_test_LDADD = $(MINISKETCH_LIBS)
-minisketch_test_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-
-endif
-endif
diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
deleted file mode 100644
index 1ac6b74688..0000000000
--- a/src/Makefile.qt.include
+++ /dev/null
@@ -1,409 +0,0 @@
-# Copyright (c) 2013-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-bin_PROGRAMS += qt/bitcoin-qt
-
-if BUILD_BITCOIN_GUI
- bin_PROGRAMS += bitcoin-gui
-endif
-
-EXTRA_LIBRARIES += qt/libbitcoinqt.a
-
-# bitcoin qt core #
-include Makefile.qt_locale.include
-
-QT_FORMS_UI = \
- qt/forms/addressbookpage.ui \
- qt/forms/askpassphrasedialog.ui \
- qt/forms/coincontroldialog.ui \
- qt/forms/createwalletdialog.ui \
- qt/forms/editaddressdialog.ui \
- qt/forms/helpmessagedialog.ui \
- qt/forms/intro.ui \
- qt/forms/modaloverlay.ui \
- qt/forms/openuridialog.ui \
- qt/forms/optionsdialog.ui \
- qt/forms/overviewpage.ui \
- qt/forms/psbtoperationsdialog.ui \
- qt/forms/receivecoinsdialog.ui \
- qt/forms/receiverequestdialog.ui \
- qt/forms/debugwindow.ui \
- qt/forms/sendcoinsdialog.ui \
- qt/forms/sendcoinsentry.ui \
- qt/forms/signverifymessagedialog.ui \
- qt/forms/transactiondescdialog.ui
-
-QT_MOC_CPP = \
- qt/moc_addressbookpage.cpp \
- qt/moc_addresstablemodel.cpp \
- qt/moc_askpassphrasedialog.cpp \
- qt/moc_createwalletdialog.cpp \
- qt/moc_bantablemodel.cpp \
- qt/moc_bitcoin.cpp \
- qt/moc_bitcoinaddressvalidator.cpp \
- qt/moc_bitcoinamountfield.cpp \
- qt/moc_bitcoingui.cpp \
- qt/moc_bitcoinunits.cpp \
- qt/moc_clientmodel.cpp \
- qt/moc_coincontroldialog.cpp \
- qt/moc_coincontroltreewidget.cpp \
- qt/moc_csvmodelwriter.cpp \
- qt/moc_editaddressdialog.cpp \
- qt/moc_guiutil.cpp \
- qt/moc_initexecutor.cpp \
- qt/moc_intro.cpp \
- qt/moc_macdockiconhandler.cpp \
- qt/moc_macnotificationhandler.cpp \
- qt/moc_modaloverlay.cpp \
- qt/moc_notificator.cpp \
- qt/moc_openuridialog.cpp \
- qt/moc_optionsdialog.cpp \
- qt/moc_optionsmodel.cpp \
- qt/moc_overviewpage.cpp \
- qt/moc_peertablemodel.cpp \
- qt/moc_peertablesortproxy.cpp \
- qt/moc_paymentserver.cpp \
- qt/moc_psbtoperationsdialog.cpp \
- qt/moc_qrimagewidget.cpp \
- qt/moc_qvalidatedlineedit.cpp \
- qt/moc_qvaluecombobox.cpp \
- qt/moc_receivecoinsdialog.cpp \
- qt/moc_receiverequestdialog.cpp \
- qt/moc_recentrequeststablemodel.cpp \
- qt/moc_rpcconsole.cpp \
- qt/moc_sendcoinsdialog.cpp \
- qt/moc_sendcoinsentry.cpp \
- qt/moc_signverifymessagedialog.cpp \
- qt/moc_splashscreen.cpp \
- qt/moc_trafficgraphwidget.cpp \
- qt/moc_transactiondesc.cpp \
- qt/moc_transactiondescdialog.cpp \
- qt/moc_transactionfilterproxy.cpp \
- qt/moc_transactionoverviewwidget.cpp \
- qt/moc_transactiontablemodel.cpp \
- qt/moc_transactionview.cpp \
- qt/moc_utilitydialog.cpp \
- qt/moc_walletcontroller.cpp \
- qt/moc_walletframe.cpp \
- qt/moc_walletmodel.cpp \
- qt/moc_walletview.cpp
-
-BITCOIN_MM = \
- qt/macdockiconhandler.mm \
- qt/macnotificationhandler.mm \
- qt/macos_appnap.mm
-
-QT_MOC = \
- qt/bitcoinamountfield.moc \
- qt/intro.moc \
- qt/overviewpage.moc \
- qt/rpcconsole.moc
-
-QT_QRC_CPP = qt/qrc_bitcoin.cpp
-QT_QRC = qt/bitcoin.qrc
-QT_QRC_LOCALE_CPP = qt/qrc_bitcoin_locale.cpp
-QT_QRC_LOCALE = qt/bitcoin_locale.qrc
-
-BITCOIN_QT_H = \
- qt/addressbookpage.h \
- qt/addresstablemodel.h \
- qt/askpassphrasedialog.h \
- qt/bantablemodel.h \
- qt/bitcoin.h \
- qt/bitcoinaddressvalidator.h \
- qt/bitcoinamountfield.h \
- qt/bitcoingui.h \
- qt/bitcoinunits.h \
- qt/clientmodel.h \
- qt/coincontroldialog.h \
- qt/coincontroltreewidget.h \
- qt/createwalletdialog.h \
- qt/csvmodelwriter.h \
- qt/editaddressdialog.h \
- qt/guiconstants.h \
- qt/guiutil.h \
- qt/initexecutor.h \
- qt/intro.h \
- qt/macdockiconhandler.h \
- qt/macnotificationhandler.h \
- qt/macos_appnap.h \
- qt/modaloverlay.h \
- qt/networkstyle.h \
- qt/notificator.h \
- qt/openuridialog.h \
- qt/optionsdialog.h \
- qt/optionsmodel.h \
- qt/overviewpage.h \
- qt/paymentserver.h \
- qt/peertablemodel.h \
- qt/peertablesortproxy.h \
- qt/platformstyle.h \
- qt/psbtoperationsdialog.h \
- qt/qrimagewidget.h \
- qt/qvalidatedlineedit.h \
- qt/qvaluecombobox.h \
- qt/receivecoinsdialog.h \
- qt/receiverequestdialog.h \
- qt/recentrequeststablemodel.h \
- qt/rpcconsole.h \
- qt/sendcoinsdialog.h \
- qt/sendcoinsentry.h \
- qt/sendcoinsrecipient.h \
- qt/signverifymessagedialog.h \
- qt/splashscreen.h \
- qt/trafficgraphwidget.h \
- qt/transactiondesc.h \
- qt/transactiondescdialog.h \
- qt/transactionfilterproxy.h \
- qt/transactionoverviewwidget.h \
- qt/transactionrecord.h \
- qt/transactiontablemodel.h \
- qt/transactionview.h \
- qt/utilitydialog.h \
- qt/walletcontroller.h \
- qt/walletframe.h \
- qt/walletmodel.h \
- qt/walletmodeltransaction.h \
- qt/walletview.h \
- qt/winshutdownmonitor.h
-
-QT_RES_FONTS = \
- qt/res/fonts/RobotoMono-Bold.ttf
-
-QT_RES_ICONS = \
- qt/res/icons/add.png \
- qt/res/icons/address-book.png \
- qt/res/icons/bitcoin.ico \
- qt/res/icons/bitcoin_testnet.ico \
- qt/res/icons/bitcoin.png \
- qt/res/icons/chevron.png \
- qt/res/icons/clock1.png \
- qt/res/icons/clock2.png \
- qt/res/icons/clock3.png \
- qt/res/icons/clock4.png \
- qt/res/icons/clock5.png \
- qt/res/icons/connect0.png \
- qt/res/icons/connect1.png \
- qt/res/icons/connect2.png \
- qt/res/icons/connect3.png \
- qt/res/icons/connect4.png \
- qt/res/icons/edit.png \
- qt/res/icons/editcopy.png \
- qt/res/icons/editpaste.png \
- qt/res/icons/export.png \
- qt/res/icons/eye.png \
- qt/res/icons/eye_minus.png \
- qt/res/icons/eye_plus.png \
- qt/res/icons/fontbigger.png \
- qt/res/icons/fontsmaller.png \
- qt/res/icons/hd_disabled.png \
- qt/res/icons/hd_enabled.png \
- qt/res/icons/history.png \
- qt/res/icons/lock_closed.png \
- qt/res/icons/lock_open.png \
- qt/res/icons/network_disabled.png \
- qt/res/icons/overview.png \
- qt/res/icons/proxy.png \
- qt/res/icons/receive.png \
- qt/res/icons/remove.png \
- qt/res/icons/send.png \
- qt/res/icons/synced.png \
- qt/res/icons/transaction0.png \
- qt/res/icons/transaction2.png \
- qt/res/icons/transaction_abandoned.png \
- qt/res/icons/transaction_conflicted.png \
- qt/res/icons/tx_inout.png \
- qt/res/icons/tx_input.png \
- qt/res/icons/tx_output.png \
- qt/res/icons/tx_mined.png \
- qt/res/icons/warning.png
-
-BITCOIN_QT_BASE_CPP = \
- qt/bantablemodel.cpp \
- qt/bitcoin.cpp \
- qt/bitcoinaddressvalidator.cpp \
- qt/bitcoinamountfield.cpp \
- qt/bitcoingui.cpp \
- qt/bitcoinunits.cpp \
- qt/clientmodel.cpp \
- qt/csvmodelwriter.cpp \
- qt/guiutil.cpp \
- qt/initexecutor.cpp \
- qt/intro.cpp \
- qt/modaloverlay.cpp \
- qt/networkstyle.cpp \
- qt/notificator.cpp \
- qt/optionsdialog.cpp \
- qt/optionsmodel.cpp \
- qt/peertablemodel.cpp \
- qt/peertablesortproxy.cpp \
- qt/platformstyle.cpp \
- qt/qvalidatedlineedit.cpp \
- qt/qvaluecombobox.cpp \
- qt/rpcconsole.cpp \
- qt/splashscreen.cpp \
- qt/trafficgraphwidget.cpp \
- qt/utilitydialog.cpp
-
-BITCOIN_QT_WINDOWS_CPP = qt/winshutdownmonitor.cpp
-
-BITCOIN_QT_WALLET_CPP = \
- qt/addressbookpage.cpp \
- qt/addresstablemodel.cpp \
- qt/askpassphrasedialog.cpp \
- qt/coincontroldialog.cpp \
- qt/coincontroltreewidget.cpp \
- qt/createwalletdialog.cpp \
- qt/editaddressdialog.cpp \
- qt/openuridialog.cpp \
- qt/overviewpage.cpp \
- qt/paymentserver.cpp \
- qt/psbtoperationsdialog.cpp \
- qt/qrimagewidget.cpp \
- qt/receivecoinsdialog.cpp \
- qt/receiverequestdialog.cpp \
- qt/recentrequeststablemodel.cpp \
- qt/sendcoinsdialog.cpp \
- qt/sendcoinsentry.cpp \
- qt/signverifymessagedialog.cpp \
- qt/transactiondesc.cpp \
- qt/transactiondescdialog.cpp \
- qt/transactionfilterproxy.cpp \
- qt/transactionoverviewwidget.cpp \
- qt/transactionrecord.cpp \
- qt/transactiontablemodel.cpp \
- qt/transactionview.cpp \
- qt/walletcontroller.cpp \
- qt/walletframe.cpp \
- qt/walletmodel.cpp \
- qt/walletmodeltransaction.cpp \
- qt/walletview.cpp
-
-BITCOIN_QT_CPP = $(BITCOIN_QT_BASE_CPP)
-if TARGET_WINDOWS
-BITCOIN_QT_CPP += $(BITCOIN_QT_WINDOWS_CPP)
-endif
-if ENABLE_WALLET
-BITCOIN_QT_CPP += $(BITCOIN_QT_WALLET_CPP)
-endif # ENABLE_WALLET
-
-QT_RES_ANIMATION = $(wildcard $(srcdir)/qt/res/animation/spinner-*.png)
-
-BITCOIN_QT_RC = qt/res/bitcoin-qt-res.rc
-
-BITCOIN_QT_INCLUDES = -DQT_NO_KEYWORDS -DQT_USE_QSTRINGBUILDER
-
-qt_libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
- $(QT_INCLUDES) $(QT_DBUS_INCLUDES) $(QR_CFLAGS) $(BOOST_CPPFLAGS)
-qt_libbitcoinqt_a_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
-qt_libbitcoinqt_a_OBJCXXFLAGS = $(AM_OBJCXXFLAGS) $(QT_PIE_FLAGS)
-
-qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \
- $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(QT_RES_FONTS) $(QT_RES_ICONS) $(QT_RES_ANIMATION)
-if TARGET_DARWIN
- qt_libbitcoinqt_a_SOURCES += $(BITCOIN_MM)
-endif
-
-nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP)
-
-# forms/foo.h -> forms/ui_foo.h
-QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h))))
-
-# Most files will depend on the forms and moc files as includes. Generate them
-# before anything else.
-$(QT_MOC): $(QT_FORMS_H)
-$(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) $(bitcoin_gui_OBJECTS) : | $(QT_MOC)
-
-# bitcoin-qt and bitcoin-gui binaries #
-bitcoin_qt_cppflags = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
- $(QT_INCLUDES) $(QR_CFLAGS)
-bitcoin_qt_cxxflags = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
-
-bitcoin_qt_sources = qt/main.cpp
-if TARGET_WINDOWS
- bitcoin_qt_sources += $(BITCOIN_QT_RC)
-endif
-bitcoin_qt_ldadd = qt/libbitcoinqt.a $(LIBBITCOIN_NODE)
-if ENABLE_WALLET
-bitcoin_qt_ldadd += $(LIBBITCOIN_UTIL) $(LIBBITCOIN_WALLET)
-endif
-if ENABLE_ZMQ
-bitcoin_qt_ldadd += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-bitcoin_qt_ldadd += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
- $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(LIBSECP256K1) \
- $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(SQLITE_LIBS)
-bitcoin_qt_ldflags = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-bitcoin_qt_libtoolflags = $(AM_LIBTOOLFLAGS) --tag CXX
-
-qt_bitcoin_qt_CPPFLAGS = $(bitcoin_qt_cppflags)
-qt_bitcoin_qt_CXXFLAGS = $(bitcoin_qt_cxxflags)
-qt_bitcoin_qt_SOURCES = $(bitcoin_qt_sources) init/bitcoin-qt.cpp
-qt_bitcoin_qt_LDADD = $(bitcoin_qt_ldadd)
-qt_bitcoin_qt_LDFLAGS = $(bitcoin_qt_ldflags)
-qt_bitcoin_qt_LIBTOOLFLAGS = $(bitcoin_qt_libtoolflags)
-
-bitcoin_gui_CPPFLAGS = $(bitcoin_qt_cppflags)
-bitcoin_gui_CXXFLAGS = $(bitcoin_qt_cxxflags)
-bitcoin_gui_SOURCES = $(bitcoin_qt_sources) init/bitcoin-gui.cpp
-bitcoin_gui_LDADD = $(bitcoin_qt_ldadd) $(LIBBITCOIN_IPC) $(LIBBITCOIN_UTIL) $(LIBMULTIPROCESS_LIBS)
-bitcoin_gui_LDFLAGS = $(bitcoin_qt_ldflags)
-bitcoin_gui_LIBTOOLFLAGS = $(bitcoin_qt_libtoolflags)
-
-#locale/foo.ts -> locale/foo.qm
-QT_QM=$(QT_TS:.ts=.qm)
-
-SECONDARY: $(QT_QM)
-
-$(srcdir)/qt/bitcoinstrings.cpp: FORCE
- @test -n $(XGETTEXT) || echo "xgettext is required for updating translations"
- $(AM_V_GEN) cd $(srcdir); XGETTEXT=$(XGETTEXT) COPYRIGHT_HOLDERS="$(COPYRIGHT_HOLDERS)" $(PYTHON) ../share/qt/extract_strings_qt.py \
- $(libbitcoin_node_a_SOURCES) $(libbitcoin_wallet_a_SOURCES) $(libbitcoin_common_a_SOURCES) \
- $(libbitcoin_zmq_a_SOURCES) $(libbitcoin_consensus_a_SOURCES) $(libbitcoin_util_a_SOURCES) \
- $(BITCOIN_QT_BASE_CPP) $(BITCOIN_QT_WINDOWS_CPP) $(BITCOIN_QT_WALLET_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
-
-# The resulted bitcoin_en.xlf source file should follow Transifex requirements.
-# See: https://docs.transifex.com/formats/xliff#how-to-distinguish-between-a-source-file-and-a-translation-file
-translate: $(srcdir)/qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_BASE_CPP) $(BITCOIN_QT_WINDOWS_CPP) $(BITCOIN_QT_WALLET_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
- @test -n $(LUPDATE) || echo "lupdate is required for updating translations"
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) -no-obsolete -I $(srcdir) -locations relative $^ -ts $(srcdir)/qt/locale/bitcoin_en.ts
- @test -n $(LCONVERT) || echo "lconvert is required for updating translations"
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LCONVERT) -drop-translations -o $(srcdir)/qt/locale/bitcoin_en.xlf -i $(srcdir)/qt/locale/bitcoin_en.ts
- @$(SED) -i.old -e 's|source-language="en" target-language="en"|source-language="en"|' -e '/<target xml:space="preserve"><\/target>/d' $(srcdir)/qt/locale/bitcoin_en.xlf
- @rm -f $(srcdir)/qt/locale/bitcoin_en.xlf.old
-
-$(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM)
- @test -f $(RCC) || (echo "rcc $(RCC) not found, but is required for generating qrc cpp files"; exit 1)
- @cp -f $< $(@D)/temp_$(<F)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin_locale --format-version 1 $(@D)/temp_$(<F) > $@
- @rm $(@D)/temp_$(<F)
-
-$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(QT_RES_FONTS) $(QT_RES_ICONS) $(QT_RES_ANIMATION)
- @test -f $(RCC) || (echo "rcc $(RCC) not found, but is required for generating qrc cpp files"; exit 1)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin --format-version 1 $< > $@
-
-CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno qt/temp_bitcoin_locale.qrc
-
-CLEANFILES += $(CLEAN_QT)
-
-bitcoin_qt_clean: FORCE
- rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) qt/bitcoin-qt$(EXEEXT) $(LIBBITCOINQT)
-
-bitcoin_qt : qt/bitcoin-qt$(EXEEXT)
-
-ui_%.h: %.ui
- @test -f $(UIC) || (echo "uic $(UIC) not found, but is required for generating ui headers"; exit 1)
- @$(MKDIR_P) $(@D)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(UIC) -o $@ $< || (echo "Error creating $@"; false)
-
-%.moc: %.cpp
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(DEFAULT_INCLUDES) $(QT_INCLUDES_UNSUPPRESSED) $(MOC_DEFS) $< > $@
-
-moc_%.cpp: %.h
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(DEFAULT_INCLUDES) $(QT_INCLUDES_UNSUPPRESSED) $(MOC_DEFS) $< > $@
-
-%.qm: %.ts
- @test -f $(LRELEASE) || (echo "lrelease $(LRELEASE) not found, but is required for generating translations"; exit 1)
- @$(MKDIR_P) $(@D)
- $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LRELEASE) -silent $< -qm $@
diff --git a/src/Makefile.qt_locale.include b/src/Makefile.qt_locale.include
deleted file mode 100644
index 2af9fd01af..0000000000
--- a/src/Makefile.qt_locale.include
+++ /dev/null
@@ -1,124 +0,0 @@
-QT_TS = \
- qt/locale/bitcoin_af.ts \
- qt/locale/bitcoin_am.ts \
- qt/locale/bitcoin_ar.ts \
- qt/locale/bitcoin_az.ts \
- qt/locale/bitcoin_az@latin.ts \
- qt/locale/bitcoin_be.ts \
- qt/locale/bitcoin_bg.ts \
- qt/locale/bitcoin_bn.ts \
- qt/locale/bitcoin_br.ts \
- qt/locale/bitcoin_bs.ts \
- qt/locale/bitcoin_ca.ts \
- qt/locale/bitcoin_cmn.ts \
- qt/locale/bitcoin_cs.ts \
- qt/locale/bitcoin_cy.ts \
- qt/locale/bitcoin_da.ts \
- qt/locale/bitcoin_de.ts \
- qt/locale/bitcoin_de_AT.ts \
- qt/locale/bitcoin_de_CH.ts \
- qt/locale/bitcoin_el.ts \
- qt/locale/bitcoin_en.ts \
- qt/locale/bitcoin_eo.ts \
- qt/locale/bitcoin_es.ts \
- qt/locale/bitcoin_es_CL.ts \
- qt/locale/bitcoin_es_CO.ts \
- qt/locale/bitcoin_es_DO.ts \
- qt/locale/bitcoin_es_MX.ts \
- qt/locale/bitcoin_es_SV.ts \
- qt/locale/bitcoin_es_VE.ts \
- qt/locale/bitcoin_et.ts \
- qt/locale/bitcoin_eu.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 \
- qt/locale/bitcoin_ga.ts \
- qt/locale/bitcoin_ga_IE.ts \
- qt/locale/bitcoin_gd.ts \
- qt/locale/bitcoin_gl.ts \
- qt/locale/bitcoin_gl_ES.ts \
- qt/locale/bitcoin_gu.ts \
- qt/locale/bitcoin_ha.ts \
- qt/locale/bitcoin_hak.ts \
- qt/locale/bitcoin_he.ts \
- qt/locale/bitcoin_hi.ts \
- qt/locale/bitcoin_hr.ts \
- qt/locale/bitcoin_hu.ts \
- qt/locale/bitcoin_id.ts \
- qt/locale/bitcoin_is.ts \
- qt/locale/bitcoin_it.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 \
- qt/locale/bitcoin_ko.ts \
- qt/locale/bitcoin_ku.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 \
- qt/locale/bitcoin_nl.ts \
- qt/locale/bitcoin_no.ts \
- qt/locale/bitcoin_pa.ts \
- qt/locale/bitcoin_pam.ts \
- qt/locale/bitcoin_pl.ts \
- qt/locale/bitcoin_pt.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 \
- qt/locale/bitcoin_sn.ts \
- qt/locale/bitcoin_so.ts \
- qt/locale/bitcoin_sq.ts \
- qt/locale/bitcoin_sr.ts \
- qt/locale/bitcoin_sr@ijekavianlatin.ts \
- qt/locale/bitcoin_sr@latin.ts \
- qt/locale/bitcoin_sv.ts \
- qt/locale/bitcoin_sw.ts \
- qt/locale/bitcoin_szl.ts \
- qt/locale/bitcoin_ta.ts \
- qt/locale/bitcoin_te.ts \
- qt/locale/bitcoin_tk.ts \
- qt/locale/bitcoin_tl.ts \
- qt/locale/bitcoin_tr.ts \
- qt/locale/bitcoin_ug.ts \
- qt/locale/bitcoin_uk.ts \
- qt/locale/bitcoin_ur.ts \
- qt/locale/bitcoin_uz.ts \
- qt/locale/bitcoin_uz@Cyrl.ts \
- qt/locale/bitcoin_uz@Latn.ts \
- qt/locale/bitcoin_vi.ts \
- qt/locale/bitcoin_yo.ts \
- qt/locale/bitcoin_yue.ts \
- qt/locale/bitcoin_zh-Hans.ts \
- qt/locale/bitcoin_zh-Hant.ts \
- qt/locale/bitcoin_zh.ts \
- qt/locale/bitcoin_zh_CN.ts \
- qt/locale/bitcoin_zh_HK.ts \
- qt/locale/bitcoin_zh_TW.ts \
- qt/locale/bitcoin_zu.ts
diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include
deleted file mode 100644
index 89c659d4b9..0000000000
--- a/src/Makefile.qttest.include
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright (c) 2013-2016 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-bin_PROGRAMS += qt/test/test_bitcoin-qt
-TESTS += qt/test/test_bitcoin-qt
-
-TEST_QT_MOC_CPP = \
- qt/test/moc_apptests.cpp \
- qt/test/moc_optiontests.cpp \
- qt/test/moc_rpcnestedtests.cpp \
- qt/test/moc_uritests.cpp
-
-if ENABLE_WALLET
-TEST_QT_MOC_CPP += \
- qt/test/moc_addressbooktests.cpp \
- qt/test/moc_wallettests.cpp
-endif # ENABLE_WALLET
-
-TEST_QT_H = \
- qt/test/addressbooktests.h \
- qt/test/apptests.h \
- qt/test/optiontests.h \
- qt/test/rpcnestedtests.h \
- qt/test/uritests.h \
- qt/test/util.h \
- qt/test/wallettests.h
-
-qt_test_test_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
- $(QT_INCLUDES) $(QT_TEST_INCLUDES) $(BOOST_CPPFLAGS)
-
-qt_test_test_bitcoin_qt_SOURCES = \
- init/bitcoin-qt.cpp \
- qt/test/apptests.cpp \
- qt/test/optiontests.cpp \
- qt/test/rpcnestedtests.cpp \
- qt/test/test_main.cpp \
- qt/test/uritests.cpp \
- qt/test/util.cpp \
- $(TEST_QT_H)
-if ENABLE_WALLET
-qt_test_test_bitcoin_qt_SOURCES += \
- qt/test/addressbooktests.cpp \
- qt/test/wallettests.cpp \
- wallet/test/wallet_test_fixture.cpp
-endif # ENABLE_WALLET
-
-nodist_qt_test_test_bitcoin_qt_SOURCES = $(TEST_QT_MOC_CPP)
-
-qt_test_test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_NODE) $(LIBTEST_UTIL)
-if ENABLE_WALLET
-qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_UTIL) $(LIBBITCOIN_WALLET)
-endif
-if ENABLE_ZMQ
-qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) \
- $(LIBMEMENV) $(QT_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) \
- $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(LIBSECP256K1) \
- $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(SQLITE_LIBS)
-qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
-qt_test_test_bitcoin_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
-
-CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno
-
-CLEANFILES += $(CLEAN_BITCOIN_QT_TEST)
-
-test_bitcoin_qt : qt/test/test_bitcoin-qt$(EXEEXT)
-
-test_bitcoin_qt_check : qt/test/test_bitcoin-qt$(EXEEXT) FORCE
- $(MAKE) check-TESTS TESTS=$^
-
-test_bitcoin_qt_clean: FORCE
- rm -f $(CLEAN_BITCOIN_QT_TEST) $(qt_test_test_bitcoin_qt_OBJECTS)
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
deleted file mode 100644
index 633d0776f5..0000000000
--- a/src/Makefile.test.include
+++ /dev/null
@@ -1,488 +0,0 @@
-# Copyright (c) 2013-2016 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 ENABLE_FUZZ_BINARY
-noinst_PROGRAMS += test/fuzz/fuzz
-endif
-
-if ENABLE_TESTS
-bin_PROGRAMS += test/test_bitcoin
-endif
-
-TEST_SRCDIR = test
-TEST_BINARY=test/test_bitcoin$(EXEEXT)
-FUZZ_BINARY=test/fuzz/fuzz$(EXEEXT)
-
-JSON_TEST_FILES = \
- test/data/script_tests.json \
- test/data/bip341_wallet_vectors.json \
- test/data/base58_encode_decode.json \
- test/data/blockfilters.json \
- test/data/key_io_valid.json \
- test/data/key_io_invalid.json \
- test/data/script_tests.json \
- test/data/sighash.json \
- test/data/tx_invalid.json \
- test/data/tx_valid.json
-
-RAW_TEST_FILES = \
- test/data/asmap.raw
-
-GENERATED_TEST_FILES = $(JSON_TEST_FILES:.json=.json.h) $(RAW_TEST_FILES:.raw=.raw.h)
-
-BITCOIN_TEST_SUITE = \
- test/main.cpp \
- $(TEST_UTIL_H)
-
-FUZZ_SUITE_LD_COMMON = \
- $(LIBTEST_UTIL) \
- $(LIBTEST_FUZZ) \
- $(LIBBITCOIN_NODE) \
- $(LIBBITCOIN_WALLET) \
- $(LIBBITCOIN_COMMON) \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- $(LIBBITCOIN_CLI) \
- $(LIBUNIVALUE) \
- $(LIBLEVELDB) \
- $(LIBMEMENV) \
- $(LIBSECP256K1) \
- $(MINISKETCH_LIBS) \
- $(EVENT_LIBS) \
- $(EVENT_PTHREADS_LIBS)
-
-if USE_UPNP
-FUZZ_SUITE_LD_COMMON += $(MINIUPNPC_LIBS)
-endif
-
-if USE_NATPMP
-FUZZ_SUITE_LD_COMMON += $(NATPMP_LIBS)
-endif
-
-# test_bitcoin binary #
-BITCOIN_TESTS =\
- test/addrman_tests.cpp \
- test/allocator_tests.cpp \
- test/amount_tests.cpp \
- test/argsman_tests.cpp \
- test/arith_uint256_tests.cpp \
- test/banman_tests.cpp \
- test/base32_tests.cpp \
- test/base58_tests.cpp \
- test/base64_tests.cpp \
- test/bech32_tests.cpp \
- test/bip32_tests.cpp \
- test/bip324_tests.cpp \
- test/blockchain_tests.cpp \
- test/blockencodings_tests.cpp \
- test/blockfilter_index_tests.cpp \
- test/blockfilter_tests.cpp \
- test/blockmanager_tests.cpp \
- test/bloom_tests.cpp \
- test/bswap_tests.cpp \
- test/checkqueue_tests.cpp \
- test/coins_tests.cpp \
- test/coinstatsindex_tests.cpp \
- test/common_url_tests.cpp \
- test/compilerbug_tests.cpp \
- test/compress_tests.cpp \
- test/crypto_tests.cpp \
- test/cuckoocache_tests.cpp \
- test/dbwrapper_tests.cpp \
- test/denialofservice_tests.cpp \
- test/descriptor_tests.cpp \
- test/disconnected_transactions.cpp \
- test/feefrac_tests.cpp \
- test/flatfile_tests.cpp \
- test/fs_tests.cpp \
- test/getarg_tests.cpp \
- test/hash_tests.cpp \
- test/headers_sync_chainwork_tests.cpp \
- test/httpserver_tests.cpp \
- test/i2p_tests.cpp \
- test/interfaces_tests.cpp \
- test/key_io_tests.cpp \
- test/key_tests.cpp \
- test/logging_tests.cpp \
- test/mempool_tests.cpp \
- test/merkle_tests.cpp \
- test/merkleblock_tests.cpp \
- test/miner_tests.cpp \
- test/miniminer_tests.cpp \
- test/miniscript_tests.cpp \
- test/minisketch_tests.cpp \
- test/multisig_tests.cpp \
- test/net_peer_connection_tests.cpp \
- test/net_peer_eviction_tests.cpp \
- test/net_tests.cpp \
- test/netbase_tests.cpp \
- test/node_warnings_tests.cpp \
- test/orphanage_tests.cpp \
- test/peerman_tests.cpp \
- test/pmt_tests.cpp \
- test/policy_fee_tests.cpp \
- test/policyestimator_tests.cpp \
- test/pool_tests.cpp \
- test/pow_tests.cpp \
- test/prevector_tests.cpp \
- test/raii_event_tests.cpp \
- test/random_tests.cpp \
- test/rbf_tests.cpp \
- test/rest_tests.cpp \
- test/result_tests.cpp \
- test/reverselock_tests.cpp \
- test/rpc_tests.cpp \
- test/sanity_tests.cpp \
- test/scheduler_tests.cpp \
- test/script_p2sh_tests.cpp \
- test/script_parse_tests.cpp \
- test/script_segwit_tests.cpp \
- test/script_standard_tests.cpp \
- test/script_tests.cpp \
- test/scriptnum10.h \
- test/scriptnum_tests.cpp \
- test/serfloat_tests.cpp \
- test/serialize_tests.cpp \
- test/settings_tests.cpp \
- test/sighash_tests.cpp \
- test/sigopcount_tests.cpp \
- test/skiplist_tests.cpp \
- test/sock_tests.cpp \
- test/span_tests.cpp \
- test/streams_tests.cpp \
- test/sync_tests.cpp \
- test/system_tests.cpp \
- test/timeoffsets_tests.cpp \
- test/torcontrol_tests.cpp \
- test/transaction_tests.cpp \
- test/translation_tests.cpp \
- test/txindex_tests.cpp \
- test/txpackage_tests.cpp \
- test/txreconciliation_tests.cpp \
- test/txrequest_tests.cpp \
- test/txvalidation_tests.cpp \
- test/txvalidationcache_tests.cpp \
- test/uint256_tests.cpp \
- test/util_tests.cpp \
- test/util_threadnames_tests.cpp \
- test/validation_block_tests.cpp \
- test/validation_chainstate_tests.cpp \
- test/validation_chainstatemanager_tests.cpp \
- test/validation_flush_tests.cpp \
- test/validation_tests.cpp \
- test/validationinterface_tests.cpp \
- test/versionbits_tests.cpp \
- test/xoroshiro128plusplus_tests.cpp
-
-if ENABLE_WALLET
-BITCOIN_TESTS += \
- wallet/test/feebumper_tests.cpp \
- wallet/test/psbt_wallet_tests.cpp \
- wallet/test/spend_tests.cpp \
- wallet/test/wallet_tests.cpp \
- wallet/test/walletdb_tests.cpp \
- wallet/test/wallet_crypto_tests.cpp \
- wallet/test/wallet_transaction_tests.cpp \
- wallet/test/coinselector_tests.cpp \
- wallet/test/init_tests.cpp \
- wallet/test/ismine_tests.cpp \
- wallet/test/rpc_util_tests.cpp \
- wallet/test/scriptpubkeyman_tests.cpp \
- wallet/test/walletload_tests.cpp \
- wallet/test/group_outputs_tests.cpp
-
-FUZZ_SUITE_LD_COMMON +=\
- $(SQLITE_LIBS) \
- $(BDB_LIBS)
-
-if USE_BDB
-BITCOIN_TESTS += wallet/test/db_tests.cpp
-endif
-
-FUZZ_WALLET_SRC = \
- wallet/test/fuzz/coincontrol.cpp \
- wallet/test/fuzz/coinselection.cpp \
- wallet/test/fuzz/crypter.cpp \
- wallet/test/fuzz/fees.cpp \
- wallet/test/fuzz/parse_iso8601.cpp \
- wallet/test/fuzz/wallet_bdb_parser.cpp
-
-if USE_SQLITE
-FUZZ_WALLET_SRC += \
- wallet/test/fuzz/notifications.cpp \
- wallet/test/fuzz/scriptpubkeyman.cpp
-endif # USE_SQLITE
-
-BITCOIN_TEST_SUITE += \
- wallet/test/wallet_test_fixture.cpp \
- wallet/test/wallet_test_fixture.h \
- wallet/test/init_test_fixture.cpp \
- 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)
-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)
-test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-
-test_test_bitcoin_LDADD += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS)
-test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) -static
-
-if ENABLE_ZMQ
-test_test_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-FUZZ_SUITE_LD_COMMON += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
-endif
-
-if ENABLE_FUZZ_BINARY
-test_fuzz_fuzz_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(EVENT_CFLAGS)
-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)
-test_fuzz_fuzz_SOURCES = \
- $(FUZZ_WALLET_SRC) \
- test/fuzz/addition_overflow.cpp \
- test/fuzz/addrman.cpp \
- test/fuzz/asmap.cpp \
- test/fuzz/asmap_direct.cpp \
- test/fuzz/autofile.cpp \
- test/fuzz/banman.cpp \
- test/fuzz/base_encode_decode.cpp \
- test/fuzz/bech32.cpp \
- test/fuzz/bip324.cpp \
- test/fuzz/bitdeque.cpp \
- test/fuzz/bitset.cpp \
- test/fuzz/block.cpp \
- test/fuzz/block_header.cpp \
- test/fuzz/blockfilter.cpp \
- test/fuzz/bloom_filter.cpp \
- test/fuzz/buffered_file.cpp \
- test/fuzz/chain.cpp \
- test/fuzz/checkqueue.cpp \
- test/fuzz/coins_view.cpp \
- test/fuzz/coinscache_sim.cpp \
- test/fuzz/connman.cpp \
- test/fuzz/crypto.cpp \
- test/fuzz/crypto_aes256.cpp \
- test/fuzz/crypto_aes256cbc.cpp \
- test/fuzz/crypto_chacha20.cpp \
- test/fuzz/crypto_common.cpp \
- test/fuzz/crypto_diff_fuzz_chacha20.cpp \
- test/fuzz/crypto_hkdf_hmac_sha256_l32.cpp \
- test/fuzz/crypto_poly1305.cpp \
- test/fuzz/cuckoocache.cpp \
- test/fuzz/decode_tx.cpp \
- test/fuzz/descriptor_parse.cpp \
- test/fuzz/deserialize.cpp \
- test/fuzz/eval_script.cpp \
- test/fuzz/feefrac.cpp \
- test/fuzz/fee_rate.cpp \
- test/fuzz/feeratediagram.cpp \
- test/fuzz/fees.cpp \
- test/fuzz/flatfile.cpp \
- test/fuzz/float.cpp \
- test/fuzz/golomb_rice.cpp \
- test/fuzz/headerssync.cpp \
- test/fuzz/hex.cpp \
- test/fuzz/http_request.cpp \
- test/fuzz/i2p.cpp \
- test/fuzz/integer.cpp \
- test/fuzz/key.cpp \
- test/fuzz/key_io.cpp \
- test/fuzz/kitchen_sink.cpp \
- test/fuzz/load_external_block_file.cpp \
- test/fuzz/locale.cpp \
- test/fuzz/merkleblock.cpp \
- test/fuzz/message.cpp \
- test/fuzz/miniscript.cpp \
- test/fuzz/minisketch.cpp \
- test/fuzz/mini_miner.cpp \
- test/fuzz/muhash.cpp \
- test/fuzz/multiplication_overflow.cpp \
- test/fuzz/net.cpp \
- test/fuzz/net_permissions.cpp \
- test/fuzz/netaddress.cpp \
- test/fuzz/netbase_dns_lookup.cpp \
- test/fuzz/node_eviction.cpp \
- test/fuzz/p2p_transport_serialization.cpp \
- test/fuzz/package_eval.cpp \
- test/fuzz/parse_hd_keypath.cpp \
- test/fuzz/parse_numbers.cpp \
- test/fuzz/parse_script.cpp \
- test/fuzz/parse_univalue.cpp \
- test/fuzz/partially_downloaded_block.cpp \
- test/fuzz/policy_estimator.cpp \
- test/fuzz/policy_estimator_io.cpp \
- test/fuzz/poolresource.cpp \
- test/fuzz/pow.cpp \
- test/fuzz/prevector.cpp \
- test/fuzz/primitives_transaction.cpp \
- test/fuzz/process_message.cpp \
- test/fuzz/process_messages.cpp \
- test/fuzz/protocol.cpp \
- test/fuzz/psbt.cpp \
- test/fuzz/random.cpp \
- test/fuzz/rbf.cpp \
- test/fuzz/rolling_bloom_filter.cpp \
- test/fuzz/rpc.cpp \
- test/fuzz/script.cpp \
- test/fuzz/script_assets_test_minimizer.cpp \
- test/fuzz/script_descriptor_cache.cpp \
- test/fuzz/script_flags.cpp \
- test/fuzz/script_format.cpp \
- test/fuzz/script_interpreter.cpp \
- test/fuzz/script_ops.cpp \
- test/fuzz/script_parsing.cpp \
- test/fuzz/script_sigcache.cpp \
- test/fuzz/script_sign.cpp \
- test/fuzz/scriptnum_ops.cpp \
- test/fuzz/secp256k1_ec_seckey_import_export_der.cpp \
- test/fuzz/secp256k1_ecdsa_signature_parse_der_lax.cpp \
- test/fuzz/signature_checker.cpp \
- test/fuzz/signet.cpp \
- test/fuzz/socks5.cpp \
- test/fuzz/span.cpp \
- test/fuzz/string.cpp \
- test/fuzz/strprintf.cpp \
- test/fuzz/system.cpp \
- test/fuzz/timeoffsets.cpp \
- test/fuzz/torcontrol.cpp \
- test/fuzz/transaction.cpp \
- test/fuzz/tx_in.cpp \
- test/fuzz/tx_out.cpp \
- test/fuzz/tx_pool.cpp \
- test/fuzz/txorphan.cpp \
- test/fuzz/txrequest.cpp \
- test/fuzz/utxo_snapshot.cpp \
- test/fuzz/utxo_total_supply.cpp \
- test/fuzz/validation_load_mempool.cpp \
- test/fuzz/vecdeque.cpp \
- test/fuzz/versionbits.cpp
-endif # ENABLE_FUZZ_BINARY
-
-nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES)
-
-$(BITCOIN_TESTS): $(GENERATED_TEST_FILES)
-
-CLEAN_BITCOIN_TEST = test/*.gcda test/*.gcno test/fuzz/*.gcda test/fuzz/*.gcno test/util/*.gcda test/util/*.gcno $(GENERATED_TEST_FILES) $(addsuffix .log,$(basename $(BITCOIN_TESTS)))
-
-CLEANFILES += $(CLEAN_BITCOIN_TEST)
-
-if TARGET_WINDOWS
-bitcoin_test: $(TEST_BINARY)
-else
-if ENABLE_BENCH
-bitcoin_test: $(TEST_BINARY) $(BENCH_BINARY)
-else
-bitcoin_test: $(TEST_BINARY)
-endif
-endif
-
-bitcoin_test_check: $(TEST_BINARY) FORCE
- $(MAKE) check-TESTS TESTS=$^
-
-bitcoin_test_clean : FORCE
- rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY)
-
-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
-endif
- @echo "Running test/util/rpcauth-test.py..."
- $(PYTHON) $(top_builddir)/test/util/rpcauth-test.py
-if TARGET_WINDOWS
-else
-if ENABLE_BENCH
- @echo "Running bench/bench_bitcoin (one iteration sanity check, only high priority)..."
- $(BENCH_BINARY) -sanity-check -priority-level=high
-endif
-endif
- $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C secp256k1 check
-
-if ENABLE_TESTS
-UNIVALUE_TESTS = univalue/test/object univalue/test/unitester
-noinst_PROGRAMS += $(UNIVALUE_TESTS)
-TESTS += $(UNIVALUE_TESTS)
-
-univalue_test_unitester_SOURCES = $(UNIVALUE_TEST_UNITESTER_INT)
-univalue_test_unitester_LDADD = $(LIBUNIVALUE)
-univalue_test_unitester_CPPFLAGS = -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT) -DJSON_TEST_SRC=\"$(srcdir)/$(UNIVALUE_TEST_DATA_DIR_INT)\"
-univalue_test_unitester_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
-
-univalue_test_object_SOURCES = $(UNIVALUE_TEST_OBJECT_INT)
-univalue_test_object_LDADD = $(LIBUNIVALUE)
-univalue_test_object_CPPFLAGS = -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT)
-univalue_test_object_LDFLAGS = -static $(LIBTOOL_APP_LDFLAGS)
-endif
-
-%.cpp.test: %.cpp
- @echo Running tests: $$(\
- cat $< | \
- grep -E "(BOOST_FIXTURE_TEST_SUITE\\(|BOOST_AUTO_TEST_SUITE\\()" | \
- cut -d '(' -f 2 | cut -d ',' -f 1 | cut -d ')' -f 1\
- ) from $<
- $(AM_V_at)export TEST_LOGFILE=$(abs_builddir)/$$(\
- echo $< | grep -E -o "(wallet/test/.*\.cpp|test/.*\.cpp)" | $(SED) -e s/\.cpp/.log/ \
- ) && \
- $(TEST_BINARY) --catch_system_errors=no -l test_suite -t "$$(\
- cat $< | \
- grep -E "(BOOST_FIXTURE_TEST_SUITE\\(|BOOST_AUTO_TEST_SUITE\\()" | \
- cut -d '(' -f 2 | cut -d ',' -f 1 | cut -d ')' -f 1\
- )" -- DEBUG_LOG_OUT > "$$TEST_LOGFILE" 2>&1 || (cat "$$TEST_LOGFILE" && false)
-
-%.json.h: %.json
- @$(MKDIR_P) $(@D)
- $(AM_V_GEN) { \
- echo "#include <string>" && \
- echo "namespace json_tests{" && \
- echo "static const std::string $(*F){" && \
- $(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' && \
- echo "};};"; \
- } > "$@.new" && mv -f "$@.new" "$@"
diff --git a/src/Makefile.test_fuzz.include b/src/Makefile.test_fuzz.include
deleted file mode 100644
index b4337991e4..0000000000
--- a/src/Makefile.test_fuzz.include
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2013-2020 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-LIBTEST_FUZZ=libtest_fuzz.a
-
-EXTRA_LIBRARIES += \
- $(LIBTEST_FUZZ)
-
-TEST_FUZZ_H = \
- test/fuzz/fuzz.h \
- test/fuzz/FuzzedDataProvider.h \
- test/fuzz/util.h \
- test/fuzz/util/descriptor.h \
- test/fuzz/util/mempool.h \
- test/fuzz/util/net.h
-
-libtest_fuzz_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libtest_fuzz_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libtest_fuzz_a_SOURCES = \
- test/fuzz/fuzz.cpp \
- test/fuzz/util.cpp \
- test/fuzz/util/descriptor.cpp \
- test/fuzz/util/mempool.cpp \
- test/fuzz/util/net.cpp \
- $(TEST_FUZZ_H)
diff --git a/src/Makefile.test_util.include b/src/Makefile.test_util.include
deleted file mode 100644
index 6a1fd712bd..0000000000
--- a/src/Makefile.test_util.include
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (c) 2013-2019 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-LIBTEST_UTIL=libtest_util.a
-
-EXTRA_LIBRARIES += \
- $(LIBTEST_UTIL)
-
-TEST_UTIL_H = \
- test/util/blockfilter.h \
- test/util/chainstate.h \
- test/util/coins.h \
- test/util/index.h \
- test/util/json.h \
- test/util/logging.h \
- test/util/mining.h \
- test/util/net.h \
- test/util/poolresourcetester.h \
- test/util/random.h \
- test/util/script.h \
- test/util/setup_common.h \
- test/util/str.h \
- test/util/transaction_utils.h \
- test/util/txmempool.h \
- test/util/validation.h \
- test/util/xoroshiro128plusplus.h
-
-if ENABLE_WALLET
-TEST_UTIL_H += wallet/test/util.h
-endif # ENABLE_WALLET
-
-libtest_util_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
-libtest_util_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-libtest_util_a_SOURCES = \
- test/util/blockfilter.cpp \
- test/util/coins.cpp \
- test/util/index.cpp \
- test/util/json.cpp \
- test/util/logging.cpp \
- test/util/mining.cpp \
- test/util/net.cpp \
- test/util/random.cpp \
- test/util/script.cpp \
- test/util/setup_common.cpp \
- test/util/str.cpp \
- test/util/transaction_utils.cpp \
- test/util/txmempool.cpp \
- test/util/validation.cpp
-
-if ENABLE_WALLET
-libtest_util_a_SOURCES += wallet/test/util.cpp
-endif # ENABLE_WALLET
-
-libtest_util_a_SOURCES += $(TEST_UTIL_H)
diff --git a/src/Makefile.univalue.include b/src/Makefile.univalue.include
deleted file mode 100644
index 3644e36368..0000000000
--- a/src/Makefile.univalue.include
+++ /dev/null
@@ -1,6 +0,0 @@
-include univalue/sources.mk
-
-LIBUNIVALUE = libunivalue.la
-noinst_LTLIBRARIES += $(LIBUNIVALUE)
-libunivalue_la_SOURCES = $(UNIVALUE_LIB_SOURCES_INT) $(UNIVALUE_DIST_HEADERS_INT) $(UNIVALUE_LIB_HEADERS_INT) $(UNIVALUE_TEST_FILES_INT)
-libunivalue_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT)
diff --git a/src/addrdb.cpp b/src/addrdb.cpp
index 4d34c24ba9..b89141c88e 100644
--- a/src/addrdb.cpp
+++ b/src/addrdb.cpp
@@ -53,7 +53,7 @@ template <typename Data>
bool SerializeFileDB(const std::string& prefix, const fs::path& path, const Data& data)
{
// Generate random temporary filename
- const uint16_t randv{GetRand<uint16_t>()};
+ const uint16_t randv{FastRandomContext().rand<uint16_t>()};
std::string tmpfn = strprintf("%s.%04x", prefix, randv);
// open temp output file
@@ -73,7 +73,7 @@ bool SerializeFileDB(const std::string& prefix, const fs::path& path, const Data
remove(pathTmp);
return false;
}
- if (!FileCommit(fileout.Get())) {
+ if (!fileout.Commit()) {
fileout.fclose();
remove(pathTmp);
LogError("%s: Failed to flush file %s\n", __func__, fs::PathToString(pathTmp));
diff --git a/src/addresstype.cpp b/src/addresstype.cpp
index f199d1b479..67e643943d 100644
--- a/src/addresstype.cpp
+++ b/src/addresstype.cpp
@@ -87,6 +87,10 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
addressRet = tap;
return true;
}
+ case TxoutType::ANCHOR: {
+ addressRet = PayToAnchor();
+ return true;
+ }
case TxoutType::WITNESS_UNKNOWN: {
addressRet = WitnessUnknown{vSolutions[0][0], vSolutions[1]};
return true;
diff --git a/src/addresstype.h b/src/addresstype.h
index 0152858bad..93cdf66c5b 100644
--- a/src/addresstype.h
+++ b/src/addresstype.h
@@ -9,6 +9,7 @@
#include <pubkey.h>
#include <script/script.h>
#include <uint256.h>
+#include <util/check.h>
#include <util/hash_type.h>
#include <algorithm>
@@ -116,6 +117,13 @@ public:
}
};
+struct PayToAnchor : public WitnessUnknown
+{
+ PayToAnchor() : WitnessUnknown(1, {0x4e, 0x73}) {
+ Assume(CScript::IsPayToAnchor(1, {0x4e, 0x73}));
+ };
+};
+
/**
* A txout script categorized into standard templates.
* * CNoDestination: Optionally a script, no corresponding address.
@@ -125,10 +133,11 @@ public:
* * WitnessV0ScriptHash: TxoutType::WITNESS_V0_SCRIPTHASH destination (P2WSH address)
* * WitnessV0KeyHash: TxoutType::WITNESS_V0_KEYHASH destination (P2WPKH address)
* * WitnessV1Taproot: TxoutType::WITNESS_V1_TAPROOT destination (P2TR address)
+ * * PayToAnchor: TxoutType::ANCHOR destination (P2A address)
* * WitnessUnknown: TxoutType::WITNESS_UNKNOWN destination (P2W??? address)
* A CTxDestination is the internal data type encoded in a bitcoin address
*/
-using CTxDestination = std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>;
+using CTxDestination = std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown>;
/** Check whether a CTxDestination corresponds to one with an address. */
bool IsValidDestination(const CTxDestination& dest);
diff --git a/src/addrman.cpp b/src/addrman.cpp
index d0b820ee65..84d228dc82 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -188,7 +188,7 @@ void AddrManImpl::Serialize(Stream& s_) const
int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30);
s << nUBuckets;
- std::unordered_map<int, int> mapUnkIds;
+ std::unordered_map<nid_type, int> mapUnkIds;
int nIds = 0;
for (const auto& entry : mapInfo) {
mapUnkIds[entry.first] = nIds;
@@ -342,7 +342,7 @@ void AddrManImpl::Unserialize(Stream& s_)
serialized_asmap_checksum == supplied_asmap_checksum};
if (!restore_bucketing) {
- LogPrint(BCLog::ADDRMAN, "Bucketing method was updated, re-bucketing addrman entries from disk\n");
+ LogDebug(BCLog::ADDRMAN, "Bucketing method was updated, re-bucketing addrman entries from disk\n");
}
for (auto bucket_entry : bucket_entries) {
@@ -387,7 +387,7 @@ void AddrManImpl::Unserialize(Stream& s_)
}
}
if (nLost + nLostUnk > 0) {
- LogPrint(BCLog::ADDRMAN, "addrman lost %i new and %i tried addresses due to collisions or invalid addresses\n", nLostUnk, nLost);
+ LogDebug(BCLog::ADDRMAN, "addrman lost %i new and %i tried addresses due to collisions or invalid addresses\n", nLostUnk, nLost);
}
const int check_code{CheckAddrman()};
@@ -398,7 +398,7 @@ void AddrManImpl::Unserialize(Stream& s_)
}
}
-AddrInfo* AddrManImpl::Find(const CService& addr, int* pnId)
+AddrInfo* AddrManImpl::Find(const CService& addr, nid_type* pnId)
{
AssertLockHeld(cs);
@@ -413,11 +413,11 @@ AddrInfo* AddrManImpl::Find(const CService& addr, int* pnId)
return nullptr;
}
-AddrInfo* AddrManImpl::Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId)
+AddrInfo* AddrManImpl::Create(const CAddress& addr, const CNetAddr& addrSource, nid_type* pnId)
{
AssertLockHeld(cs);
- int nId = nIdCount++;
+ nid_type nId = nIdCount++;
mapInfo[nId] = AddrInfo(addr, addrSource);
mapAddr[addr] = nId;
mapInfo[nId].nRandomPos = vRandom.size();
@@ -438,8 +438,8 @@ void AddrManImpl::SwapRandom(unsigned int nRndPos1, unsigned int nRndPos2) const
assert(nRndPos1 < vRandom.size() && nRndPos2 < vRandom.size());
- int nId1 = vRandom[nRndPos1];
- int nId2 = vRandom[nRndPos2];
+ nid_type nId1 = vRandom[nRndPos1];
+ nid_type nId2 = vRandom[nRndPos2];
const auto it_1{mapInfo.find(nId1)};
const auto it_2{mapInfo.find(nId2)};
@@ -453,7 +453,7 @@ void AddrManImpl::SwapRandom(unsigned int nRndPos1, unsigned int nRndPos2) const
vRandom[nRndPos2] = nId1;
}
-void AddrManImpl::Delete(int nId)
+void AddrManImpl::Delete(nid_type nId)
{
AssertLockHeld(cs);
@@ -476,19 +476,19 @@ void AddrManImpl::ClearNew(int nUBucket, int nUBucketPos)
// if there is an entry in the specified bucket, delete it.
if (vvNew[nUBucket][nUBucketPos] != -1) {
- int nIdDelete = vvNew[nUBucket][nUBucketPos];
+ nid_type nIdDelete = vvNew[nUBucket][nUBucketPos];
AddrInfo& infoDelete = mapInfo[nIdDelete];
assert(infoDelete.nRefCount > 0);
infoDelete.nRefCount--;
vvNew[nUBucket][nUBucketPos] = -1;
- LogPrint(BCLog::ADDRMAN, "Removed %s from new[%i][%i]\n", infoDelete.ToStringAddrPort(), nUBucket, nUBucketPos);
+ LogDebug(BCLog::ADDRMAN, "Removed %s from new[%i][%i]\n", infoDelete.ToStringAddrPort(), nUBucket, nUBucketPos);
if (infoDelete.nRefCount == 0) {
Delete(nIdDelete);
}
}
}
-void AddrManImpl::MakeTried(AddrInfo& info, int nId)
+void AddrManImpl::MakeTried(AddrInfo& info, nid_type nId)
{
AssertLockHeld(cs);
@@ -515,7 +515,7 @@ void AddrManImpl::MakeTried(AddrInfo& info, int nId)
// first make space to add it (the existing tried entry there is moved to new, deleting whatever is there).
if (vvTried[nKBucket][nKBucketPos] != -1) {
// find an item to evict
- int nIdEvict = vvTried[nKBucket][nKBucketPos];
+ nid_type nIdEvict = vvTried[nKBucket][nKBucketPos];
assert(mapInfo.count(nIdEvict) == 1);
AddrInfo& infoOld = mapInfo[nIdEvict];
@@ -536,7 +536,7 @@ void AddrManImpl::MakeTried(AddrInfo& info, int nId)
vvNew[nUBucket][nUBucketPos] = nIdEvict;
nNew++;
m_network_counts[infoOld.GetNetwork()].n_new++;
- LogPrint(BCLog::ADDRMAN, "Moved %s from tried[%i][%i] to new[%i][%i] to make space\n",
+ LogDebug(BCLog::ADDRMAN, "Moved %s from tried[%i][%i] to new[%i][%i] to make space\n",
infoOld.ToStringAddrPort(), nKBucket, nKBucketPos, nUBucket, nUBucketPos);
}
assert(vvTried[nKBucket][nKBucketPos] == -1);
@@ -554,7 +554,7 @@ bool AddrManImpl::AddSingle(const CAddress& addr, const CNetAddr& source, std::c
if (!addr.IsRoutable())
return false;
- int nId;
+ nid_type nId;
AddrInfo* pinfo = Find(addr, &nId);
// Do not set a penalty for a source's self-announcement
@@ -612,7 +612,7 @@ bool AddrManImpl::AddSingle(const CAddress& addr, const CNetAddr& source, std::c
pinfo->nRefCount++;
vvNew[nUBucket][nUBucketPos] = nId;
const auto mapped_as{m_netgroupman.GetMappedAS(addr)};
- LogPrint(BCLog::ADDRMAN, "Added %s%s to new[%i][%i]\n",
+ LogDebug(BCLog::ADDRMAN, "Added %s%s to new[%i][%i]\n",
addr.ToStringAddrPort(), (mapped_as ? strprintf(" mapped to AS%i", mapped_as) : ""), nUBucket, nUBucketPos);
} else {
if (pinfo->nRefCount == 0) {
@@ -627,7 +627,7 @@ bool AddrManImpl::Good_(const CService& addr, bool test_before_evict, NodeSecond
{
AssertLockHeld(cs);
- int nId;
+ nid_type nId;
m_last_good = time;
@@ -663,7 +663,7 @@ bool AddrManImpl::Good_(const CService& addr, bool test_before_evict, NodeSecond
}
// Output the entry we'd be colliding with, for debugging purposes
auto colliding_entry = mapInfo.find(vvTried[tried_bucket][tried_bucket_pos]);
- LogPrint(BCLog::ADDRMAN, "Collision with %s while attempting to move %s to tried table. Collisions=%d\n",
+ LogDebug(BCLog::ADDRMAN, "Collision with %s while attempting to move %s to tried table. Collisions=%d\n",
colliding_entry != mapInfo.end() ? colliding_entry->second.ToStringAddrPort() : "",
addr.ToStringAddrPort(),
m_tried_collisions.size());
@@ -672,7 +672,7 @@ bool AddrManImpl::Good_(const CService& addr, bool test_before_evict, NodeSecond
// move nId to the tried tables
MakeTried(info, nId);
const auto mapped_as{m_netgroupman.GetMappedAS(addr)};
- LogPrint(BCLog::ADDRMAN, "Moved %s%s to tried[%i][%i]\n",
+ LogDebug(BCLog::ADDRMAN, "Moved %s%s to tried[%i][%i]\n",
addr.ToStringAddrPort(), (mapped_as ? strprintf(" mapped to AS%i", mapped_as) : ""), tried_bucket, tried_bucket_pos);
return true;
}
@@ -685,7 +685,7 @@ bool AddrManImpl::Add_(const std::vector<CAddress>& vAddr, const CNetAddr& sourc
added += AddSingle(*it, source, time_penalty) ? 1 : 0;
}
if (added > 0) {
- LogPrint(BCLog::ADDRMAN, "Added %i addresses (of %i) from %s: %i tried, %i new\n", added, vAddr.size(), source.ToStringAddr(), nTried, nNew);
+ LogDebug(BCLog::ADDRMAN, "Added %i addresses (of %i) from %s: %i tried, %i new\n", added, vAddr.size(), source.ToStringAddr(), nTried, nNew);
}
return added > 0;
}
@@ -710,7 +710,7 @@ void AddrManImpl::Attempt_(const CService& addr, bool fCountFailure, NodeSeconds
}
}
-std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::optional<Network> network) const
+std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, const std::unordered_set<Network>& networks) const
{
AssertLockHeld(cs);
@@ -719,13 +719,18 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::option
size_t new_count = nNew;
size_t tried_count = nTried;
- if (network.has_value()) {
- auto it = m_network_counts.find(*network);
- if (it == m_network_counts.end()) return {};
-
- auto counts = it->second;
- new_count = counts.n_new;
- tried_count = counts.n_tried;
+ if (!networks.empty()) {
+ new_count = 0;
+ tried_count = 0;
+ for (auto& network : networks) {
+ auto it = m_network_counts.find(network);
+ if (it == m_network_counts.end()) {
+ continue;
+ }
+ auto counts = it->second;
+ new_count += counts.n_new;
+ tried_count += counts.n_tried;
+ }
}
if (new_only && new_count == 0) return {};
@@ -753,14 +758,15 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::option
// Iterate over the positions of that bucket, starting at the initial one,
// and looping around.
- int i, position, node_id;
+ int i, position;
+ nid_type node_id;
for (i = 0; i < ADDRMAN_BUCKET_SIZE; ++i) {
position = (initial_position + i) % ADDRMAN_BUCKET_SIZE;
node_id = GetEntry(search_tried, bucket, position);
if (node_id != -1) {
- if (network.has_value()) {
+ if (!networks.empty()) {
const auto it{mapInfo.find(node_id)};
- if (Assume(it != mapInfo.end()) && it->second.GetNetwork() == *network) break;
+ if (Assume(it != mapInfo.end()) && networks.contains(it->second.GetNetwork())) break;
} else {
break;
}
@@ -776,8 +782,8 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::option
const AddrInfo& info{it_found->second};
// With probability GetChance() * chance_factor, return the entry.
- if (insecure_rand.randbits(30) < chance_factor * info.GetChance() * (1 << 30)) {
- LogPrint(BCLog::ADDRMAN, "Selected %s from %s\n", info.ToStringAddrPort(), search_tried ? "tried" : "new");
+ if (insecure_rand.randbits<30>() < chance_factor * info.GetChance() * (1 << 30)) {
+ LogDebug(BCLog::ADDRMAN, "Selected %s from %s\n", info.ToStringAddrPort(), search_tried ? "tried" : "new");
return {info, info.m_last_try};
}
@@ -786,7 +792,7 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::Select_(bool new_only, std::option
}
}
-int AddrManImpl::GetEntry(bool use_tried, size_t bucket, size_t position) const
+nid_type AddrManImpl::GetEntry(bool use_tried, size_t bucket, size_t position) const
{
AssertLockHeld(cs);
@@ -837,7 +843,7 @@ std::vector<CAddress> AddrManImpl::GetAddr_(size_t max_addresses, size_t max_pct
addresses.push_back(ai);
}
- LogPrint(BCLog::ADDRMAN, "GetAddr returned %d random addresses\n", addresses.size());
+ LogDebug(BCLog::ADDRMAN, "GetAddr returned %d random addresses\n", addresses.size());
return addresses;
}
@@ -849,7 +855,7 @@ std::vector<std::pair<AddrInfo, AddressPosition>> AddrManImpl::GetEntries_(bool
std::vector<std::pair<AddrInfo, AddressPosition>> infos;
for (int bucket = 0; bucket < bucket_count; ++bucket) {
for (int position = 0; position < ADDRMAN_BUCKET_SIZE; ++position) {
- int id = GetEntry(from_tried, bucket, position);
+ nid_type id = GetEntry(from_tried, bucket, position);
if (id >= 0) {
AddrInfo info = mapInfo.at(id);
AddressPosition location = AddressPosition(
@@ -904,8 +910,8 @@ void AddrManImpl::ResolveCollisions_()
{
AssertLockHeld(cs);
- for (std::set<int>::iterator it = m_tried_collisions.begin(); it != m_tried_collisions.end();) {
- int id_new = *it;
+ for (std::set<nid_type>::iterator it = m_tried_collisions.begin(); it != m_tried_collisions.end();) {
+ nid_type id_new = *it;
bool erase_collision = false;
@@ -923,7 +929,7 @@ void AddrManImpl::ResolveCollisions_()
} else if (vvTried[tried_bucket][tried_bucket_pos] != -1) { // The position in the tried bucket is not empty
// Get the to-be-evicted address that is being tested
- int id_old = vvTried[tried_bucket][tried_bucket_pos];
+ nid_type id_old = vvTried[tried_bucket][tried_bucket_pos];
AddrInfo& info_old = mapInfo[id_old];
const auto current_time{Now<NodeSeconds>()};
@@ -935,7 +941,7 @@ void AddrManImpl::ResolveCollisions_()
// Give address at least 60 seconds to successfully connect
if (current_time - info_old.m_last_try > 60s) {
- LogPrint(BCLog::ADDRMAN, "Replacing %s with %s in tried table\n", info_old.ToStringAddrPort(), info_new.ToStringAddrPort());
+ LogDebug(BCLog::ADDRMAN, "Replacing %s with %s in tried table\n", info_old.ToStringAddrPort(), info_new.ToStringAddrPort());
// Replaces an existing address already in the tried table with the new address
Good_(info_new, false, current_time);
@@ -945,7 +951,7 @@ void AddrManImpl::ResolveCollisions_()
// If the collision hasn't resolved in some reasonable amount of time,
// just evict the old entry -- we must not be able to
// connect to it for some reason.
- LogPrint(BCLog::ADDRMAN, "Unable to test; replacing %s with %s in tried table anyway\n", info_old.ToStringAddrPort(), info_new.ToStringAddrPort());
+ LogDebug(BCLog::ADDRMAN, "Unable to test; replacing %s with %s in tried table anyway\n", info_old.ToStringAddrPort(), info_new.ToStringAddrPort());
Good_(info_new, false, current_time);
erase_collision = true;
}
@@ -969,11 +975,11 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::SelectTriedCollision_()
if (m_tried_collisions.size() == 0) return {};
- std::set<int>::iterator it = m_tried_collisions.begin();
+ std::set<nid_type>::iterator it = m_tried_collisions.begin();
// Selects a random element from m_tried_collisions
std::advance(it, insecure_rand.randrange(m_tried_collisions.size()));
- int id_new = *it;
+ nid_type id_new = *it;
// If id_new not found in mapInfo remove it from m_tried_collisions
if (mapInfo.count(id_new) != 1) {
@@ -1058,15 +1064,15 @@ int AddrManImpl::CheckAddrman() const
LOG_TIME_MILLIS_WITH_CATEGORY_MSG_ONCE(
strprintf("new %i, tried %i, total %u", nNew, nTried, vRandom.size()), BCLog::ADDRMAN);
- std::unordered_set<int> setTried;
- std::unordered_map<int, int> mapNew;
+ std::unordered_set<nid_type> setTried;
+ std::unordered_map<nid_type, int> mapNew;
std::unordered_map<Network, NewTriedCount> local_counts;
if (vRandom.size() != (size_t)(nTried + nNew))
return -7;
for (const auto& entry : mapInfo) {
- int n = entry.first;
+ nid_type n = entry.first;
const AddrInfo& info = entry.second;
if (info.fInTried) {
if (!TicksSinceEpoch<std::chrono::seconds>(info.m_last_success)) {
@@ -1208,11 +1214,11 @@ std::pair<CAddress, NodeSeconds> AddrManImpl::SelectTriedCollision()
return ret;
}
-std::pair<CAddress, NodeSeconds> AddrManImpl::Select(bool new_only, std::optional<Network> network) const
+std::pair<CAddress, NodeSeconds> AddrManImpl::Select(bool new_only, const std::unordered_set<Network>& networks) const
{
LOCK(cs);
Check();
- auto addrRet = Select_(new_only, network);
+ auto addrRet = Select_(new_only, networks);
Check();
return addrRet;
}
@@ -1315,9 +1321,9 @@ std::pair<CAddress, NodeSeconds> AddrMan::SelectTriedCollision()
return m_impl->SelectTriedCollision();
}
-std::pair<CAddress, NodeSeconds> AddrMan::Select(bool new_only, std::optional<Network> network) const
+std::pair<CAddress, NodeSeconds> AddrMan::Select(bool new_only, const std::unordered_set<Network>& networks) const
{
- return m_impl->Select(new_only, network);
+ return m_impl->Select(new_only, networks);
}
std::vector<CAddress> AddrMan::GetAddr(size_t max_addresses, size_t max_pct, std::optional<Network> network, const bool filtered) const
diff --git a/src/addrman.h b/src/addrman.h
index be2ee8c2cb..ba6e13bf97 100644
--- a/src/addrman.h
+++ b/src/addrman.h
@@ -15,6 +15,7 @@
#include <cstdint>
#include <memory>
#include <optional>
+#include <unordered_set>
#include <utility>
#include <vector>
@@ -154,12 +155,12 @@ public:
* an address from the new table or an empty pair. Passing `false` will return an
* empty pair or an address from either the new or tried table (it does not
* guarantee a tried entry).
- * @param[in] network Select only addresses of this network (nullopt = all). Passing a network may
+ * @param[in] networks Select only addresses of these networks (empty = all). Passing networks may
* slow down the search.
* @return CAddress The record for the selected peer.
* seconds The last time we attempted to connect to that peer.
*/
- std::pair<CAddress, NodeSeconds> Select(bool new_only = false, std::optional<Network> network = std::nullopt) const;
+ std::pair<CAddress, NodeSeconds> Select(bool new_only = false, const std::unordered_set<Network>& networks = {}) const;
/**
* Return all or many randomly selected addresses, optionally by network.
diff --git a/src/addrman_impl.h b/src/addrman_impl.h
index dd7f7b318f..a0390b7154 100644
--- a/src/addrman_impl.h
+++ b/src/addrman_impl.h
@@ -33,6 +33,13 @@ static constexpr int32_t ADDRMAN_BUCKET_SIZE_LOG2{6};
static constexpr int ADDRMAN_BUCKET_SIZE{1 << ADDRMAN_BUCKET_SIZE_LOG2};
/**
+ * User-defined type for the internally used nIds
+ * This used to be int, making it feasible for attackers to cause an overflow,
+ * see https://bitcoincore.org/en/2024/07/31/disclose-addrman-int-overflow/
+ */
+using nid_type = int64_t;
+
+/**
* Extended statistics about a CAddress
*/
class AddrInfo : public CAddress
@@ -125,7 +132,7 @@ public:
std::pair<CAddress, NodeSeconds> SelectTriedCollision() EXCLUSIVE_LOCKS_REQUIRED(!cs);
- std::pair<CAddress, NodeSeconds> Select(bool new_only, std::optional<Network> network) const
+ std::pair<CAddress, NodeSeconds> Select(bool new_only, const std::unordered_set<Network>& networks) const
EXCLUSIVE_LOCKS_REQUIRED(!cs);
std::vector<CAddress> GetAddr(size_t max_addresses, size_t max_pct, std::optional<Network> network, const bool filtered = true) const
@@ -179,36 +186,36 @@ private:
static constexpr uint8_t INCOMPATIBILITY_BASE = 32;
//! last used nId
- int nIdCount GUARDED_BY(cs){0};
+ nid_type nIdCount GUARDED_BY(cs){0};
//! table with information about all nIds
- std::unordered_map<int, AddrInfo> mapInfo GUARDED_BY(cs);
+ std::unordered_map<nid_type, AddrInfo> mapInfo GUARDED_BY(cs);
//! find an nId based on its network address and port.
- std::unordered_map<CService, int, CServiceHash> mapAddr GUARDED_BY(cs);
+ std::unordered_map<CService, nid_type, CServiceHash> mapAddr GUARDED_BY(cs);
//! randomly-ordered vector of all nIds
//! This is mutable because it is unobservable outside the class, so any
//! changes to it (even in const methods) are also unobservable.
- mutable std::vector<int> vRandom GUARDED_BY(cs);
+ mutable std::vector<nid_type> vRandom GUARDED_BY(cs);
// number of "tried" entries
int nTried GUARDED_BY(cs){0};
//! list of "tried" buckets
- int vvTried[ADDRMAN_TRIED_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs);
+ nid_type vvTried[ADDRMAN_TRIED_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs);
//! number of (unique) "new" entries
int nNew GUARDED_BY(cs){0};
//! list of "new" buckets
- int vvNew[ADDRMAN_NEW_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs);
+ nid_type vvNew[ADDRMAN_NEW_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs);
//! last time Good was called (memory only). Initially set to 1 so that "never" is strictly worse.
NodeSeconds m_last_good GUARDED_BY(cs){1s};
//! Holds addrs inserted into tried table that collide with existing entries. Test-before-evict discipline used to resolve these collisions.
- std::set<int> m_tried_collisions;
+ std::set<nid_type> m_tried_collisions;
/** Perform consistency checks every m_consistency_check_ratio operations (if non-zero). */
const int32_t m_consistency_check_ratio;
@@ -225,22 +232,22 @@ private:
std::unordered_map<Network, NewTriedCount> m_network_counts GUARDED_BY(cs);
//! Find an entry.
- AddrInfo* Find(const CService& addr, int* pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs);
+ AddrInfo* Find(const CService& addr, nid_type* pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs);
//! Create a new entry and add it to the internal data structures mapInfo, mapAddr and vRandom.
- AddrInfo* Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs);
+ AddrInfo* Create(const CAddress& addr, const CNetAddr& addrSource, nid_type* pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs);
//! Swap two elements in vRandom.
void SwapRandom(unsigned int nRandomPos1, unsigned int nRandomPos2) const EXCLUSIVE_LOCKS_REQUIRED(cs);
//! Delete an entry. It must not be in tried, and have refcount 0.
- void Delete(int nId) EXCLUSIVE_LOCKS_REQUIRED(cs);
+ void Delete(nid_type nId) EXCLUSIVE_LOCKS_REQUIRED(cs);
//! Clear a position in a "new" table. This is the only place where entries are actually deleted.
void ClearNew(int nUBucket, int nUBucketPos) EXCLUSIVE_LOCKS_REQUIRED(cs);
//! Move an entry from the "new" table(s) to the "tried" table
- void MakeTried(AddrInfo& info, int nId) EXCLUSIVE_LOCKS_REQUIRED(cs);
+ void MakeTried(AddrInfo& info, nid_type nId) EXCLUSIVE_LOCKS_REQUIRED(cs);
/** Attempt to add a single address to addrman's new table.
* @see AddrMan::Add() for parameters. */
@@ -252,13 +259,13 @@ private:
void Attempt_(const CService& addr, bool fCountFailure, NodeSeconds time) EXCLUSIVE_LOCKS_REQUIRED(cs);
- std::pair<CAddress, NodeSeconds> Select_(bool new_only, std::optional<Network> network) const EXCLUSIVE_LOCKS_REQUIRED(cs);
+ std::pair<CAddress, NodeSeconds> Select_(bool new_only, const std::unordered_set<Network>& networks) const EXCLUSIVE_LOCKS_REQUIRED(cs);
/** Helper to generalize looking up an addrman entry from either table.
*
- * @return int The nid of the entry. If the addrman position is empty or not found, returns -1.
+ * @return nid_type The nid of the entry. If the addrman position is empty or not found, returns -1.
* */
- int GetEntry(bool use_tried, size_t bucket, size_t position) const EXCLUSIVE_LOCKS_REQUIRED(cs);
+ nid_type GetEntry(bool use_tried, size_t bucket, size_t position) const EXCLUSIVE_LOCKS_REQUIRED(cs);
std::vector<CAddress> GetAddr_(size_t max_addresses, size_t max_pct, std::optional<Network> network, const bool filtered = true) const EXCLUSIVE_LOCKS_REQUIRED(cs);
diff --git a/src/arith_uint256.h b/src/arith_uint256.h
index ba36cebbdc..38b7453034 100644
--- a/src/arith_uint256.h
+++ b/src/arith_uint256.h
@@ -43,8 +43,10 @@ public:
base_uint& operator=(const base_uint& b)
{
- for (int i = 0; i < WIDTH; i++)
- pn[i] = b.pn[i];
+ if (this != &b) {
+ for (int i = 0; i < WIDTH; i++)
+ pn[i] = b.pn[i];
+ }
return *this;
}
@@ -194,6 +196,7 @@ public:
return ret;
}
+ /** Numeric ordering (unlike \ref base_blob::Compare) */
int CompareTo(const base_uint& b) const;
bool EqualTo(uint64_t b) const;
@@ -216,6 +219,7 @@ public:
friend inline bool operator==(const base_uint& a, uint64_t b) { return a.EqualTo(b); }
friend inline bool operator!=(const base_uint& a, uint64_t b) { return !a.EqualTo(b); }
+ /** Hex encoding of the number (with the most significant digits first). */
std::string GetHex() const;
std::string ToString() const;
@@ -240,7 +244,7 @@ public:
/** 256-bit unsigned big integer. */
class arith_uint256 : public base_uint<256> {
public:
- arith_uint256() {}
+ arith_uint256() = default;
arith_uint256(const base_uint<256>& b) : base_uint<256>(b) {}
arith_uint256(uint64_t b) : base_uint<256>(b) {}
diff --git a/src/banman.cpp b/src/banman.cpp
index 9f668d76a3..2dbfc76df2 100644
--- a/src/banman.cpp
+++ b/src/banman.cpp
@@ -36,7 +36,7 @@ void BanMan::LoadBanlist()
if (m_ban_db.Read(m_banned)) {
SweepBanned(); // sweep out unused entries
- LogPrint(BCLog::NET, "Loaded %d banned node addresses/subnets %dms\n", m_banned.size(),
+ LogDebug(BCLog::NET, "Loaded %d banned node addresses/subnets %dms\n", m_banned.size(),
Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
} else {
LogPrintf("Recreating the banlist database\n");
@@ -65,7 +65,7 @@ void BanMan::DumpBanlist()
m_is_dirty = true;
}
- LogPrint(BCLog::NET, "Flushed %d banned node addresses/subnets to disk %dms\n", banmap.size(),
+ LogDebug(BCLog::NET, "Flushed %d banned node addresses/subnets to disk %dms\n", banmap.size(),
Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
}
@@ -193,7 +193,7 @@ void BanMan::SweepBanned()
m_banned.erase(it++);
m_is_dirty = true;
notify_ui = true;
- LogPrint(BCLog::NET, "Removed banned node address/subnet: %s\n", sub_net.ToString());
+ LogDebug(BCLog::NET, "Removed banned node address/subnet: %s\n", sub_net.ToString());
} else {
++it;
}
diff --git a/src/bech32.cpp b/src/bech32.cpp
index d8d31a415c..5694ad54c8 100644
--- a/src/bech32.cpp
+++ b/src/bech32.cpp
@@ -19,9 +19,6 @@ namespace
typedef std::vector<uint8_t> data;
-/** The Bech32 and Bech32m checksum size */
-constexpr size_t CHECKSUM_SIZE = 6;
-
/** The Bech32 and Bech32m character set for encoding. */
const char* CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
diff --git a/src/bech32.h b/src/bech32.h
index fe2a276ae0..33d1ca1935 100644
--- a/src/bech32.h
+++ b/src/bech32.h
@@ -21,6 +21,9 @@
namespace bech32
{
+/** The Bech32 and Bech32m checksum size */
+constexpr size_t CHECKSUM_SIZE = 6;
+
enum class Encoding {
INVALID, //!< Failed decoding
diff --git a/src/bench/.gitignore b/src/bench/.gitignore
deleted file mode 100644
index e231fe4cab..0000000000
--- a/src/bench/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-bench_bitcoin
diff --git a/src/bench/CMakeLists.txt b/src/bench/CMakeLists.txt
new file mode 100644
index 0000000000..8a52980e07
--- /dev/null
+++ b/src/bench/CMakeLists.txt
@@ -0,0 +1,84 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+include(GenerateHeaders)
+generate_header_from_raw(data/block413567.raw benchmark::data)
+
+add_executable(bench_bitcoin
+ bench_bitcoin.cpp
+ bench.cpp
+ nanobench.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/data/block413567.raw.h
+# Benchmarks:
+ addrman.cpp
+ base58.cpp
+ bech32.cpp
+ bip324_ecdh.cpp
+ block_assemble.cpp
+ ccoins_caching.cpp
+ chacha20.cpp
+ checkblock.cpp
+ checkblockindex.cpp
+ checkqueue.cpp
+ cluster_linearize.cpp
+ crypto_hash.cpp
+ descriptors.cpp
+ disconnected_transactions.cpp
+ duplicate_inputs.cpp
+ ellswift.cpp
+ examples.cpp
+ gcs_filter.cpp
+ hashpadding.cpp
+ index_blockfilter.cpp
+ load_external.cpp
+ lockedpool.cpp
+ logging.cpp
+ mempool_eviction.cpp
+ mempool_stress.cpp
+ merkle_root.cpp
+ parse_hex.cpp
+ peer_eviction.cpp
+ poly1305.cpp
+ pool.cpp
+ prevector.cpp
+ random.cpp
+ readblock.cpp
+ rollingbloom.cpp
+ rpc_blockchain.cpp
+ rpc_mempool.cpp
+ sign_transaction.cpp
+ streams_findbyte.cpp
+ strencodings.cpp
+ util_time.cpp
+ verify_script.cpp
+ xor.cpp
+)
+
+target_link_libraries(bench_bitcoin
+ core_interface
+ test_util
+ bitcoin_node
+ Boost::headers
+)
+
+if(ENABLE_WALLET)
+ target_sources(bench_bitcoin
+ PRIVATE
+ coin_selection.cpp
+ wallet_balance.cpp
+ wallet_create.cpp
+ wallet_create_tx.cpp
+ wallet_loading.cpp
+ wallet_ismine.cpp
+ )
+ target_link_libraries(bench_bitcoin bitcoin_wallet)
+endif()
+
+add_test(NAME bench_sanity_check_high_priority
+ COMMAND bench_bitcoin -sanity-check -priority-level=high
+)
+
+install(TARGETS bench_bitcoin
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
diff --git a/src/bench/addrman.cpp b/src/bench/addrman.cpp
index f044feebba..ceef6c29ab 100644
--- a/src/bench/addrman.cpp
+++ b/src/bench/addrman.cpp
@@ -4,12 +4,18 @@
#include <addrman.h>
#include <bench/bench.h>
+#include <compat/compat.h>
+#include <netaddress.h>
#include <netbase.h>
#include <netgroup.h>
+#include <protocol.h>
#include <random.h>
+#include <span.h>
+#include <uint256.h>
#include <util/check.h>
#include <util/time.h>
+#include <cstring>
#include <optional>
#include <vector>
@@ -127,7 +133,7 @@ static void AddrManSelectByNetwork(benchmark::Bench& bench)
FillAddrMan(addrman);
bench.run([&] {
- (void)addrman.Select(/*new_only=*/false, NET_I2P);
+ (void)addrman.Select(/*new_only=*/false, {NET_I2P});
});
}
diff --git a/src/bench/base58.cpp b/src/bench/base58.cpp
index 78748bc5bd..f078c33964 100644
--- a/src/bench/base58.cpp
+++ b/src/bench/base58.cpp
@@ -2,11 +2,12 @@
// 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 <base58.h>
+#include <bench/bench.h>
+#include <span.h>
#include <array>
+#include <cstring>
#include <vector>
diff --git a/src/bench/bech32.cpp b/src/bench/bech32.cpp
index 9922653766..6aa73bd056 100644
--- a/src/bench/bech32.cpp
+++ b/src/bench/bech32.cpp
@@ -2,20 +2,19 @@
// 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 <bech32.h>
+#include <bench/bench.h>
#include <util/strencodings.h>
-#include <string>
#include <vector>
+using namespace util::hex_literals;
static void Bech32Encode(benchmark::Bench& bench)
{
- std::vector<uint8_t> v = ParseHex("c97f5a67ec381b760aeaf67573bc164845ff39a3bb26a1cee401ac67243b48db");
+ constexpr std::array<uint8_t, 32> v{"c97f5a67ec381b760aeaf67573bc164845ff39a3bb26a1cee401ac67243b48db"_hex_u8};
std::vector<unsigned char> tmp = {0};
- tmp.reserve(1 + 32 * 8 / 5);
+ tmp.reserve(1 + v.size() * 8 / 5);
ConvertBits<8, 5, true>([&](unsigned char c) { tmp.push_back(c); }, v.begin(), v.end());
bench.batch(v.size()).unit("byte").run([&] {
bech32::Encode(bech32::Encoding::BECH32, "bc", tmp);
diff --git a/src/bench/bench.cpp b/src/bench/bench.cpp
index 733f8085ca..a2dbb11888 100644
--- a/src/bench/bench.cpp
+++ b/src/bench/bench.cpp
@@ -4,16 +4,21 @@
#include <bench/bench.h>
-#include <test/util/setup_common.h>
+#include <test/util/setup_common.h> // IWYU pragma: keep
+#include <tinyformat.h>
#include <util/fs.h>
#include <util/string.h>
#include <chrono>
+#include <compare>
#include <fstream>
#include <functional>
#include <iostream>
#include <map>
+#include <ratio>
#include <regex>
+#include <set>
+#include <stdexcept>
#include <string>
#include <vector>
diff --git a/src/bench/bench.h b/src/bench/bench.h
index 6065ddf3fc..f0705f4fed 100644
--- a/src/bench/bench.h
+++ b/src/bench/bench.h
@@ -5,17 +5,18 @@
#ifndef BITCOIN_BENCH_BENCH_H
#define BITCOIN_BENCH_BENCH_H
+#include <bench/nanobench.h> // IWYU pragma: export
#include <util/fs.h>
#include <util/macros.h>
#include <chrono>
+#include <cstdint>
#include <functional>
#include <map>
#include <string>
+#include <utility>
#include <vector>
-#include <bench/nanobench.h> // IWYU pragma: export
-
/*
* Usage:
diff --git a/src/bench/bench_bitcoin.cpp b/src/bench/bench_bitcoin.cpp
index a1b880e40b..555dca7d59 100644
--- a/src/bench/bench_bitcoin.cpp
+++ b/src/bench/bench_bitcoin.cpp
@@ -3,15 +3,16 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
-#include <clientversion.h>
#include <common/args.h>
#include <crypto/sha256.h>
+#include <tinyformat.h>
#include <util/fs.h>
-#include <util/strencodings.h>
+#include <util/string.h>
#include <chrono>
#include <cstdint>
+#include <cstdlib>
+#include <exception>
#include <iostream>
#include <sstream>
#include <vector>
diff --git a/src/bench/bip324_ecdh.cpp b/src/bench/bip324_ecdh.cpp
index 88f3932ad8..e6a614dadf 100644
--- a/src/bench/bip324_ecdh.cpp
+++ b/src/bench/bip324_ecdh.cpp
@@ -3,12 +3,12 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
#include <key.h>
#include <pubkey.h>
#include <random.h>
#include <span.h>
+#include <algorithm>
#include <array>
#include <cstddef>
diff --git a/src/bench/block_assemble.cpp b/src/bench/block_assemble.cpp
index ba8ec16119..4005701cae 100644
--- a/src/bench/block_assemble.cpp
+++ b/src/bench/block_assemble.cpp
@@ -3,17 +3,21 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <consensus/validation.h>
-#include <crypto/sha256.h>
+#include <consensus/consensus.h>
#include <node/miner.h>
+#include <primitives/transaction.h>
#include <random.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/mining.h>
#include <test/util/script.h>
#include <test/util/setup_common.h>
-#include <txmempool.h>
#include <validation.h>
-
+#include <array>
+#include <cassert>
+#include <cstddef>
+#include <memory>
#include <vector>
static void AssembleBlock(benchmark::Bench& bench)
diff --git a/src/bench/ccoins_caching.cpp b/src/bench/ccoins_caching.cpp
index 05b2f5435c..351861536c 100644
--- a/src/bench/ccoins_caching.cpp
+++ b/src/bench/ccoins_caching.cpp
@@ -4,10 +4,15 @@
#include <bench/bench.h>
#include <coins.h>
+#include <consensus/amount.h>
+#include <key.h>
#include <policy/policy.h>
+#include <primitives/transaction.h>
+#include <script/script.h>
#include <script/signingprovider.h>
#include <test/util/transaction_utils.h>
+#include <cassert>
#include <vector>
// Microbenchmark for simple accesses to a CCoinsViewCache database. Note from
diff --git a/src/bench/chacha20.cpp b/src/bench/chacha20.cpp
index e0bb07d8be..f154d8c6be 100644
--- a/src/bench/chacha20.cpp
+++ b/src/bench/chacha20.cpp
@@ -6,6 +6,11 @@
#include <bench/bench.h>
#include <crypto/chacha20.h>
#include <crypto/chacha20poly1305.h>
+#include <span.h>
+
+#include <cstddef>
+#include <cstdint>
+#include <vector>
/* Number of bytes to process per iteration */
static const uint64_t BUFFER_SIZE_TINY = 64;
diff --git a/src/bench/checkblock.cpp b/src/bench/checkblock.cpp
index b81878006c..9558d64f19 100644
--- a/src/bench/checkblock.cpp
+++ b/src/bench/checkblock.cpp
@@ -3,15 +3,24 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
-
+#include <bench/data/block413567.raw.h>
#include <chainparams.h>
#include <common/args.h>
#include <consensus/validation.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <serialize.h>
+#include <span.h>
#include <streams.h>
#include <util/chaintype.h>
#include <validation.h>
+#include <cassert>
+#include <cstddef>
+#include <memory>
+#include <optional>
+#include <vector>
+
// These are the two major time-sinks which happen after we have fully received
// a block off the wire, but before we can relay the block on to peers using
// compact block relay.
diff --git a/src/bench/checkblockindex.cpp b/src/bench/checkblockindex.cpp
index e8a848dbd4..a5c152b387 100644
--- a/src/bench/checkblockindex.cpp
+++ b/src/bench/checkblockindex.cpp
@@ -6,6 +6,8 @@
#include <test/util/setup_common.h>
#include <validation.h>
+#include <memory>
+
static void CheckBlockIndex(benchmark::Bench& bench)
{
auto testing_setup{MakeNoLogFileContext<TestChain100Setup>()};
diff --git a/src/bench/checkqueue.cpp b/src/bench/checkqueue.cpp
index c973fe9f71..d1454f3634 100644
--- a/src/bench/checkqueue.cpp
+++ b/src/bench/checkqueue.cpp
@@ -7,9 +7,11 @@
#include <common/system.h>
#include <key.h>
#include <prevector.h>
-#include <pubkey.h>
#include <random.h>
+#include <cstddef>
+#include <cstdint>
+#include <utility>
#include <vector>
static const size_t BATCHES = 101;
diff --git a/src/bench/cluster_linearize.cpp b/src/bench/cluster_linearize.cpp
new file mode 100644
index 0000000000..cf071dda2d
--- /dev/null
+++ b/src/bench/cluster_linearize.cpp
@@ -0,0 +1,419 @@
+// 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.
+
+#include <bench/bench.h>
+#include <cluster_linearize.h>
+#include <test/util/cluster_linearize.h>
+#include <util/bitset.h>
+#include <util/strencodings.h>
+
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <vector>
+
+using namespace cluster_linearize;
+using namespace util::hex_literals;
+
+namespace {
+
+/** Construct a linear graph. These are pessimal for AncestorCandidateFinder, as they maximize
+ * the number of ancestor set feerate updates. The best ancestor set is always the topmost
+ * remaining transaction, whose removal requires updating all remaining transactions' ancestor
+ * set feerates. */
+template<typename SetType>
+DepGraph<SetType> MakeLinearGraph(ClusterIndex ntx)
+{
+ DepGraph<SetType> depgraph;
+ for (ClusterIndex i = 0; i < ntx; ++i) {
+ depgraph.AddTransaction({-int32_t(i), 1});
+ if (i > 0) depgraph.AddDependency(i - 1, i);
+ }
+ return depgraph;
+}
+
+/** Construct a wide graph (one root, with N-1 children that are otherwise unrelated, with
+ * increasing feerates). These graphs are pessimal for the LIMO step in Linearize, because
+ * rechunking is needed after every candidate (the last transaction gets picked every time).
+ */
+template<typename SetType>
+DepGraph<SetType> MakeWideGraph(ClusterIndex ntx)
+{
+ DepGraph<SetType> depgraph;
+ for (ClusterIndex i = 0; i < ntx; ++i) {
+ depgraph.AddTransaction({int32_t(i) + 1, 1});
+ if (i > 0) depgraph.AddDependency(0, i);
+ }
+ return depgraph;
+}
+
+// Construct a difficult graph. These need at least sqrt(2^(n-1)) iterations in the implemented
+// algorithm (purely empirically determined).
+template<typename SetType>
+DepGraph<SetType> MakeHardGraph(ClusterIndex ntx)
+{
+ DepGraph<SetType> depgraph;
+ for (ClusterIndex i = 0; i < ntx; ++i) {
+ if (ntx & 1) {
+ // Odd cluster size.
+ //
+ // Mermaid diagram code for the resulting cluster for 11 transactions:
+ // ```mermaid
+ // graph BT
+ // T0["T0: 1/2"];T1["T1: 14/2"];T2["T2: 6/1"];T3["T3: 5/1"];T4["T4: 7/1"];
+ // T5["T5: 5/1"];T6["T6: 7/1"];T7["T7: 5/1"];T8["T8: 7/1"];T9["T9: 5/1"];
+ // T10["T10: 7/1"];
+ // T1-->T0;T1-->T2;T3-->T2;T4-->T3;T4-->T5;T6-->T5;T4-->T7;T8-->T7;T4-->T9;T10-->T9;
+ // ```
+ if (i == 0) {
+ depgraph.AddTransaction({1, 2});
+ } else if (i == 1) {
+ depgraph.AddTransaction({14, 2});
+ depgraph.AddDependency(0, 1);
+ } else if (i == 2) {
+ depgraph.AddTransaction({6, 1});
+ depgraph.AddDependency(2, 1);
+ } else if (i == 3) {
+ depgraph.AddTransaction({5, 1});
+ depgraph.AddDependency(2, 3);
+ } else if ((i & 1) == 0) {
+ depgraph.AddTransaction({7, 1});
+ depgraph.AddDependency(i - 1, i);
+ } else {
+ depgraph.AddTransaction({5, 1});
+ depgraph.AddDependency(i, 4);
+ }
+ } else {
+ // Even cluster size.
+ //
+ // Mermaid diagram code for the resulting cluster for 10 transactions:
+ // ```mermaid
+ // graph BT
+ // T0["T0: 1"];T1["T1: 3"];T2["T2: 1"];T3["T3: 4"];T4["T4: 0"];T5["T5: 4"];T6["T6: 0"];
+ // T7["T7: 4"];T8["T8: 0"];T9["T9: 4"];
+ // T1-->T0;T2-->T0;T3-->T2;T3-->T4;T5-->T4;T3-->T6;T7-->T6;T3-->T8;T9-->T8;
+ // ```
+ if (i == 0) {
+ depgraph.AddTransaction({1, 1});
+ } else if (i == 1) {
+ depgraph.AddTransaction({3, 1});
+ depgraph.AddDependency(0, 1);
+ } else if (i == 2) {
+ depgraph.AddTransaction({1, 1});
+ depgraph.AddDependency(0, 2);
+ } else if (i & 1) {
+ depgraph.AddTransaction({4, 1});
+ depgraph.AddDependency(i - 1, i);
+ } else {
+ depgraph.AddTransaction({0, 1});
+ depgraph.AddDependency(i, 3);
+ }
+ }
+ }
+ return depgraph;
+}
+
+/** Benchmark that does search-based candidate finding with a specified number of iterations.
+ *
+ * Its goal is measuring how much time every additional search iteration in linearization costs,
+ * by running with a low and a high count, subtracting the results, and divided by the number
+ * iterations difference.
+ */
+template<typename SetType>
+void BenchLinearizeWorstCase(ClusterIndex ntx, benchmark::Bench& bench, uint64_t iter_limit)
+{
+ const auto depgraph = MakeHardGraph<SetType>(ntx);
+ uint64_t rng_seed = 0;
+ bench.run([&] {
+ SearchCandidateFinder finder(depgraph, rng_seed++);
+ auto [candidate, iters_performed] = finder.FindCandidateSet(iter_limit, {});
+ assert(iters_performed == iter_limit);
+ });
+}
+
+/** Benchmark for linearization improvement of a trivial linear graph using just ancestor sort.
+ *
+ * Its goal is measuring how much time linearization may take without any search iterations.
+ *
+ * If P is the benchmarked per-iteration count (obtained by running BenchLinearizeWorstCase for a
+ * high and a low iteration count, subtracting them, and dividing by the difference in count), and
+ * N is the resulting time of BenchLinearizeNoItersWorstCase*, then an invocation of Linearize with
+ * max_iterations=m should take no more than roughly N+m*P time. This may however be an
+ * overestimate, as the worst cases do not coincide (the ones that are worst for linearization
+ * without any search happen to be ones that do not need many search iterations).
+ *
+ * This benchmark exercises a worst case for AncestorCandidateFinder, but for which improvement is
+ * cheap.
+ */
+template<typename SetType>
+void BenchLinearizeNoItersWorstCaseAnc(ClusterIndex ntx, benchmark::Bench& bench)
+{
+ const auto depgraph = MakeLinearGraph<SetType>(ntx);
+ uint64_t rng_seed = 0;
+ std::vector<ClusterIndex> old_lin(ntx);
+ for (ClusterIndex i = 0; i < ntx; ++i) old_lin[i] = i;
+ bench.run([&] {
+ Linearize(depgraph, /*max_iterations=*/0, rng_seed++, old_lin);
+ });
+}
+
+/** Benchmark for linearization improvement of a trivial wide graph using just ancestor sort.
+ *
+ * Its goal is measuring how much time improving a linearization may take without any search
+ * iterations, similar to the previous function.
+ *
+ * This benchmark exercises a worst case for improving an existing linearization, but for which
+ * AncestorCandidateFinder is cheap.
+ */
+template<typename SetType>
+void BenchLinearizeNoItersWorstCaseLIMO(ClusterIndex ntx, benchmark::Bench& bench)
+{
+ const auto depgraph = MakeWideGraph<SetType>(ntx);
+ uint64_t rng_seed = 0;
+ std::vector<ClusterIndex> old_lin(ntx);
+ for (ClusterIndex i = 0; i < ntx; ++i) old_lin[i] = i;
+ bench.run([&] {
+ Linearize(depgraph, /*max_iterations=*/0, rng_seed++, old_lin);
+ });
+}
+
+template<typename SetType>
+void BenchPostLinearizeWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
+{
+ DepGraph<SetType> depgraph = MakeWideGraph<SetType>(ntx);
+ std::vector<ClusterIndex> lin(ntx);
+ bench.run([&] {
+ for (ClusterIndex i = 0; i < ntx; ++i) lin[i] = i;
+ PostLinearize(depgraph, lin);
+ });
+}
+
+template<typename SetType>
+void BenchMergeLinearizationsWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
+{
+ DepGraph<SetType> depgraph;
+ for (ClusterIndex i = 0; i < ntx; ++i) {
+ depgraph.AddTransaction({i, 1});
+ if (i) depgraph.AddDependency(0, i);
+ }
+ std::vector<ClusterIndex> lin1;
+ std::vector<ClusterIndex> lin2;
+ lin1.push_back(0);
+ lin2.push_back(0);
+ for (ClusterIndex i = 1; i < ntx; ++i) {
+ lin1.push_back(i);
+ lin2.push_back(ntx - i);
+ }
+ bench.run([&] {
+ MergeLinearizations(depgraph, lin1, lin2);
+ });
+}
+
+template<size_t N>
+void BenchLinearizeOptimally(benchmark::Bench& bench, const std::array<uint8_t, N>& serialized)
+{
+ // Determine how many transactions the serialized cluster has.
+ ClusterIndex num_tx{0};
+ {
+ SpanReader reader{serialized};
+ DepGraph<BitSet<128>> depgraph;
+ reader >> Using<DepGraphFormatter>(depgraph);
+ num_tx = depgraph.TxCount();
+ assert(num_tx < 128);
+ }
+
+ SpanReader reader{serialized};
+ auto runner_fn = [&]<typename SetType>() noexcept {
+ DepGraph<SetType> depgraph;
+ reader >> Using<DepGraphFormatter>(depgraph);
+ uint64_t rng_seed = 0;
+ bench.run([&] {
+ auto res = Linearize(depgraph, /*max_iterations=*/10000000, rng_seed++);
+ assert(res.second);
+ });
+ };
+
+ if (num_tx <= 32) {
+ runner_fn.template operator()<BitSet<32>>();
+ } else if (num_tx <= 64) {
+ runner_fn.template operator()<BitSet<64>>();
+ } else if (num_tx <= 96) {
+ runner_fn.template operator()<BitSet<96>>();
+ } else if (num_tx <= 128) {
+ runner_fn.template operator()<BitSet<128>>();
+ } else {
+ assert(false);
+ }
+}
+
+} // namespace
+
+static void Linearize16TxWorstCase20Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<16>>(16, bench, 20); }
+static void Linearize16TxWorstCase120Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<16>>(16, bench, 120); }
+static void Linearize32TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<32>>(32, bench, 5000); }
+static void Linearize32TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<32>>(32, bench, 15000); }
+static void Linearize48TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<48>>(48, bench, 5000); }
+static void Linearize48TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<48>>(48, bench, 15000); }
+static void Linearize64TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<64>>(64, bench, 5000); }
+static void Linearize64TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<64>>(64, bench, 15000); }
+static void Linearize75TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<75>>(75, bench, 5000); }
+static void Linearize75TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<75>>(75, bench, 15000); }
+static void Linearize99TxWorstCase5000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<99>>(99, bench, 5000); }
+static void Linearize99TxWorstCase15000Iters(benchmark::Bench& bench) { BenchLinearizeWorstCase<BitSet<99>>(99, bench, 15000); }
+
+static void LinearizeNoIters16TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<16>>(16, bench); }
+static void LinearizeNoIters32TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<32>>(32, bench); }
+static void LinearizeNoIters48TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<48>>(48, bench); }
+static void LinearizeNoIters64TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<64>>(64, bench); }
+static void LinearizeNoIters75TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<75>>(75, bench); }
+static void LinearizeNoIters99TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<99>>(99, bench); }
+
+static void LinearizeNoIters16TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<16>>(16, bench); }
+static void LinearizeNoIters32TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<32>>(32, bench); }
+static void LinearizeNoIters48TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<48>>(48, bench); }
+static void LinearizeNoIters64TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<64>>(64, bench); }
+static void LinearizeNoIters75TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<75>>(75, bench); }
+static void LinearizeNoIters99TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<99>>(99, bench); }
+
+static void PostLinearize16TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<16>>(16, bench); }
+static void PostLinearize32TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<32>>(32, bench); }
+static void PostLinearize48TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<48>>(48, bench); }
+static void PostLinearize64TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<64>>(64, bench); }
+static void PostLinearize75TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<75>>(75, bench); }
+static void PostLinearize99TxWorstCase(benchmark::Bench& bench) { BenchPostLinearizeWorstCase<BitSet<99>>(99, bench); }
+
+static void MergeLinearizations16TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<16>>(16, bench); }
+static void MergeLinearizations32TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<32>>(32, bench); }
+static void MergeLinearizations48TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<48>>(48, bench); }
+static void MergeLinearizations64TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<64>>(64, bench); }
+static void MergeLinearizations75TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<75>>(75, bench); }
+static void MergeLinearizations99TxWorstCase(benchmark::Bench& bench) { BenchMergeLinearizationsWorstCase<BitSet<99>>(99, bench); }
+
+// The following example clusters were constructed by replaying historical mempool activity, and
+// selecting for ones that take many iterations (after the introduction of some but not all
+// linearization algorithm optimizations).
+
+/* 2023-05-05T23:12:21Z 71, 521780, 543141,*/
+static constexpr auto BENCH_EXAMPLE_00 = "801081a5360092239efc6201810982ab58029b6b98c86803800eed7804800ecb7e058f2f878778068030d43407853e81902a08962a81d176098010b6620a8010b2280b8010da3a0c9f069da9580d800db11e0e9d719ad37a0f967897ed5210990e99fc0e11812c81982012804685823e0f0a893982b6040a10804682c146110a6e80db5c120a8010819806130a8079858f0c140a8054829a120c12803483a1760c116f81843c0d11718189000e11800d81ac2c0f11800d81e50e10117181c77c1111822e87f2601012815983d17211127180f2121212811584a21e1312800e80d1781412813c83e81815126f80ef5016126f80ff6c16126f80f66017126e80fd541812800d81942a1912800e80dd781a12800d81f96c1b12805282e7581b127180fd721c1271a918230b805fc11a220d8118a15a2d036f80e5002011817684d8241e346f80e1181c37805082fc04260024800d81f8621734803382b354270b12805182ca2e162f800e80d52e0d32803dc360201b850e818c400b318c49808a5a290210805181d65823142a800d81a34e0850800e81fb3c0851886994fc0a280b00082c805482d208032e28805e83ba380059801081cd4a0159811884f770002e0015e17280e49024300a0000000000000031803dcb48014200"_hex_u8;
+/* 2023-12-06T09:30:01Z 81, 141675, 647053,*/
+static constexpr auto BENCH_EXAMPLE_01 = "b348f1fc4000f365818a9e2c01b44cf7ca0002b004f0b02003b33ef8ae3004b334f9e87005800d81c85e06b368fae26007b05ef2e14208be1a8093a50409b15cf5ee500a802c80a1420b802dea440c802ce50a0d802cdc320e802cd7220f802dd72210805380f74a118174f370126e96b32812127182c4701312817389d26414128035848c221512800e82bf3816126f81e4341712801082b228181280518af57418128040859a0019127182d0401a12803e858b641b127182c4421c126f82b3481d12811486b6301e12821d89e7281f126e8a8b421f127182d6642012806284c12021126e81d34822126e86a76222126e86d8102212805187b6542312800d82fc002412803d848e0e2512801082d27a26126e8589642612800e83a9602712800e83bd0028126e81ef1a29116e858d7228126f82db5e2912801083843c2a127181c93c2b126e85d0162b127181c5622c126e84f8262c12800f8392202d12800e82b66c2e126e81d0082f12803282d50430126e84f9003012805f84be6c3112846e88df0e2b12804080d44c340a8b31898808350a800ed760350b801083a1182b517182817e2a51800e82b6582951803583cb52420030806284cb6c204f7181d300204f82688ce0303e001d800e82bb200f488010808a182822a3289cd63041000a6fcd100a408a7caaa7024800002f803584e0741e27288f3386dd783b001000802683f27e004b8c44bcd0763f0000000000000000000100000e00"_hex_u8;
+/* 2023-04-04T00:26:50Z 90, 99930, 529375,*/
+static constexpr auto BENCH_EXAMPLE_02 = "815b80b61e00800da63001cd378da70e028010991a03800e9d3e0480109708058010991a068010973a07da738fa72408de7491831009b35b88f0080a9d4485de180b71974e0c71974e0d80108e500eb27988a75a0f719632108061a56c11801087761280108a1413807893441480538c1415a606828806168010893e1780548c40188e4b80bb2c196eab3e1718805ed60e18188051c97a19188010cf781a1871b11e1b1871c5281c1880508080581d186e80b13c1e188035cf421f18805fe0482018804caa661f198035a9001f156e80cb701d1871a2281e1871ad281f18817380a16020186f98642118805ee04821198010b6702219800ea12623196eb67024198035808b0025196fa65c26198054ba1c2719807680bf7c28198053cd782919803d80b80429198051db5a2a198040d3742b19976584bb1c28196efc1c281971b21a29198052bc762a1971a2502b196eb73c2c19976381ab0c2a18806290543409862081c3423b00336fbc70224d80109e7c1c52805ebd5c1942800eb57016468034ba423405158118da28350416927480f4743000159f6a81c9462e00188051ec5e380e00800e9e420775800d9e26007c906c82f754251d0025870480f12c14280023800d9e26027e9e1385ed08102900001a804fac7a018001719856028001800da87e0180039b1a868b60064102246e9f42018005800da87e028005850d81d600026d862381a2200e0008230015831480a5480342000524803eeb32006e873582a4700a0100351300"_hex_u8;
+/* 2023-05-08T15:51:59Z 87, 76869, 505222,*/
+static constexpr auto BENCH_EXAMPLE_03 = "c040b9e15a00b10eac842601805f85931802c104bae17403ae50aaa336049d76a9bf7005c55bbeab6606ae2aa9c72c07805e81992e08af7dab817a096e80a7e4520909803e92bd780a097185c76c0b096e98e7380b09850bb9953c0c09803389f6260d096f859d620e09803f88d3000f0971829c6e1009837690f6481109806285931811097181f56814076ea09b74120980408eb73213096f87853214096f86e2701509803f8c860016098a6fe6c3721709814f92a204180980628a8a441909803285df681a0980348498661b096e8290781c096e978e081c097187da1a1d097186c05c1e097185893c1f09805f8ad9002009800d84e74e21097183a67a22097182e23423097184b53a23096ea393062309840faddd46240980618eb732250980548bee6a2609807986883c2709718298402809815388b6582909805384ec742a097181b9142b096e97b5262b096e85e14e2c0980518abb5c2d09805489e75a2e09803187e3382f097180eb1c34046f87c34a2f098309a5c54430097186911831098054899c083209801083bc1033097081e02a3409805f848f0c35096e80d4343a057180c37040006f80a22438097180a0503f03816f8381444003803f80ef003f05800580a4283f066ef72845016efb91663e09923d808d8216470041803584837c46012f9247dc86684501268267a09610450222862184db68440712803585ea40440113835d97887805800b8723c7a40a4b00022f81529ae2143c0c1f80548b8f381b311980408e955c055e802589dc10037e801083b54602658010848130006700"_hex_u8;
+/* 2023-05-01T19:32:10Z 35, 55747, 504128,*/
+static constexpr auto BENCH_EXAMPLE_04 = "801af95c00801af72801801af95c02873e85f2180202873e85f2180202873e85f21802028018fb2802068018fb2803068018fb2804068018fb2805068018fb2806068018fb2807068018fb2808068018fb2809068018fb280a068018fb280a058018fb280b058018fb280c058018fb280d058018fb280e058018fb280f058018fb2810058018fb2811058018fb2812058018fb2813058018fb2814058018fb2815058018fb2815048018fb2816048018fb2817048018fb2818048018fb2819048018fb281a048018fb281b04810d80d9481f00000100"_hex_u8;
+/* 2023-02-27T17:06:38Z 60, 55680, 502749,*/
+static constexpr auto BENCH_EXAMPLE_05 = "b5108ab56600b26d89f85601b07383b01602b22683c96003b34a83d82e04b12f83b53a05b20e83c75a066e80840a06068040be0007066fb10608066fb2120906800eba320a06842b80b05a0a066eff420b067199300b068124c3140c0680618085180d066faa1c0e068010b4440f068051af541006800da1781106857881946812066eee1613068052b31014068324808d361506806180885c150671b03216066ef11017068052b63218066ef3521806803f80865419066e93441a068035a13e1b0680628085181c06806ec4481d068117e72c1e06719c721f068077c42420068159808d1821066eef0c21058010b90022056f9908230571993024058010b00a25058010b00a260580608087402705803fc10027068032b42828068051b6322906800db11e212a8324808d361933803ff400192f826381a7141a2f8032ac08152a800db54c044e8323808d3630010002018158d84000042d821cea12002807853580d462002d01891181d022002e00"_hex_u8;
+/* 2023-04-20T22:25:49Z 99, 49100, 578622,*/
+static constexpr auto BENCH_EXAMPLE_06 = "bf3c87c14c008010955a01b21d85e07002800d946c036e8e3404b77f86c26605b33c85f55e06bd06879852078010970a08bd4b87cf00098123a7720ab2158687680b8054d4440b0a8062fa4c0c0a71ac400d0a80628081540e0a8010a2580f0a8054b676100a8032b85c110a6e9a40120a6e809012130a817f80c31e140a8175808674150a719d46160a8172d86415098033c1481609800da4181709800ada2e1809803dc85219098034b4041a096ef5501b098052d67c1c098051d3281d09800ebc4a1e098175808c641f098061c55020098078c85021096e8081141f0b6faf1e200b8061da68210b8062f000220b800ebc20230b8035d058240b8053de32250b8050b610250b6fad32260b803dc276270b803d80a610280b6ef812290b8052b6322a0b800eb57e2b0b8052bd062c0b719e522d0b71a3762e0b8010bb1e2f0b80109a78310a80109962320a8051a60c330a6f9f3e320b6e808b24330b719e40340b8117cc50350b803d80971a360b8051b930370b6f9e0a380b719b10390b8052a6003a0b6e808c76390a7195603a0a6f935c3b0a8054a31a3c0a803ce30c3b0b803fa3003c0b800dbe2a3d0b8f3480a84244058005851a44069d1bf824400b83098f284507719c723d4f6f9c1c3449719c722f4f6eb23c304f8061c5502e528061da682b4e8118bb724e022a8054b35028476e941c1d51815be02c4f01148557808e3a4f070e8104af464e001180329d364e010d805f9f6a421b9c3387aa744c0d4d71ac400b800881748098444710338173809b780b80008054d444292c12821dc040550403078b4682b4664517003f00"_hex_u8;
+/* 2023-06-05T19:56:12Z 52, 44896, 540514,*/
+static constexpr auto BENCH_EXAMPLE_07 = "b317998a4000b40098d53e01b45b99814802b7289b940003b3699a9d1204b6619a807a05814682cb78050571d854060571d8540705800e808d7a0805803480c06a09056e8189280a056ffd060b05800d80ea7a0c05803c80b80c0c03803e80d86e0d036ed2280e03811581804a0f036fd34e1003805380eb6811036e81f60e12038010ec101204805f80e83a13048033809534140471e00a15048010f95816046e81fa301704805180a74c1705800d808f1018056fd55c1905800e8091481a056e80a76e1b05805f80e2741c0571809b021c05826382c8401d0571df201e05800e809d2c1f05850083e87c1f05811580af68200571f20a21056ff9042205803e80df1e23056e81956c24056e9f542604805180e83829000e800e8080621325803380b0402a020d6ef8100e2c8c4889a96a2c000f803580ce4c2c000b6e9f54062a803480c96406260500"_hex_u8;
+/* 2023-12-05T23:48:44Z 69, 44283, 586734,*/
+static constexpr auto BENCH_EXAMPLE_08 = "83728ce80000b90befca1001806083b24002b40de6da3203b545e9c35c04b34beede3005b068e8883006d41c80b1e14c07b337e7841208b26beadb2e096e83892e090980518487380a096e82815c0a096e81ce3c0b097181db200c097181d4020d09810084ed600e096e96b0100f0971819a0210086e93da2e0f09803583ee5e1009803583c66c1109800d82bb6e1209800d81d56a1309803c82e622140971819f521509803d84a55c15057181d6161605806283ac5217056e949c5a18056e89e8641806815889e23419067181de321a066e8af2641a076e82a70a1b07803583f2081c076f81e76e1d076e81d33e1e07800d83b8761e086e82a5541f087181de302008805f84ad0021086e81c74022086e81bd3e23086e9288182408806184b3102409803283816025096e91ed662609830a88e70827096e81d14a27097181ce6028096e8cf03829097181883832016f81835c3103806181e0103203804180b8103204863584fe183304800de66434046e9e4c34056e81d6742f429213c0eb602e3d6483b06c283a6e81d73c263d6e82f9581831805485ab360e37805080c62609398b3189880838010603916db1f3583a03000110873199f8623c000000011100"_hex_u8;
+/* 2023-04-14T19:36:52Z 77, 20418, 501117,*/
+static constexpr auto BENCH_EXAMPLE_09 = "bf2989d00400815bca5c01af1e86f97602800d9d6c03800d8a3404b47988866e05b36287f92e0680109f68078010991a08805ecf1208076e80933e09078062d01c0a078054b6760b078053b6760c076f9c1c0d078054b6760e0771af260f0771b17e10078032f57011078035d56812078054e1581307886b83dc301407817480d13013068005a6001406803d80821a15066ef3201606800ea2181706800da628180671ab1219068054db0c1a06719b001b06815b80a11c1c068050b9301d066fac2a1e068033ab481f06719b1020068035ab721e07803dc2761f0771ae3c20078040f60e210771ce282207800ea4322307882a81a66024078035ad4625076efe7e26078162808e1827078118bb7228076eac7428088010bf58290871a04c2a0871bc722b086fa8382c08803d80a0142d088035d6282e088051c30c2f086efc623008800d9f6231086f986432088117bb7237028010a63034068010c84e2740800ea64c2237832c80933e1f3b830880c454390208813c80955c3905068032c73611348010a03c093c837a808a101b278050ac34093a8051ac34291b8f3b8187401d28881a82cb3a3a0a37977b86d20843000028996686a7083f030f8078d3761b27106e995a08499070839b5a1131000b00"_hex_u8;
+/* 2023-11-07T17:59:35Z 48, 4792, 498995,*/
+static constexpr auto BENCH_EXAMPLE_10 = "875f89aa1000b51ec09d7201c55cc7a72e02a11aa1fb3203b233a7f95204800ef56205b33ea9d13006803e80b26e07d90ec9dd4008b45eabbe6c09806080ca000a815984e8680a0a6f80925e0a0a803f80e1660c09937c94b7420d086e82f5640a086e80997e0b086f808d320c08800580a5640d086f8089100e08804080c9060f088115819a1c10086e82961a0f0a805f81bc0a100a6ff826110a6ef53e120a807584c60c110a6e818f32120a803c81c246130a805481d508140a8159838410150a7180a55c160a6f80821c170a6fe6101c066fe6101d06805080f854190a6e81b27c1a0a8155819c701e06805180ae0c21046e8b9a222501805180f53422001680f26880f8a62a220116803580da582007058153838e6e21000c800d80a712033a807681ae1c23000308834a82d36023020205815981e03a051a08001700"_hex_u8;
+/* 2023-11-16T10:47:08Z 77, 473962, 486863,*/
+static constexpr auto BENCH_EXAMPLE_11 = "801980c06000801980c06001801980c06002801980c06003801980c06004801980c06005801980c06006801980c06007801980c06008801980c06009801980c0600a801980c0600b801980c0600c801980c0600d801980c0600e801980c0600f801980c060108019d12c11800f80b1601111800f80b1601111801080b1601111800f80b160100e800f80b160100f801980c060110f800f80b160140d801180b1601111801180b160100d801180b160120c801180b1600f10801180b1600f11801980c0601011800f80b160140e800f80b160110f801980c060170a801180b1601210801980c060140f800f80b1601311801980c0602005801180b1601f07800f80b1601b0c800fca7c1611812081f9601638812081f9601637812081fb001636801080b160142f801980c0600e2a801080b1600f2a801180b1600d25801980c0600e25800f80b1600d27801980c0600e27801980c0600d27801180b1600e26812080b1500c27812081f960201025812081f960200f27812081fc201d101c812081fc201d101d812081fc201d0f1f812081fc201d0f20812081f9601b1016800f80b1600a35800f80b1600a36800f80b1600e32801080b160122f812081f960280040812081fc20121d1b812081f960112713812081f960160d37812081fc20140d2b812081f960130d2d812081fc20130c2c812081fb001b0157812081fb001a0245812081fc20140030812081fc20092747812081fb000b152500"_hex_u8;
+/* 2023-10-06T20:44:09Z 40, 341438, 341438,*/
+static constexpr auto BENCH_EXAMPLE_12 = "80318f4c0080318f4c0180318f4c0280318f4c0380318f4c0480318f4c0580318f4c0680318f4c078033a57807078033a57807078033a57807078033a57807078033a57807078033a57807078033a57807078033a578070780318f4c0e0180318f4c0d0380318f4c0c0580318f4c0b078033a57803128033a57803128033a57803128033a578031280318f4c0412810b9c28140300810c9c281303028033a57802188033a57802188033a5780218810c9c280b01108033a578001c810c9c2807050f8033a578001b810c98040700158033a578001c810c98040301158033a5780019806ca1240101118033a578001300"_hex_u8;
+/* 2023-11-15T21:40:46Z 96, 23608, 138286,*/
+static constexpr auto BENCH_EXAMPLE_13 = "8060829f4000b157bab07a01b27cc2b16802b22fbce54603826480a95804803da81a05bc7bcac93806800de55207800daf0608805bc71809805bc7180a800d9d4a0b805bbc700c8152d7180d805bb9380e850a8886260f800d80d33410bf38d3d55011b41dc4eb6012bd70d2ce2e138d3596af7812137180cd501313805e81f7281413718092001513803d81f90016136e8b916c1713801081861a17106e80cd2a18106f80cc3c19106e80cf161911800d80fe781b107180d87c1c106e80fb081d10803e8286701d11800d81c4781f10804082a6002010801081912e21107180ff0021116e81da4a2310850b8b864023116e89db3224116e84ff7e2610897c95993427106f80bb1a240b803581c272250b8032828c10260b6e80d42a270b804082b35a280b800d80fe3e290b805cc0282312821d8697022b0b6e8add562c0b805281c8063007811883f1082313800d80fe3e24137180c9142513800d8380102613803382c00e2713805eb32228136e8494542913800e8186742913806082b74c2a1380528285782b13800d818f7a2c136e84a5562d1380508286702e136f80a46e3e04803f8191364102805481ad4c3d076e809a5a3e077180fe4032136e838b7233138c4790cf384106853584ab624206805b80932a4801806280966c48028168ef04400b7181bd524903806282db5c375b9316acbf703a599c68c5a454385c6e81d63e364a6f80ff64334e817485a6784f023171819536234e800d81826e1e498053829a12420018834c87cb14291d2e840e8bc94c1d2825800d81b7220368811783fe0e271f1f811783e758380f001ecd55809edf6e56000000003a815984ba76008010d54d80aebb4e2c22000000000000002c807682f150007a00"_hex_u8;
+/* 2023-12-06T09:18:20Z 93, 68130, 122830,*/
+static constexpr auto BENCH_EXAMPLE_14 = "b26beadb2e00800d80ca0a01d41c80b1e14c02b068e8883003800d81af1604b34beede30056e80b14006b151f5d46c07b93e8085b02608b30cf98b1009b14ef6b3040ab176f6ab480bb7078082b8640c800d81c6460d802c80a8080e802c80a8080f802c80a14210802ce50a11802cd722127181ce6012126e81d14a13126e9b8b00141282428dd42c15128051828408150e6e81bd3e150f805f84ad00160f7181de30170f6e81c740180f800d83b876190f6e82a5541a0f6e81d33e1a106e82a70a1b106f81e76e1c10803583f2081d106e82d9401e106e96e4441f107181de321e12815889e2341f127182d60c20126e979d4e21126e8282262410800d82972c25106f838a5822126f82842a23127182d24a2412803e84bc2a2512800d83c81a26126e84f8142712805085a22c27126e889e6a2812801083aa50281280348598102912801082d5522a126e85865c2b127182c7602b1282468c82042c126e84972c2d12805485d93a2d12801083c7322e12815386e1582f126e84fb0c30126f82eb6c3011813a85b47a3111803f869f5c3211805181ed30370d6e84bf0a3411804180e1383809815883aa183a08815a8392203e05807681f140380c6e9e4c4005805485ab363255805183856030406e82f9582c45805185c1001b4f82418df1001a4e803283c50e430026800d83a6201a4b836886be3044010b8b318988084c0101803183a6120776800d828a1e087682338ae050301c33873199f8624d010032813986bc663c1034800d83a5220a6f800d82be52048000805183e364084907800d83cc4a018005815987b41e1832000017884b9dce72035035803284c11e00800885769d9538192f0000000002001000"_hex_u8;
+/* 2023-12-14T02:02:29Z 55, 247754, 247754,*/
+static constexpr auto BENCH_EXAMPLE_15 = "801980c06000801980c06001801980c06002801980c06003801980c06004801980c06005801980c06006801980c06007801980c06008801980c06009801980c0600a801980c0600b801980c0600c801980c0600d801980c0600e801180b1600e0e801180b1600e0e801180b1600e0e801180b1600e0e801180b1600e0e801180b1600e0e801180b1600d07801180b1600f06801180b1600c0a801180b1600f08801180b1600c0c801180b1600c0d801180b1600c0e801180b160100b801180b1601309812081fc200e2a812081fc200e29812081fc200e28812081fc200e0e18812081fc200e0e17801980c060042e812081fc200e0d07812081fc200e0d08812081fc200e0c0a812081fc200e0d0a801980c060081e812081fc200f0c0c812081fc200f0c0d812081fc200f0c0e801180b160083a801180b1600426801980c0600b20801980c0600a22812081fc200f0b30801180b160022b801180b160022b812081fc20062422812081fc2006220b812081fc200c0a1e812081fc2012041a00"_hex_u8;
+/* 2023-12-14T15:17:20Z 76, 102600, 103935,*/
+static constexpr auto BENCH_EXAMPLE_16 = "801980c06000801980c06001801980c06002801980c06003801980c06004801180b1600404801180b1600404801180b1600404801980c0600504801980c0600802801980c0600803801180b1600704801980c0600804801280b1600804812081fc200810812081fc20080f812081fc20080e801180b160080c800f80b160080d801980c060090d801180b160090e801980c0600a0e812181fc200a0c801180b1600a0d812181fd400a0c801980c0600a1c801980c0600916801180b1600719801180b160061b801980c0600d15801980c0600717812081fc200718801980c0600716801180b160072d801180b1600722801180b1600525801980c060091b801980c060071e801080b160071f801280b160061d812081fc20063a812181f960160815801280b1600525801980c0600625801180b1600626801980c0600726801980c0600536801180b160032b801980c060042b801280b160032d801980c060033e801180b160043e812181fc20100c27801080b160042f801980c0600342801180b1600442812081fc20150d25800f80b1600245812081fd40120619812081fc20040243812081fc20120c2c812081fd40120a1d812181fb00100623812081fc20030347812081fc20072126801980c0600236812081fc20040d2b812081fc20120328801980c0600237801180b1600337812081fc20052230801180b1600239812081fc2008242c812081fd4005112d812081fb00070b32812081f96011034700"_hex_u8;
+/* 2023-12-15T07:12:29Z 98, 112693, 112730,*/
+static constexpr auto BENCH_EXAMPLE_17 = "801980c06000801980c06001801980c06002801980c06003801980c06004801980c06005801980c06006801180b1600606801180b1600606801180b1600606801180b1600606801280b1600606801180b1600606801180b1600606801980c0600d00801980c0600b03801980c0600b04801980c0600f01812081fc200a16812081fc200a15812081fc200a14812081fc200a13812081fd400a12812181fc200a11812181fc200a0f801180b1600a10801180b1600a10801980c0600a10801180b1600b10801180b1600b10801980c0600621801980c0600915801980c060041b801180b160051b801980c0600f12801980c0600f13801980c0600d15801980c0600c17801980c060072e800f80b160082e812181fc200d150e801980c0600922801180b1600923801980c0600823801180b1600623801180b1600a20801180b1600e1c801180b1600b20801180b1600b21801980c0600a3e800f80b1600b3e801980c0600931801180b1600a31812181fc20140325801180b1600a30801180b160054c801180b160043b801980c0600336812181fc200253812081f960090944812081fc2007003c801980c0600339801180b1600433801980c0600453801980c0600340801980c060033d801080b160043d812081f960070854801980c060045a801180b160055a801180b1600545801980c0600643801980c0600641801280b1600739801180b1600562812081fc20121f27812181fc20210137812181fc2016112f801980c0600259801980c0600156812181fc20053a31801180b160025c801180b1600257801980c0600357812081fc200d2d1e812181fc20102444812181fc20035a801180b160035b801980c0600751812181fc2007392a812181fc20025f801980c060045e801180b1600350812081fc20070f6f801180b1600263812181fc201b1322812181fc2011283b812081fc2002442100"_hex_u8;
+/* 2023-12-16T02:25:33Z 99, 112399, 112399,*/
+static constexpr auto BENCH_EXAMPLE_18 = "801980c06000801980c06001801980c06002801980c06003801980c06004801980c06005801980c06006801980c06007801180b16008801180b16009801180b1600a801180b1600a0a801180b1600a0a801180b1600a0a801180b1600a0a801980c0600d06801180b1600b09801980c0601005801180b1600c0a801980c0600d0a801980c0601106801180b1600e0a801980c0601207801980c0601207801180b160100a812081e668100a812081e668100a812081e668100a801980c0601407801980c0601606812081fc201226812081fc201225812081fc201224812081fc201223801180b1600e21801980c0600b1e801180b1600c1e801180b1601316801980c060091b801980c0601312801980c0600a1c801180b160190e801180b1601315801180b1600e1b801180b1601713801180b1600f1c801980c0600d34801980c0600d30801980c060102e801980c060122d801980c0600b2a801980c0600b2a801980c0600b2b801180b1601122801180b1600e26801180b1601025801180b1600f26812081fc20280032812081fc20270034812081fc20250034801180b1600d4b801980c0600d457a809a000d46801980c0601044801980c0600e46801180b1600f43801180b160123f801180b160123e801180b1601130801180b1601131801180b1601131812081fc20230a36801980c0600a5a801180b1600a5b801980c0600a5b801180b1600b5b801980c0600b5a801180b1600f57801180b1600d3f801980c0600669801980c0600568801980c0600466801180b1600945801180b1600649801180b1600945812081fc2018234b812081fc20142534812081fc20142532812081fc20142530801180b160074d801180b1600a4b801180b1600a4a812081fc20221662812081fc200c0472812081fc20072e42812081fc20062c23812081fc20100572812081fc200f036c812081fc2001345100"_hex_u8;
+/* 2023-03-31T19:24:02Z 78, 90393, 152832,*/
+static constexpr auto BENCH_EXAMPLE_19 = "800dd042008028b13c018028b13c028028b13c038029b13c048029b13c058029b13c0680299948078029b13c088029b13c09802899480a802899480b8028b13c0c80299e700d802899480e802999480f8029b13c10802999481180299948128028b13c138029b13c1480289e701580289948168028b13c1780289948188028994819802899481a802999481b802999481c802899481d802999481e8028b13c1f8029b13c20802999482180299948228028b13c2380298c242480289948258029b13c2680288c242780298c242880299e70298f5a80ea762a824780aa00292a82038090402429813fcf00152a8203809040142a813ff700112982038090402d002d813ff70028002c8203809040270024824780aa00270025820380904025002882038090401e022a82038090401d042782038090401c01298203809040190029813ff700170028813ff700140128807b9258120128841280f6402c01002e82038090402b00062b820380904027000031813ff70011192d82038090401d000129851981a9403a0000003b82038090400c182e813ff7000b0f2982038090401314141b807b925805192b84568190001121000334807bdd400149824780aa00001f2a813ff700003d0b8203809040050d1915807bdd4001498728828f400b010004050501000a050c851981a9400104050b061a0400"_hex_u8;
+
+static void LinearizeOptimallyExample00(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_00); }
+static void LinearizeOptimallyExample01(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_01); }
+static void LinearizeOptimallyExample02(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_02); }
+static void LinearizeOptimallyExample03(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_03); }
+static void LinearizeOptimallyExample04(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_04); }
+static void LinearizeOptimallyExample05(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_05); }
+static void LinearizeOptimallyExample06(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_06); }
+static void LinearizeOptimallyExample07(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_07); }
+static void LinearizeOptimallyExample08(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_08); }
+static void LinearizeOptimallyExample09(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_09); }
+static void LinearizeOptimallyExample10(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_10); }
+static void LinearizeOptimallyExample11(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_11); }
+static void LinearizeOptimallyExample12(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_12); }
+static void LinearizeOptimallyExample13(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_13); }
+static void LinearizeOptimallyExample14(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_14); }
+static void LinearizeOptimallyExample15(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_15); }
+static void LinearizeOptimallyExample16(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_16); }
+static void LinearizeOptimallyExample17(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_17); }
+static void LinearizeOptimallyExample18(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_18); }
+static void LinearizeOptimallyExample19(benchmark::Bench& bench) { BenchLinearizeOptimally(bench, BENCH_EXAMPLE_19); }
+
+BENCHMARK(Linearize16TxWorstCase20Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize16TxWorstCase120Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize32TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize32TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize48TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize48TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize64TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize64TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize75TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize75TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize99TxWorstCase5000Iters, benchmark::PriorityLevel::HIGH);
+BENCHMARK(Linearize99TxWorstCase15000Iters, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(LinearizeNoIters16TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters32TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters48TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters64TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters75TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters99TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(LinearizeNoIters16TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters32TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters48TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters64TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters75TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeNoIters99TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(PostLinearize16TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize32TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize48TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize64TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize75TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(PostLinearize99TxWorstCase, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(MergeLinearizations16TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations32TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations48TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations64TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations75TxWorstCase, benchmark::PriorityLevel::HIGH);
+BENCHMARK(MergeLinearizations99TxWorstCase, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(LinearizeOptimallyExample00, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample01, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample02, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample03, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample04, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample05, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample06, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample07, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample08, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample09, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample10, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample11, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample12, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample13, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample14, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample15, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample16, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample17, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample18, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LinearizeOptimallyExample19, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/coin_selection.cpp b/src/bench/coin_selection.cpp
index 171c61c46f..a752f73610 100644
--- a/src/bench/coin_selection.cpp
+++ b/src/bench/coin_selection.cpp
@@ -3,15 +3,28 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
+#include <consensus/amount.h>
#include <interfaces/chain.h>
#include <node/context.h>
+#include <outputtype.h>
+#include <policy/feerate.h>
#include <policy/policy.h>
+#include <primitives/transaction.h>
+#include <random.h>
+#include <sync.h>
+#include <util/result.h>
#include <wallet/coinselection.h>
#include <wallet/spend.h>
-#include <wallet/wallet.h>
#include <wallet/test/util.h>
+#include <wallet/transaction.h>
+#include <wallet/wallet.h>
+#include <cassert>
+#include <map>
+#include <memory>
#include <set>
+#include <utility>
+#include <vector>
using node::NodeContext;
using wallet::AttemptSelection;
diff --git a/src/bench/crypto_hash.cpp b/src/bench/crypto_hash.cpp
index 1685a120b4..65da942ad7 100644
--- a/src/bench/crypto_hash.cpp
+++ b/src/bench/crypto_hash.cpp
@@ -11,11 +11,14 @@
#include <crypto/sha3.h>
#include <crypto/sha512.h>
#include <crypto/siphash.h>
-#include <hash.h>
#include <random.h>
+#include <span.h>
#include <tinyformat.h>
#include <uint256.h>
+#include <cstdint>
+#include <vector>
+
/* Number of bytes to hash per iteration */
static const uint64_t BUFFER_SIZE = 1000*1000;
@@ -196,22 +199,6 @@ static void SipHash_32b(benchmark::Bench& bench)
});
}
-static void FastRandom_32bit(benchmark::Bench& bench)
-{
- FastRandomContext rng(true);
- bench.run([&] {
- rng.rand32();
- });
-}
-
-static void FastRandom_1bit(benchmark::Bench& bench)
-{
- FastRandomContext rng(true);
- bench.run([&] {
- rng.randbool();
- });
-}
-
static void MuHash(benchmark::Bench& bench)
{
MuHash3072 acc;
@@ -274,8 +261,6 @@ BENCHMARK(SHA256D64_1024_STANDARD, benchmark::PriorityLevel::HIGH);
BENCHMARK(SHA256D64_1024_SSE4, benchmark::PriorityLevel::HIGH);
BENCHMARK(SHA256D64_1024_AVX2, benchmark::PriorityLevel::HIGH);
BENCHMARK(SHA256D64_1024_SHANI, benchmark::PriorityLevel::HIGH);
-BENCHMARK(FastRandom_32bit, benchmark::PriorityLevel::HIGH);
-BENCHMARK(FastRandom_1bit, benchmark::PriorityLevel::HIGH);
BENCHMARK(MuHash, benchmark::PriorityLevel::HIGH);
BENCHMARK(MuHashMul, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/data.cpp b/src/bench/data.cpp
deleted file mode 100644
index 35558b3aa7..0000000000
--- a/src/bench/data.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2019-2021 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/data.h>
-
-namespace benchmark {
-namespace data {
-
-#include <bench/data/block413567.raw.h>
-const std::vector<uint8_t> block413567{std::begin(block413567_raw), std::end(block413567_raw)};
-
-} // namespace data
-} // namespace benchmark
diff --git a/src/bench/data.h b/src/bench/data.h
deleted file mode 100644
index 5f13d766ea..0000000000
--- a/src/bench/data.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2019 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_BENCH_DATA_H
-#define BITCOIN_BENCH_DATA_H
-
-#include <cstdint>
-#include <vector>
-
-namespace benchmark {
-namespace data {
-
-extern const std::vector<uint8_t> block413567;
-
-} // namespace data
-} // namespace benchmark
-
-#endif // BITCOIN_BENCH_DATA_H
diff --git a/src/bench/descriptors.cpp b/src/bench/descriptors.cpp
index 5d6bcb8ce8..c45456645b 100644
--- a/src/bench/descriptors.cpp
+++ b/src/bench/descriptors.cpp
@@ -4,11 +4,16 @@
#include <bench/bench.h>
#include <key.h>
-#include <pubkey.h>
#include <script/descriptor.h>
+#include <script/script.h>
+#include <script/signingprovider.h>
+#include <cassert>
+#include <cstdint>
+#include <memory>
#include <string>
#include <utility>
+#include <vector>
static void ExpandDescriptor(benchmark::Bench& bench)
{
@@ -18,12 +23,12 @@ static void ExpandDescriptor(benchmark::Bench& bench)
const std::pair<int64_t, int64_t> range = {0, 1000};
FlatSigningProvider provider;
std::string error;
- auto desc = Parse(desc_str, provider, error);
+ auto descs = Parse(desc_str, provider, error);
bench.run([&] {
for (int i = range.first; i <= range.second; ++i) {
std::vector<CScript> scripts;
- bool success = desc->Expand(i, provider, scripts, provider);
+ bool success = descs[0]->Expand(i, provider, scripts, provider);
assert(success);
}
});
diff --git a/src/bench/disconnected_transactions.cpp b/src/bench/disconnected_transactions.cpp
index f48175d472..7c3c34bbbc 100644
--- a/src/bench/disconnected_transactions.cpp
+++ b/src/bench/disconnected_transactions.cpp
@@ -5,9 +5,18 @@
#include <bench/bench.h>
#include <kernel/disconnected_transactions.h>
#include <primitives/block.h>
-#include <test/util/random.h>
+#include <primitives/transaction.h>
+#include <script/script.h>
#include <test/util/setup_common.h>
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <iterator>
+#include <memory>
+#include <vector>
+
constexpr size_t BLOCK_VTX_COUNT{4000};
constexpr size_t BLOCK_VTX_COUNT_10PERCENT{400};
diff --git a/src/bench/duplicate_inputs.cpp b/src/bench/duplicate_inputs.cpp
index b56054ae89..9f22fa3646 100644
--- a/src/bench/duplicate_inputs.cpp
+++ b/src/bench/duplicate_inputs.cpp
@@ -3,15 +3,28 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
+#include <chain.h>
#include <chainparams.h>
+#include <consensus/consensus.h>
#include <consensus/merkle.h>
#include <consensus/validation.h>
#include <pow.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
#include <random.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
-#include <txmempool.h>
+#include <uint256.h>
#include <validation.h>
+#include <cassert>
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
static void DuplicateInputs(benchmark::Bench& bench)
{
diff --git a/src/bench/ellswift.cpp b/src/bench/ellswift.cpp
index 4780db8e1c..4dfef0e9c5 100644
--- a/src/bench/ellswift.cpp
+++ b/src/bench/ellswift.cpp
@@ -3,9 +3,14 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
#include <key.h>
+#include <pubkey.h>
#include <random.h>
+#include <span.h>
+#include <uint256.h>
+
+#include <algorithm>
+#include <cassert>
static void EllSwiftCreate(benchmark::Bench& bench)
{
diff --git a/src/bench/gcs_filter.cpp b/src/bench/gcs_filter.cpp
index 0af4ee98fe..e6cc3d4d54 100644
--- a/src/bench/gcs_filter.cpp
+++ b/src/bench/gcs_filter.cpp
@@ -4,6 +4,11 @@
#include <bench/bench.h>
#include <blockfilter.h>
+#include <uint256.h>
+
+#include <cstdint>
+#include <utility>
+#include <vector>
static GCSFilter::ElementSet GenerateGCSTestElements()
{
diff --git a/src/bench/hashpadding.cpp b/src/bench/hashpadding.cpp
index e9d2c25fe3..cca5c07506 100644
--- a/src/bench/hashpadding.cpp
+++ b/src/bench/hashpadding.cpp
@@ -3,7 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <hash.h>
+#include <crypto/sha256.h>
#include <random.h>
#include <uint256.h>
diff --git a/src/bench/index_blockfilter.cpp b/src/bench/index_blockfilter.cpp
index 5e0bfbfea6..eac09688c8 100644
--- a/src/bench/index_blockfilter.cpp
+++ b/src/bench/index_blockfilter.cpp
@@ -2,14 +2,30 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
-#include <bench/bench.h>
-
#include <addresstype.h>
+#include <bench/bench.h>
+#include <blockfilter.h>
+#include <chain.h>
+#include <index/base.h>
#include <index/blockfilterindex.h>
-#include <node/chainstate.h>
-#include <node/context.h>
+#include <interfaces/chain.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <pubkey.h>
+#include <script/script.h>
+#include <span.h>
+#include <sync.h>
#include <test/util/setup_common.h>
+#include <uint256.h>
#include <util/strencodings.h>
+#include <util/time.h>
+#include <validation.h>
+
+#include <cassert>
+#include <memory>
+#include <vector>
+
+using namespace util::hex_literals;
// Very simple block filter index sync benchmark, only using coinbase outputs.
static void BlockFilterIndexSync(benchmark::Bench& bench)
@@ -18,7 +34,7 @@ static void BlockFilterIndexSync(benchmark::Bench& bench)
// Create more blocks
int CHAIN_SIZE = 600;
- CPubKey pubkey{ParseHex("02ed26169896db86ced4cbb7b3ecef9859b5952825adbeab998fb5b307e54949c9")};
+ CPubKey pubkey{"02ed26169896db86ced4cbb7b3ecef9859b5952825adbeab998fb5b307e54949c9"_hex_u8};
CScript script = GetScriptForDestination(WitnessV0KeyHash(pubkey));
std::vector<CMutableTransaction> noTxns;
for (int i = 0; i < CHAIN_SIZE - 100; i++) {
diff --git a/src/bench/load_external.cpp b/src/bench/load_external.cpp
index fba1233901..8f9399c60d 100644
--- a/src/bench/load_external.cpp
+++ b/src/bench/load_external.cpp
@@ -3,13 +3,24 @@
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
+#include <bench/data/block413567.raw.h>
#include <chainparams.h>
-#include <clientversion.h>
+#include <flatfile.h>
+#include <node/blockstorage.h>
+#include <span.h>
+#include <streams.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
+#include <uint256.h>
+#include <util/fs.h>
#include <validation.h>
+#include <cstdint>
+#include <cstdio>
+#include <map>
+#include <memory>
+#include <stdexcept>
+#include <vector>
+
/**
* The LoadExternalBlockFile() function is used during -reindex and -loadblock.
*
diff --git a/src/bench/lockedpool.cpp b/src/bench/lockedpool.cpp
index 6851ed0bd8..5f39ddc41b 100644
--- a/src/bench/lockedpool.cpp
+++ b/src/bench/lockedpool.cpp
@@ -3,9 +3,10 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
#include <support/lockedpool.h>
+#include <cstddef>
+#include <cstdint>
#include <vector>
#define ASIZE 2048
diff --git a/src/bench/logging.cpp b/src/bench/logging.cpp
index c97c4e151b..3bf2b7edb2 100644
--- a/src/bench/logging.cpp
+++ b/src/bench/logging.cpp
@@ -5,11 +5,13 @@
#include <bench/bench.h>
#include <logging.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
+
+#include <functional>
+#include <vector>
// All but 2 of the benchmarks should have roughly similar performance:
//
-// LogPrintWithoutCategory should be ~3 orders of magnitude faster, as nothing is logged.
+// LogWithoutDebug should be ~3 orders of magnitude faster, as nothing is logged.
//
// LogWithoutWriteToFile should be ~2 orders of magnitude faster, as it avoids disk writes.
@@ -20,73 +22,43 @@ static void Logging(benchmark::Bench& bench, const std::vector<const char*>& ext
TestingSetup test_setup{
ChainType::REGTEST,
- extra_args,
+ {.extra_args = extra_args},
};
bench.run([&] { log(); });
}
-static void LogPrintLevelWithThreadNames(benchmark::Bench& bench)
-{
- Logging(bench, {"-logthreadnames=1", "-debug=net"}, [] {
- LogPrintLevel(BCLog::NET, BCLog::Level::Error, "%s\n", "test"); });
-}
-
-static void LogPrintLevelWithoutThreadNames(benchmark::Bench& bench)
+static void LogWithDebug(benchmark::Bench& bench)
{
- Logging(bench, {"-logthreadnames=0", "-debug=net"}, [] {
- LogPrintLevel(BCLog::NET, BCLog::Level::Error, "%s\n", "test"); });
+ Logging(bench, {"-logthreadnames=0", "-debug=net"}, [] { LogDebug(BCLog::NET, "%s\n", "test"); });
}
-static void LogPrintWithCategory(benchmark::Bench& bench)
+static void LogWithoutDebug(benchmark::Bench& bench)
{
- Logging(bench, {"-logthreadnames=0", "-debug=net"}, [] { LogPrint(BCLog::NET, "%s\n", "test"); });
-}
-
-static void LogPrintWithoutCategory(benchmark::Bench& bench)
-{
- Logging(bench, {"-logthreadnames=0", "-debug=0"}, [] { LogPrint(BCLog::NET, "%s\n", "test"); });
-}
-
-static void LogPrintfCategoryWithThreadNames(benchmark::Bench& bench)
-{
- Logging(bench, {"-logthreadnames=1", "-debug=net"}, [] {
- LogPrintfCategory(BCLog::NET, "%s\n", "test");
- });
-}
-
-static void LogPrintfCategoryWithoutThreadNames(benchmark::Bench& bench)
-{
- Logging(bench, {"-logthreadnames=0", "-debug=net"}, [] {
- LogPrintfCategory(BCLog::NET, "%s\n", "test");
- });
+ Logging(bench, {"-logthreadnames=0", "-debug=0"}, [] { LogDebug(BCLog::NET, "%s\n", "test"); });
}
-static void LogPrintfWithThreadNames(benchmark::Bench& bench)
+static void LogWithThreadNames(benchmark::Bench& bench)
{
- Logging(bench, {"-logthreadnames=1"}, [] { LogPrintf("%s\n", "test"); });
+ Logging(bench, {"-logthreadnames=1"}, [] { LogInfo("%s\n", "test"); });
}
-static void LogPrintfWithoutThreadNames(benchmark::Bench& bench)
+static void LogWithoutThreadNames(benchmark::Bench& bench)
{
- Logging(bench, {"-logthreadnames=0"}, [] { LogPrintf("%s\n", "test"); });
+ Logging(bench, {"-logthreadnames=0"}, [] { LogInfo("%s\n", "test"); });
}
static void LogWithoutWriteToFile(benchmark::Bench& bench)
{
// Disable writing the log to a file, as used for unit tests and fuzzing in `MakeNoLogFileContext`.
Logging(bench, {"-nodebuglogfile", "-debug=1"}, [] {
- LogPrintf("%s\n", "test");
- LogPrint(BCLog::NET, "%s\n", "test");
+ LogInfo("%s\n", "test");
+ LogDebug(BCLog::NET, "%s\n", "test");
});
}
-BENCHMARK(LogPrintLevelWithThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintLevelWithoutThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintWithCategory, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintWithoutCategory, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintfCategoryWithThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintfCategoryWithoutThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintfWithThreadNames, benchmark::PriorityLevel::HIGH);
-BENCHMARK(LogPrintfWithoutThreadNames, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LogWithDebug, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LogWithoutDebug, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LogWithThreadNames, benchmark::PriorityLevel::HIGH);
+BENCHMARK(LogWithoutThreadNames, benchmark::PriorityLevel::HIGH);
BENCHMARK(LogWithoutWriteToFile, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/mempool_eviction.cpp b/src/bench/mempool_eviction.cpp
index 1a9b013277..84f873d183 100644
--- a/src/bench/mempool_eviction.cpp
+++ b/src/bench/mempool_eviction.cpp
@@ -3,10 +3,19 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <kernel/mempool_entry.h>
+#include <consensus/amount.h>
+#include <kernel/cs_main.h>
#include <policy/policy.h>
+#include <primitives/transaction.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
#include <txmempool.h>
+#include <util/check.h>
+
+#include <cstdint>
+#include <memory>
+#include <vector>
static void AddTx(const CTransactionRef& tx, const CAmount& nFee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
diff --git a/src/bench/mempool_stress.cpp b/src/bench/mempool_stress.cpp
index fe3e204fb3..67f689e4ea 100644
--- a/src/bench/mempool_stress.cpp
+++ b/src/bench/mempool_stress.cpp
@@ -3,16 +3,23 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <kernel/mempool_entry.h>
+#include <consensus/amount.h>
#include <policy/policy.h>
+#include <primitives/transaction.h>
#include <random.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
#include <txmempool.h>
-#include <util/chaintype.h>
#include <validation.h>
+#include <cstddef>
+#include <cstdint>
+#include <memory>
#include <vector>
+class CCoinsViewCache;
+
static void AddTx(const CTransactionRef& tx, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
{
int64_t nTime = 0;
@@ -106,7 +113,7 @@ static void ComplexMemPool(benchmark::Bench& bench)
static void MempoolCheck(benchmark::Bench& bench)
{
FastRandomContext det_rand{true};
- auto testing_setup = MakeNoLogFileContext<TestChain100Setup>(ChainType::REGTEST, {"-checkmempool=1"});
+ auto testing_setup = MakeNoLogFileContext<TestChain100Setup>(ChainType::REGTEST, {.extra_args = {"-checkmempool=1"}});
CTxMemPool& pool = *testing_setup.get()->m_node.mempool;
LOCK2(cs_main, pool.cs);
testing_setup->PopulateMempool(det_rand, 400, true);
diff --git a/src/bench/merkle_root.cpp b/src/bench/merkle_root.cpp
index 55409335bd..98ce197ea5 100644
--- a/src/bench/merkle_root.cpp
+++ b/src/bench/merkle_root.cpp
@@ -3,11 +3,12 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-
#include <consensus/merkle.h>
#include <random.h>
#include <uint256.h>
+#include <vector>
+
static void MerkleRoot(benchmark::Bench& bench)
{
FastRandomContext rng(true);
diff --git a/src/bench/peer_eviction.cpp b/src/bench/peer_eviction.cpp
index e04f3c403c..5b08cc758b 100644
--- a/src/bench/peer_eviction.cpp
+++ b/src/bench/peer_eviction.cpp
@@ -3,13 +3,12 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <net.h>
#include <netaddress.h>
+#include <node/eviction.h>
#include <random.h>
#include <test/util/net.h>
-#include <test/util/setup_common.h>
-#include <algorithm>
+#include <chrono>
#include <functional>
#include <vector>
diff --git a/src/bench/poly1305.cpp b/src/bench/poly1305.cpp
index be0e5f2c2d..f58afe9845 100644
--- a/src/bench/poly1305.cpp
+++ b/src/bench/poly1305.cpp
@@ -5,9 +5,12 @@
#include <bench/bench.h>
#include <crypto/poly1305.h>
-
#include <span.h>
+#include <cstddef>
+#include <cstdint>
+#include <vector>
+
/* Number of bytes to process per iteration */
static constexpr uint64_t BUFFER_SIZE_TINY = 64;
static constexpr uint64_t BUFFER_SIZE_SMALL = 256;
diff --git a/src/bench/pool.cpp b/src/bench/pool.cpp
index b2a5f8debf..40b098f54c 100644
--- a/src/bench/pool.cpp
+++ b/src/bench/pool.cpp
@@ -5,7 +5,11 @@
#include <bench/bench.h>
#include <support/allocators/pool.h>
+#include <cstddef>
+#include <cstdint>
+#include <functional>
#include <unordered_map>
+#include <utility>
template <typename Map>
void BenchFillClearMap(benchmark::Bench& bench, Map& map)
diff --git a/src/bench/prevector.cpp b/src/bench/prevector.cpp
index 2524e215e4..9b83c42693 100644
--- a/src/bench/prevector.cpp
+++ b/src/bench/prevector.cpp
@@ -3,11 +3,13 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <prevector.h>
+
+#include <bench/bench.h>
#include <serialize.h>
#include <streams.h>
-#include <type_traits>
-#include <bench/bench.h>
+#include <type_traits>
+#include <vector>
struct nontrivial_t {
int x{-1};
diff --git a/src/bench/random.cpp b/src/bench/random.cpp
new file mode 100644
index 0000000000..c2aa66850a
--- /dev/null
+++ b/src/bench/random.cpp
@@ -0,0 +1,105 @@
+// 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.
+
+#include <bench/bench.h>
+#include <random.h>
+
+#include <algorithm>
+#include <cstdint>
+#include <iterator>
+#include <numeric>
+
+namespace {
+
+template<typename RNG>
+void BenchRandom_rand64(benchmark::Bench& bench, RNG&& rng) noexcept
+{
+ bench.batch(1).unit("number").run([&] {
+ rng.rand64();
+ });
+}
+
+template<typename RNG>
+void BenchRandom_rand32(benchmark::Bench& bench, RNG&& rng) noexcept
+{
+ bench.batch(1).unit("number").run([&] {
+ rng.rand32();
+ });
+}
+
+template<typename RNG>
+void BenchRandom_randbool(benchmark::Bench& bench, RNG&& rng) noexcept
+{
+ bench.batch(1).unit("number").run([&] {
+ rng.randbool();
+ });
+}
+
+template<typename RNG>
+void BenchRandom_randbits(benchmark::Bench& bench, RNG&& rng) noexcept
+{
+ bench.batch(64).unit("number").run([&] {
+ for (int i = 1; i <= 64; ++i) {
+ rng.randbits(i);
+ }
+ });
+}
+
+template<int RANGE, typename RNG>
+void BenchRandom_randrange(benchmark::Bench& bench, RNG&& rng) noexcept
+{
+ bench.batch(RANGE).unit("number").run([&] {
+ for (int i = 1; i <= RANGE; ++i) {
+ rng.randrange(i);
+ }
+ });
+}
+
+template<int RANGE, typename RNG>
+void BenchRandom_stdshuffle(benchmark::Bench& bench, RNG&& rng) noexcept
+{
+ uint64_t data[RANGE];
+ std::iota(std::begin(data), std::end(data), uint64_t(0));
+ bench.batch(RANGE).unit("number").run([&] {
+ std::shuffle(std::begin(data), std::end(data), rng);
+ });
+}
+
+void FastRandom_rand64(benchmark::Bench& bench) { BenchRandom_rand64(bench, FastRandomContext(true)); }
+void FastRandom_rand32(benchmark::Bench& bench) { BenchRandom_rand32(bench, FastRandomContext(true)); }
+void FastRandom_randbool(benchmark::Bench& bench) { BenchRandom_randbool(bench, FastRandomContext(true)); }
+void FastRandom_randbits(benchmark::Bench& bench) { BenchRandom_randbits(bench, FastRandomContext(true)); }
+void FastRandom_randrange100(benchmark::Bench& bench) { BenchRandom_randrange<100>(bench, FastRandomContext(true)); }
+void FastRandom_randrange1000(benchmark::Bench& bench) { BenchRandom_randrange<1000>(bench, FastRandomContext(true)); }
+void FastRandom_randrange1000000(benchmark::Bench& bench) { BenchRandom_randrange<1000000>(bench, FastRandomContext(true)); }
+void FastRandom_stdshuffle100(benchmark::Bench& bench) { BenchRandom_stdshuffle<100>(bench, FastRandomContext(true)); }
+
+void InsecureRandom_rand64(benchmark::Bench& bench) { BenchRandom_rand64(bench, InsecureRandomContext(251438)); }
+void InsecureRandom_rand32(benchmark::Bench& bench) { BenchRandom_rand32(bench, InsecureRandomContext(251438)); }
+void InsecureRandom_randbool(benchmark::Bench& bench) { BenchRandom_randbool(bench, InsecureRandomContext(251438)); }
+void InsecureRandom_randbits(benchmark::Bench& bench) { BenchRandom_randbits(bench, InsecureRandomContext(251438)); }
+void InsecureRandom_randrange100(benchmark::Bench& bench) { BenchRandom_randrange<100>(bench, InsecureRandomContext(251438)); }
+void InsecureRandom_randrange1000(benchmark::Bench& bench) { BenchRandom_randrange<1000>(bench, InsecureRandomContext(251438)); }
+void InsecureRandom_randrange1000000(benchmark::Bench& bench) { BenchRandom_randrange<1000000>(bench, InsecureRandomContext(251438)); }
+void InsecureRandom_stdshuffle100(benchmark::Bench& bench) { BenchRandom_stdshuffle<100>(bench, InsecureRandomContext(251438)); }
+
+} // namespace
+
+BENCHMARK(FastRandom_rand64, benchmark::PriorityLevel::HIGH);
+BENCHMARK(FastRandom_rand32, benchmark::PriorityLevel::HIGH);
+BENCHMARK(FastRandom_randbool, benchmark::PriorityLevel::HIGH);
+BENCHMARK(FastRandom_randbits, benchmark::PriorityLevel::HIGH);
+BENCHMARK(FastRandom_randrange100, benchmark::PriorityLevel::HIGH);
+BENCHMARK(FastRandom_randrange1000, benchmark::PriorityLevel::HIGH);
+BENCHMARK(FastRandom_randrange1000000, benchmark::PriorityLevel::HIGH);
+BENCHMARK(FastRandom_stdshuffle100, benchmark::PriorityLevel::HIGH);
+
+BENCHMARK(InsecureRandom_rand64, benchmark::PriorityLevel::HIGH);
+BENCHMARK(InsecureRandom_rand32, benchmark::PriorityLevel::HIGH);
+BENCHMARK(InsecureRandom_randbool, benchmark::PriorityLevel::HIGH);
+BENCHMARK(InsecureRandom_randbits, benchmark::PriorityLevel::HIGH);
+BENCHMARK(InsecureRandom_randrange100, benchmark::PriorityLevel::HIGH);
+BENCHMARK(InsecureRandom_randrange1000, benchmark::PriorityLevel::HIGH);
+BENCHMARK(InsecureRandom_randrange1000000, benchmark::PriorityLevel::HIGH);
+BENCHMARK(InsecureRandom_stdshuffle100, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/readblock.cpp b/src/bench/readblock.cpp
index 2b2bfe069e..058d953b4e 100644
--- a/src/bench/readblock.cpp
+++ b/src/bench/readblock.cpp
@@ -3,15 +3,22 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
-
-#include <consensus/validation.h>
+#include <bench/data/block413567.raw.h>
+#include <flatfile.h>
#include <node/blockstorage.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <serialize.h>
+#include <span.h>
#include <streams.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
#include <validation.h>
+#include <cassert>
+#include <cstdint>
+#include <memory>
+#include <vector>
+
static FlatFilePos WriteBlockToDisk(ChainstateManager& chainman)
{
DataStream stream{benchmark::data::block413567};
diff --git a/src/bench/rollingbloom.cpp b/src/bench/rollingbloom.cpp
index de76a87278..6b3e1c434e 100644
--- a/src/bench/rollingbloom.cpp
+++ b/src/bench/rollingbloom.cpp
@@ -6,7 +6,9 @@
#include <bench/bench.h>
#include <common/bloom.h>
#include <crypto/common.h>
+#include <span.h>
+#include <cstdint>
#include <vector>
static void RollingBloom(benchmark::Bench& bench)
diff --git a/src/bench/rpc_blockchain.cpp b/src/bench/rpc_blockchain.cpp
index 713853e8c5..7e3e2d8e48 100644
--- a/src/bench/rpc_blockchain.cpp
+++ b/src/bench/rpc_blockchain.cpp
@@ -3,15 +3,23 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
-
+#include <bench/data/block413567.raw.h>
+#include <chain.h>
+#include <core_io.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
#include <rpc/blockchain.h>
+#include <serialize.h>
+#include <span.h>
#include <streams.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
+#include <uint256.h>
+#include <univalue.h>
#include <validation.h>
-#include <univalue.h>
+#include <cstddef>
+#include <memory>
+#include <vector>
namespace {
diff --git a/src/bench/rpc_mempool.cpp b/src/bench/rpc_mempool.cpp
index a55aa0c794..6e8757bbd5 100644
--- a/src/bench/rpc_mempool.cpp
+++ b/src/bench/rpc_mempool.cpp
@@ -3,14 +3,19 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
+#include <consensus/amount.h>
#include <kernel/cs_main.h>
-#include <kernel/mempool_entry.h>
+#include <primitives/transaction.h>
#include <rpc/mempool.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
#include <txmempool.h>
-#include <util/chaintype.h>
-
#include <univalue.h>
+#include <util/check.h>
+
+#include <memory>
+#include <vector>
static void AddTx(const CTransactionRef& tx, const CAmount& fee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
diff --git a/src/bench/sign_transaction.cpp b/src/bench/sign_transaction.cpp
new file mode 100644
index 0000000000..3f0635711d
--- /dev/null
+++ b/src/bench/sign_transaction.cpp
@@ -0,0 +1,106 @@
+// 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 <addresstype.h>
+#include <bench/bench.h>
+#include <coins.h>
+#include <key.h>
+#include <primitives/transaction.h>
+#include <pubkey.h>
+#include <script/interpreter.h>
+#include <script/script.h>
+#include <script/sign.h>
+#include <script/signingprovider.h>
+#include <span.h>
+#include <test/util/random.h>
+#include <uint256.h>
+#include <util/translation.h>
+
+#include <cassert>
+#include <map>
+#include <vector>
+
+enum class InputType {
+ P2WPKH, // segwitv0, witness-pubkey-hash (ECDSA signature)
+ P2TR, // segwitv1, taproot key-path spend (Schnorr signature)
+};
+
+static void SignTransactionSingleInput(benchmark::Bench& bench, InputType input_type)
+{
+ ECC_Context ecc_context{};
+
+ FlatSigningProvider keystore;
+ std::vector<CScript> prev_spks;
+
+ // Create a bunch of keys / UTXOs to avoid signing with the same key repeatedly
+ for (int i = 0; i < 32; i++) {
+ CKey privkey = GenerateRandomKey();
+ CPubKey pubkey = privkey.GetPubKey();
+ CKeyID key_id = pubkey.GetID();
+ keystore.keys.emplace(key_id, privkey);
+ keystore.pubkeys.emplace(key_id, pubkey);
+
+ // Create specified locking script type
+ CScript prev_spk;
+ switch (input_type) {
+ case InputType::P2WPKH: prev_spk = GetScriptForDestination(WitnessV0KeyHash(pubkey)); break;
+ case InputType::P2TR: prev_spk = GetScriptForDestination(WitnessV1Taproot(XOnlyPubKey{pubkey})); break;
+ default: assert(false);
+ }
+ prev_spks.push_back(prev_spk);
+ }
+
+ // Simple 1-input tx with artificial outpoint
+ // (note that for the purpose of signing with SIGHASH_ALL we don't need any outputs)
+ COutPoint prevout{/*hashIn=*/Txid::FromUint256(uint256::ONE), /*nIn=*/1337};
+ CMutableTransaction unsigned_tx;
+ unsigned_tx.vin.emplace_back(prevout);
+
+ // Benchmark.
+ int iter = 0;
+ bench.minEpochIterations(100).run([&] {
+ CMutableTransaction tx{unsigned_tx};
+ std::map<COutPoint, Coin> coins;
+ CScript prev_spk = prev_spks[(iter++) % prev_spks.size()];
+ coins[prevout] = Coin(CTxOut(10000, prev_spk), /*nHeightIn=*/100, /*fCoinBaseIn=*/false);
+ std::map<int, bilingual_str> input_errors;
+ bool complete = SignTransaction(tx, &keystore, coins, SIGHASH_ALL, input_errors);
+ assert(complete);
+ });
+}
+
+static void SignTransactionECDSA(benchmark::Bench& bench) { SignTransactionSingleInput(bench, InputType::P2WPKH); }
+static void SignTransactionSchnorr(benchmark::Bench& bench) { SignTransactionSingleInput(bench, InputType::P2TR); }
+
+static void SignSchnorrTapTweakBenchmark(benchmark::Bench& bench, bool use_null_merkle_root)
+{
+ FastRandomContext rng;
+ ECC_Context ecc_context{};
+
+ auto key = GenerateRandomKey();
+ auto msg = rng.rand256();
+ auto merkle_root = use_null_merkle_root ? uint256() : rng.rand256();
+ auto aux = rng.rand256();
+ std::vector<unsigned char> sig(64);
+
+ bench.minEpochIterations(100).run([&] {
+ bool success = key.SignSchnorr(msg, sig, &merkle_root, aux);
+ assert(success);
+ });
+}
+
+static void SignSchnorrWithMerkleRoot(benchmark::Bench& bench)
+{
+ SignSchnorrTapTweakBenchmark(bench, /*use_null_merkle_root=*/false);
+}
+
+static void SignSchnorrWithNullMerkleRoot(benchmark::Bench& bench)
+{
+ SignSchnorrTapTweakBenchmark(bench, /*use_null_merkle_root=*/true);
+}
+
+BENCHMARK(SignTransactionECDSA, benchmark::PriorityLevel::HIGH);
+BENCHMARK(SignTransactionSchnorr, benchmark::PriorityLevel::HIGH);
+BENCHMARK(SignSchnorrWithMerkleRoot, benchmark::PriorityLevel::HIGH);
+BENCHMARK(SignSchnorrWithNullMerkleRoot, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/streams_findbyte.cpp b/src/bench/streams_findbyte.cpp
index 5098262e9a..004bf8ffc9 100644
--- a/src/bench/streams_findbyte.cpp
+++ b/src/bench/streams_findbyte.cpp
@@ -19,7 +19,7 @@ static void FindByte(benchmark::Bench& bench)
uint8_t data[file_size] = {0};
data[file_size-1] = 1;
file << data;
- std::rewind(file.Get());
+ file.seek(0, SEEK_SET);
BufferedFile bf{file, /*nBufSize=*/file_size + 1, /*nRewindIn=*/file_size};
bench.run([&] {
diff --git a/src/bench/strencodings.cpp b/src/bench/strencodings.cpp
index 16d14278a7..dd5829caf2 100644
--- a/src/bench/strencodings.cpp
+++ b/src/bench/strencodings.cpp
@@ -3,9 +3,12 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
-#include <bench/data.h>
+#include <bench/data/block413567.raw.h>
+#include <span.h>
#include <util/strencodings.h>
+#include <vector>
+
static void HexStrBench(benchmark::Bench& bench)
{
auto const& data = benchmark::data::block413567;
diff --git a/src/bench/verify_script.cpp b/src/bench/verify_script.cpp
index f38aa49a23..8d7e92a055 100644
--- a/src/bench/verify_script.cpp
+++ b/src/bench/verify_script.cpp
@@ -3,13 +3,20 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bench/bench.h>
+#include <hash.h>
#include <key.h>
-#include <script/script.h>
+#include <primitives/transaction.h>
+#include <pubkey.h>
#include <script/interpreter.h>
-#include <streams.h>
+#include <script/script.h>
+#include <span.h>
#include <test/util/transaction_utils.h>
+#include <uint256.h>
#include <array>
+#include <cassert>
+#include <cstdint>
+#include <vector>
// Microbenchmark for verification of a basic P2WPKH script. Can be easily
// modified to measure performance of other types of scripts.
diff --git a/src/bench/wallet_balance.cpp b/src/bench/wallet_balance.cpp
index 7a10b167a6..8d3f7f9673 100644
--- a/src/bench/wallet_balance.cpp
+++ b/src/bench/wallet_balance.cpp
@@ -4,16 +4,24 @@
#include <bench/bench.h>
#include <interfaces/chain.h>
-#include <node/chainstate.h>
-#include <node/context.h>
+#include <kernel/chainparams.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <sync.h>
#include <test/util/mining.h>
#include <test/util/setup_common.h>
-#include <wallet/test/util.h>
-#include <validationinterface.h>
+#include <uint256.h>
+#include <util/time.h>
+#include <validation.h>
#include <wallet/receive.h>
+#include <wallet/test/util.h>
#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
+#include <cassert>
+#include <memory>
#include <optional>
+#include <string>
namespace wallet {
static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const bool add_mine)
diff --git a/src/bench/wallet_create.cpp b/src/bench/wallet_create.cpp
index 5c0557bf6f..43b5b5c91e 100644
--- a/src/bench/wallet_create.cpp
+++ b/src/bench/wallet_create.cpp
@@ -2,14 +2,25 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
-
#include <bench/bench.h>
-#include <node/context.h>
+#include <config/bitcoin-config.h> // IWYU pragma: keep
#include <random.h>
+#include <support/allocators/secure.h>
#include <test/util/setup_common.h>
+#include <uint256.h>
+#include <util/fs.h>
+#include <util/translation.h>
#include <wallet/context.h>
+#include <wallet/db.h>
#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
+
+#include <cassert>
+#include <memory>
+#include <optional>
+#include <string>
+#include <utility>
+#include <vector>
namespace wallet {
static void WalletCreate(benchmark::Bench& bench, bool encrypted)
@@ -42,7 +53,7 @@ static void WalletCreate(benchmark::Bench& bench, bool encrypted)
// Release wallet
RemoveWallet(context, wallet, /*load_on_start=*/ std::nullopt);
- UnloadWallet(std::move(wallet));
+ WaitForDeleteWallet(std::move(wallet));
fs::remove_all(wallet_path);
});
}
diff --git a/src/bench/wallet_create_tx.cpp b/src/bench/wallet_create_tx.cpp
index 84e02d2a26..3c4b2f4f83 100644
--- a/src/bench/wallet_create_tx.cpp
+++ b/src/bench/wallet_create_tx.cpp
@@ -2,17 +2,42 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+#include <addresstype.h>
#include <bench/bench.h>
+#include <chain.h>
#include <chainparams.h>
-#include <wallet/coincontrol.h>
+#include <consensus/amount.h>
+#include <consensus/consensus.h>
#include <consensus/merkle.h>
+#include <interfaces/chain.h>
#include <kernel/chain.h>
-#include <node/context.h>
+#include <node/blockstorage.h>
+#include <outputtype.h>
+#include <policy/feerate.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <script/script.h>
+#include <sync.h>
#include <test/util/setup_common.h>
+#include <uint256.h>
+#include <util/result.h>
+#include <util/time.h>
#include <validation.h>
+#include <versionbits.h>
+#include <wallet/coincontrol.h>
+#include <wallet/coinselection.h>
#include <wallet/spend.h>
#include <wallet/test/util.h>
#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
+
+#include <cassert>
+#include <cstdint>
+#include <map>
+#include <memory>
+#include <optional>
+#include <utility>
+#include <vector>
using wallet::CWallet;
using wallet::CreateMockableWalletDatabase;
diff --git a/src/bench/wallet_ismine.cpp b/src/bench/wallet_ismine.cpp
index 753404b526..29e370ce29 100644
--- a/src/bench/wallet_ismine.cpp
+++ b/src/bench/wallet_ismine.cpp
@@ -2,20 +2,29 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
+#include <addresstype.h>
#include <bench/bench.h>
-#include <interfaces/chain.h>
+#include <config/bitcoin-config.h> // IWYU pragma: keep
#include <key.h>
#include <key_io.h>
-#include <node/context.h>
+#include <script/descriptor.h>
+#include <script/script.h>
+#include <script/signingprovider.h>
+#include <sync.h>
#include <test/util/setup_common.h>
-#include <util/translation.h>
-#include <validationinterface.h>
#include <wallet/context.h>
+#include <wallet/db.h>
#include <wallet/test/util.h>
+#include <wallet/types.h>
#include <wallet/wallet.h>
#include <wallet/walletutil.h>
+#include <cassert>
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <utility>
+
namespace wallet {
static void WalletIsMine(benchmark::Bench& bench, bool legacy_wallet, int num_combo = 0)
{
@@ -43,8 +52,8 @@ static void WalletIsMine(benchmark::Bench& bench, bool legacy_wallet, int num_co
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);
+ std::vector<std::unique_ptr<Descriptor>> desc = Parse("combo(" + EncodeSecret(key) + ")", keys, error, /*require_checksum=*/false);
+ WalletDescriptor w_desc(std::move(desc.at(0)), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/0, /*next_index=*/0);
auto spkm = wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false);
assert(spkm);
}
diff --git a/src/bench/wallet_loading.cpp b/src/bench/wallet_loading.cpp
index 02582deda4..03459d37c1 100644
--- a/src/bench/wallet_loading.cpp
+++ b/src/bench/wallet_loading.cpp
@@ -2,21 +2,25 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
-
+#include <addresstype.h>
#include <bench/bench.h>
-#include <interfaces/chain.h>
-#include <node/context.h>
-#include <test/util/mining.h>
+#include <config/bitcoin-config.h> // IWYU pragma: keep
+#include <consensus/amount.h>
+#include <outputtype.h>
+#include <primitives/transaction.h>
#include <test/util/setup_common.h>
-#include <wallet/test/util.h>
-#include <util/translation.h>
-#include <validationinterface.h>
+#include <util/check.h>
#include <wallet/context.h>
-#include <wallet/receive.h>
+#include <wallet/db.h>
+#include <wallet/test/util.h>
+#include <wallet/transaction.h>
#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
-#include <optional>
+#include <cstdint>
+#include <memory>
+#include <utility>
+#include <vector>
namespace wallet{
static void AddTx(CWallet& wallet)
diff --git a/src/bench/xor.cpp b/src/bench/xor.cpp
index edda74214a..fc9dc5d172 100644
--- a/src/bench/xor.cpp
+++ b/src/bench/xor.cpp
@@ -3,8 +3,8 @@
// file COPYING or https://opensource.org/license/mit/.
#include <bench/bench.h>
-
#include <random.h>
+#include <span.h>
#include <streams.h>
#include <cstddef>
diff --git a/src/bitcoin-chainstate.cpp b/src/bitcoin-chainstate.cpp
index ecbdcd48bb..9cbafa233d 100644
--- a/src/bitcoin-chainstate.cpp
+++ b/src/bitcoin-chainstate.cpp
@@ -15,11 +15,11 @@
#include <kernel/chainstatemanager_opts.h>
#include <kernel/checks.h>
#include <kernel/context.h>
-#include <kernel/validation_cache_sizes.h>
#include <kernel/warning.h>
#include <consensus/validation.h>
#include <core_io.h>
+#include <logging.h>
#include <node/blockstorage.h>
#include <node/caches.h>
#include <node/chainstate.h>
@@ -42,6 +42,12 @@
int main(int argc, char* argv[])
{
+ // We do not enable logging for this app, so explicitly disable it.
+ // To enable logging instead, replace with:
+ // LogInstance().m_print_to_console = true;
+ // LogInstance().StartLogging();
+ LogInstance().DisableLogging();
+
// SETUP: Argument parsing and handling
if (argc != 2) {
std::cerr
@@ -63,13 +69,6 @@ int main(int argc, char* argv[])
// properly
assert(kernel::SanityChecks(kernel_context));
- // Necessary for CheckInputScripts (eventually called by ProcessNewBlock),
- // which will try the script cache first and fall back to actually
- // performing the check with the signature cache.
- kernel::ValidationCacheSizes validation_cache_sizes{};
- Assert(InitSignatureCache(validation_cache_sizes.signature_cache_bytes));
- Assert(InitScriptExecutionCache(validation_cache_sizes.script_execution_cache_bytes));
-
ValidationSignals validation_signals{std::make_unique<util::ImmediateTaskRunner>()};
class KernelNotifications : public kernel::Notifications
@@ -284,8 +283,6 @@ int main(int argc, char* argv[])
epilogue:
// Without this precise shutdown sequence, there will be a lot of nullptr
// dereferencing and UB.
- if (chainman.m_thread_load.joinable()) chainman.m_thread_load.join();
-
validation_signals.FlushBackgroundCallbacks();
{
LOCK(cs_main);
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp
index 44fc273163..538fe592b8 100644
--- a/src/bitcoin-cli.cpp
+++ b/src/bitcoin-cli.cpp
@@ -75,6 +75,7 @@ static void SetupCliArgs(ArgsManager& argsman)
const auto defaultBaseParams = CreateBaseChainParams(ChainType::MAIN);
const auto testnetBaseParams = CreateBaseChainParams(ChainType::TESTNET);
+ const auto testnet4BaseParams = CreateBaseChainParams(ChainType::TESTNET4);
const auto signetBaseParams = CreateBaseChainParams(ChainType::SIGNET);
const auto regtestBaseParams = CreateBaseChainParams(ChainType::REGTEST);
@@ -86,10 +87,10 @@ static void SetupCliArgs(ArgsManager& argsman)
"arguments are number of blocks to generate (default: %s) and maximum iterations to try (default: %s), equivalent to "
"RPC generatetoaddress nblocks and maxtries arguments. Example: bitcoin-cli -generate 4 1000",
DEFAULT_NBLOCKS, DEFAULT_MAX_TRIES),
- ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-addrinfo", "Get the number of addresses known to the node, per network and total, after filtering for quality and recency. The total number of addresses known to the node may be higher.", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-getinfo", "Get general information from the remote server. Note that unlike server-side RPC calls, the output of -getinfo is the result of multiple non-atomic requests. Some entries in the output may represent results from different states (e.g. wallet balance may be as of a different block from the chain state reported)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-netinfo", "Get network peer connection information from the remote server. An optional integer argument from 0 to 4 can be passed for different peers listings (default: 0). Pass \"help\" for detailed help documentation.", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
+ ArgsManager::ALLOW_ANY, OptionsCategory::CLI_COMMANDS);
+ argsman.AddArg("-addrinfo", "Get the number of addresses known to the node, per network and total, after filtering for quality and recency. The total number of addresses known to the node may be higher.", ArgsManager::ALLOW_ANY, OptionsCategory::CLI_COMMANDS);
+ argsman.AddArg("-getinfo", "Get general information from the remote server. Note that unlike server-side RPC calls, the output of -getinfo is the result of multiple non-atomic requests. Some entries in the output may represent results from different states (e.g. wallet balance may be as of a different block from the chain state reported)", ArgsManager::ALLOW_ANY, OptionsCategory::CLI_COMMANDS);
+ argsman.AddArg("-netinfo", "Get network peer connection information from the remote server. An optional integer argument from 0 to 4 can be passed for different peers listings (default: 0). Pass \"help\" for detailed help documentation.", ArgsManager::ALLOW_ANY, OptionsCategory::CLI_COMMANDS);
SetupChainParamsBaseOptions(argsman);
argsman.AddArg("-color=<when>", strprintf("Color setting for CLI output (default: %s). Valid values: always, auto (add color codes when standard output is connected to a terminal and OS is not WIN32), never.", DEFAULT_COLOR_SETTING), ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::OPTIONS);
@@ -98,7 +99,7 @@ static void SetupCliArgs(ArgsManager& argsman)
argsman.AddArg("-rpcconnect=<ip>", strprintf("Send commands to node running on <ip> (default: %s)", DEFAULT_RPCCONNECT), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
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::OPTIONS);
argsman.AddArg("-rpcpassword=<pw>", "Password for JSON-RPC connections", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-rpcport=<port>", strprintf("Connect to JSON-RPC 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::OPTIONS);
+ argsman.AddArg("-rpcport=<port>", strprintf("Connect to JSON-RPC on <port> (default: %u, testnet: %u, testnet4: %u, signet: %u, regtest: %u)", defaultBaseParams->RPCPort(), testnetBaseParams->RPCPort(), testnet4BaseParams->RPCPort(), signetBaseParams->RPCPort(), regtestBaseParams->RPCPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::OPTIONS);
argsman.AddArg("-rpcuser=<user>", "Username for JSON-RPC connections", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-rpcwait", "Wait for RPC server to start", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-rpcwaittimeout=<n>", strprintf("Timeout in seconds to wait for the RPC server to start, or 0 for no timeout. (default: %d)", DEFAULT_WAIT_CLIENT_TIMEOUT), ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::OPTIONS);
@@ -428,6 +429,8 @@ private:
std::string ChainToString() const
{
switch (gArgs.GetChainType()) {
+ case ChainType::TESTNET4:
+ return " testnet4";
case ChainType::TESTNET:
return " testnet";
case ChainType::SIGNET:
@@ -947,7 +950,8 @@ static void ParseError(const UniValue& error, std::string& strPrint, int& nRet)
strPrint += ("error message:\n" + err_msg.get_str());
}
if (err_code.isNum() && err_code.getInt<int>() == RPC_WALLET_NOT_SPECIFIED) {
- strPrint += "\nTry adding \"-rpcwallet=<filename>\" option to bitcoin-cli command line.";
+ strPrint += " Or for the CLI, specify the \"-rpcwallet=<walletname>\" option before the command";
+ strPrint += " (run \"bitcoin-cli -h\" for help or \"bitcoin-cli listwallets\" to see which wallets are currently loaded).";
}
} else {
strPrint = "error: " + error.write();
@@ -1209,6 +1213,7 @@ static int CommandLineRPC(int argc, char *argv[])
fputc('\n', stdout);
}
}
+ gArgs.CheckMultipleCLIArgs();
std::unique_ptr<BaseRequestHandler> rh;
std::string method;
if (gArgs.IsArgSet("-getinfo")) {
diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp
index 89faa0123a..89c03c1647 100644
--- a/src/bitcoin-tx.cpp
+++ b/src/bitcoin-tx.cpp
@@ -264,8 +264,8 @@ static void MutateTxAddInput(CMutableTransaction& tx, const std::string& strInpu
throw std::runtime_error("TX input missing separator");
// extract and validate TXID
- uint256 txid;
- if (!ParseHashStr(vStrInputParts[0], txid)) {
+ auto txid{Txid::FromHex(vStrInputParts[0])};
+ if (!txid) {
throw std::runtime_error("invalid TX input txid");
}
@@ -285,7 +285,7 @@ static void MutateTxAddInput(CMutableTransaction& tx, const std::string& strInpu
}
// append to transaction input list
- CTxIn txin(Txid::FromUint256(txid), vout, CScript(), nSequenceIn);
+ CTxIn txin(*txid, vout, CScript(), nSequenceIn);
tx.vin.push_back(txin);
}
@@ -625,8 +625,8 @@ static void MutateTxSign(CMutableTransaction& tx, const std::string& flagStr)
if (!prevOut.checkObject(types))
throw std::runtime_error("prevtxs internal object typecheck fail");
- uint256 txid;
- if (!ParseHashStr(prevOut["txid"].get_str(), txid)) {
+ auto txid{Txid::FromHex(prevOut["txid"].get_str())};
+ if (!txid) {
throw std::runtime_error("txid must be hexadecimal string (not '" + prevOut["txid"].get_str() + "')");
}
@@ -634,7 +634,7 @@ static void MutateTxSign(CMutableTransaction& tx, const std::string& flagStr)
if (nOut < 0)
throw std::runtime_error("vout cannot be negative");
- COutPoint out(Txid::FromUint256(txid), nOut);
+ COutPoint out(*txid, nOut);
std::vector<unsigned char> pkData(ParseHexUV(prevOut["scriptPubKey"], "scriptPubKey"));
CScript scriptPubKey(pkData.begin(), pkData.end());
diff --git a/src/bitcoin-wallet.cpp b/src/bitcoin-wallet.cpp
index b6f5c3f15d..7d030abe97 100644
--- a/src/bitcoin-wallet.cpp
+++ b/src/bitcoin-wallet.cpp
@@ -69,7 +69,7 @@ static std::optional<int> WalletAppInit(ArgsManager& args, int argc, char* argv[
strUsage += "\n"
"bitcoin-wallet is an offline tool for creating and interacting with " PACKAGE_NAME " wallet files.\n"
"By default bitcoin-wallet will act on wallets in the default mainnet wallet directory in the datadir.\n"
- "To change the target wallet, use the -datadir, -wallet and -regtest/-signet/-testnet arguments.\n\n"
+ "To change the target wallet, use the -datadir, -wallet and -regtest/-signet/-testnet/-testnet4 arguments.\n\n"
"Usage:\n"
" bitcoin-wallet [options] <command>\n";
strUsage += "\n" + args.GetHelpMessage();
diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp
index a09bb5c9da..1e27924dfd 100644
--- a/src/bitcoind.cpp
+++ b/src/bitcoind.cpp
@@ -109,10 +109,11 @@ int fork_daemon(bool nochdir, bool noclose, TokenPipeEnd& endpoint)
#endif
-static bool ParseArgs(ArgsManager& args, int argc, char* argv[])
+static bool ParseArgs(NodeContext& node, int argc, char* argv[])
{
+ ArgsManager& args{*Assert(node.args)};
// If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main()
- SetupServerArgs(args);
+ SetupServerArgs(args, node.init->canListenIpc());
std::string error;
if (!args.ParseParameters(argc, argv, error)) {
return InitError(Untranslated(strprintf("Error parsing command line arguments: %s", error)));
@@ -268,7 +269,7 @@ MAIN_FUNCTION
// Interpret command line arguments
ArgsManager& args = *Assert(node.args);
- if (!ParseArgs(args, argc, argv)) return EXIT_FAILURE;
+ if (!ParseArgs(node, argc, argv)) return EXIT_FAILURE;
// Process early info return commands such as -help or -version
if (ProcessInitCommands(args)) return EXIT_SUCCESS;
diff --git a/src/blockencodings.cpp b/src/blockencodings.cpp
index 2bcb4b0c3d..5f4061a71d 100644
--- a/src/blockencodings.cpp
+++ b/src/blockencodings.cpp
@@ -167,7 +167,7 @@ ReadStatus PartiallyDownloadedBlock::InitData(const CBlockHeaderAndShortTxIDs& c
break;
}
- LogPrint(BCLog::CMPCTBLOCK, "Initialized PartiallyDownloadedBlock for block %s using a cmpctblock of size %lu\n", cmpctblock.header.GetHash().ToString(), GetSerializeSize(cmpctblock));
+ LogDebug(BCLog::CMPCTBLOCK, "Initialized PartiallyDownloadedBlock for block %s using a cmpctblock of size %lu\n", cmpctblock.header.GetHash().ToString(), GetSerializeSize(cmpctblock));
return READ_STATUS_OK;
}
@@ -217,10 +217,10 @@ ReadStatus PartiallyDownloadedBlock::FillBlock(CBlock& block, const std::vector<
return READ_STATUS_CHECKBLOCK_FAILED;
}
- LogPrint(BCLog::CMPCTBLOCK, "Successfully reconstructed block %s with %lu txn prefilled, %lu txn from mempool (incl at least %lu from extra pool) and %lu txn requested\n", hash.ToString(), prefilled_count, mempool_count, extra_count, vtx_missing.size());
+ LogDebug(BCLog::CMPCTBLOCK, "Successfully reconstructed block %s with %lu txn prefilled, %lu txn from mempool (incl at least %lu from extra pool) and %lu txn requested\n", hash.ToString(), prefilled_count, mempool_count, extra_count, vtx_missing.size());
if (vtx_missing.size() < 5) {
for (const auto& tx : vtx_missing) {
- LogPrint(BCLog::CMPCTBLOCK, "Reconstructed block %s required tx %s\n", hash.ToString(), tx->GetHash().ToString());
+ LogDebug(BCLog::CMPCTBLOCK, "Reconstructed block %s required tx %s\n", hash.ToString(), tx->GetHash().ToString());
}
}
diff --git a/src/blockencodings.h b/src/blockencodings.h
index bc1d08ba5a..c92aa05e80 100644
--- a/src/blockencodings.h
+++ b/src/blockencodings.h
@@ -59,7 +59,7 @@ public:
uint256 blockhash;
std::vector<CTransactionRef> txn;
- BlockTransactions() {}
+ BlockTransactions() = default;
explicit BlockTransactions(const BlockTransactionsRequest& req) :
blockhash(req.blockhash), txn(req.indexes.size()) {}
@@ -109,7 +109,7 @@ public:
/**
* Dummy for deserialization
*/
- CBlockHeaderAndShortTxIDs() {}
+ CBlockHeaderAndShortTxIDs() = default;
/**
* @param[in] nonce This should be randomly generated, and is used for the siphash secret key
diff --git a/src/chain.h b/src/chain.h
index bb70dbd8bc..13f7582385 100644
--- a/src/chain.h
+++ b/src/chain.h
@@ -66,7 +66,7 @@ public:
READWRITE(VARINT(obj.nTimeLast));
}
- CBlockFileInfo() {}
+ CBlockFileInfo() = default;
std::string ToString() const;
@@ -102,7 +102,7 @@ enum BlockStatus : uint32_t {
*
* If a block's validity is at least VALID_TRANSACTIONS, CBlockIndex::nTx will be set. If a block and all previous
* blocks back to the genesis block or an assumeutxo snapshot block are at least VALID_TRANSACTIONS,
- * CBlockIndex::nChainTx will be set.
+ * CBlockIndex::m_chain_tx_count will be set.
*/
BLOCK_VALID_TRANSACTIONS = 3,
@@ -173,13 +173,12 @@ public:
//! This value will be non-zero if this block and all previous blocks back
//! to the genesis block or an assumeutxo snapshot block have reached the
//! VALID_TRANSACTIONS level.
- //! Change to 64-bit type before 2024 (assuming worst case of 60 byte transactions).
- unsigned int nChainTx{0};
+ uint64_t m_chain_tx_count{0};
//! Verification status of this block. See enum BlockStatus
//!
//! Note: this value is modified to show BLOCK_OPT_WITNESS during UTXO snapshot
- //! load to avoid the block index being spuriously rewound.
+ //! load to avoid a spurious startup failure requiring -reindex.
//! @sa NeedsRedownload
//! @sa ActivateSnapshot
uint32_t nStatus GUARDED_BY(::cs_main){0};
@@ -254,10 +253,10 @@ public:
* Does not imply the transactions are consensus-valid (ConnectTip might fail)
* Does not imply the transactions are still stored on disk. (IsBlockPruned might return true)
*
- * Note that this will be true for the snapshot base block, if one is loaded, since its nChainTx value will have
+ * Note that this will be true for the snapshot base block, if one is loaded, since its m_chain_tx_count value will have
* been set manually based on the related AssumeutxoData entry.
*/
- bool HaveNumChainTxs() const { return nChainTx != 0; }
+ bool HaveNumChainTxs() const { return m_chain_tx_count != 0; }
NodeSeconds Time() const
{
diff --git a/src/chainparams.cpp b/src/chainparams.cpp
index 5d4401b719..68319e8e8b 100644
--- a/src/chainparams.cpp
+++ b/src/chainparams.cpp
@@ -115,6 +115,8 @@ std::unique_ptr<const CChainParams> CreateChainParams(const ArgsManager& args, c
return CChainParams::Main();
case ChainType::TESTNET:
return CChainParams::TestNet();
+ case ChainType::TESTNET4:
+ return CChainParams::TestNet4();
case ChainType::SIGNET: {
auto opts = CChainParams::SigNetOptions{};
ReadSigNetArgs(args, opts);
diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp
index 8cbf9e85e0..aadd04e509 100644
--- a/src/chainparamsbase.cpp
+++ b/src/chainparamsbase.cpp
@@ -13,11 +13,12 @@
void SetupChainParamsBaseOptions(ArgsManager& argsman)
{
- argsman.AddArg("-chain=<chain>", "Use the chain <chain> (default: main). Allowed values: main, test, signet, regtest", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
+ argsman.AddArg("-chain=<chain>", "Use the chain <chain> (default: main). Allowed values: " LIST_CHAIN_NAMES, ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
argsman.AddArg("-regtest", "Enter regression test mode, which uses a special chain in which blocks can be solved instantly. "
"This is intended for regression testing tools and app development. Equivalent to -chain=regtest.", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS);
argsman.AddArg("-testactivationheight=name@height.", "Set the activation height of 'name' (segwit, bip34, dersig, cltv, csv). (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
- argsman.AddArg("-testnet", "Use the test chain. Equivalent to -chain=test.", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
+ argsman.AddArg("-testnet", "Use the testnet3 chain. Equivalent to -chain=test. Support for testnet3 is deprecated and will be removed in an upcoming release. Consider moving to testnet4 now by using -testnet4.", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
+ argsman.AddArg("-testnet4", "Use the testnet4 chain. Equivalent to -chain=testnet4.", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
argsman.AddArg("-vbparams=deployment:start:end[:min_activation_height]", "Use given start/end times and min_activation_height for specified version bits deployment (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS);
argsman.AddArg("-signet", "Use the signet chain. Equivalent to -chain=signet. Note that the network is defined by the -signetchallenge parameter", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
argsman.AddArg("-signetchallenge", "Blocks must satisfy the given script to be considered valid (only for signet networks; defaults to the global default signet test network challenge)", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::CHAINPARAMS);
@@ -33,7 +34,7 @@ const CBaseChainParams& BaseParams()
}
/**
- * Port numbers for incoming Tor connections (8334, 18334, 38334, 18445) have
+ * Port numbers for incoming Tor connections (8334, 18334, 38334, 48334, 18445) have
* been chosen arbitrarily to keep ranges of used ports tight.
*/
std::unique_ptr<CBaseChainParams> CreateBaseChainParams(const ChainType chain)
@@ -43,6 +44,8 @@ std::unique_ptr<CBaseChainParams> CreateBaseChainParams(const ChainType chain)
return std::make_unique<CBaseChainParams>("", 8332, 8334);
case ChainType::TESTNET:
return std::make_unique<CBaseChainParams>("testnet3", 18332, 18334);
+ case ChainType::TESTNET4:
+ return std::make_unique<CBaseChainParams>("testnet4", 48332, 48334);
case ChainType::SIGNET:
return std::make_unique<CBaseChainParams>("signet", 38332, 38334);
case ChainType::REGTEST:
diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h
index ea933d1ca8..c75a70cb96 100644
--- a/src/chainparamsbase.h
+++ b/src/chainparamsbase.h
@@ -7,6 +7,7 @@
#include <util/chaintype.h>
+#include <cstdint>
#include <memory>
#include <string>
@@ -52,4 +53,7 @@ const CBaseChainParams& BaseParams();
/** Sets the params returned by Params() to those for the given chain. */
void SelectBaseParams(const ChainType chain);
+/** List of possible chain / network names */
+#define LIST_CHAIN_NAMES "main, test, testnet4, signet, regtest"
+
#endif // BITCOIN_CHAINPARAMSBASE_H
diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h
index 554d0cae5a..ecab817ba1 100644
--- a/src/chainparamsseeds.h
+++ b/src/chainparamsseeds.h
@@ -7,537 +7,1072 @@
* Each line contains a BIP155 serialized (networkID, addr, port) tuple.
*/
static const uint8_t chainparams_seed_main[] = {
- 0x01,0x04,0x01,0xfd,0x9f,0x13,0x20,0x8d,
- 0x01,0x04,0x02,0x98,0x4a,0xd3,0x20,0x8d,
+ 0x06,0x10,0xfc,0x1f,0x22,0xc3,0x95,0xdc,0xa3,0xaf,0x4a,0x93,0x82,0x51,0xbe,0xb9,0x18,0x58,0x20,0x8d,
+ 0x06,0x10,0xfc,0x6d,0xf5,0x62,0x86,0xa0,0x79,0x1d,0x8a,0x20,0x7a,0xa2,0x88,0x79,0x21,0x76,0x20,0x8d,
+ 0x06,0x10,0xfc,0x70,0xde,0x9d,0x7f,0xe2,0x0b,0x32,0x58,0x28,0x1a,0x3c,0x0d,0x0f,0x83,0xec,0x20,0x8d,
+ 0x06,0x10,0xfc,0x95,0x6e,0xdb,0xaf,0x65,0x9e,0xa3,0xcd,0x27,0x21,0xef,0xf5,0xe2,0x29,0xc6,0x20,0x8d,
+ 0x06,0x10,0xfc,0xa0,0x01,0x51,0x79,0xac,0x89,0x92,0xb5,0x1e,0xbd,0xc4,0x6e,0xd9,0x41,0xbe,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,0xcb,0x02,0x48,0x11,0xa6,0x10,0x42,0x0b,0xca,0x12,0x18,0xf7,0xce,0x7d,0x3d,0x20,0x8d,
+ 0x06,0x10,0xfc,0xf1,0x22,0xff,0x30,0x70,0x58,0x2f,0xa8,0x73,0x61,0xbc,0x4b,0xc1,0x81,0xbf,0x20,0x8d,
+ 0x05,0x20,0xd6,0xf3,0x0c,0x53,0xa3,0xbc,0x36,0x64,0x2e,0xfd,0x1a,0x0e,0xbc,0x24,0xfe,0x98,0x55,0x67,0x30,0x38,0x02,0xa5,0xc7,0x84,0x98,0x36,0x9f,0x04,0xd6,0xbf,0x7d,0x27,0x00,0x00,
+ 0x05,0x20,0xd7,0xad,0x8b,0xe2,0x42,0x70,0x24,0xd9,0x88,0x4f,0xf2,0xb6,0x40,0x44,0x48,0x5c,0x70,0xa5,0x1b,0x25,0x88,0xd1,0x3d,0x64,0xb6,0xeb,0x38,0xf0,0x4d,0xc2,0xad,0x21,0x00,0x00,
+ 0x05,0x20,0xd7,0xae,0xef,0x3a,0x88,0x82,0x06,0x0f,0x15,0x15,0x57,0xc4,0x54,0x46,0xb8,0x94,0xb8,0x48,0x39,0x04,0x2b,0x90,0xcf,0x3c,0x82,0x1c,0x10,0x49,0x96,0xd7,0x6d,0x17,0x00,0x00,
+ 0x05,0x20,0xd0,0xe5,0x8b,0xb6,0xf9,0xb3,0xbc,0xb9,0xd1,0xdb,0x3b,0x46,0xd7,0x39,0xfa,0x80,0xb4,0xf4,0xe8,0x59,0x29,0x98,0x90,0xa5,0xb0,0x8b,0x5b,0x72,0x95,0x91,0xd3,0x80,0x00,0x00,
+ 0x05,0x20,0xd1,0x24,0x72,0x32,0xb4,0xae,0x00,0x73,0x48,0xe4,0x2c,0xb9,0xfb,0x4f,0x64,0x81,0xb7,0x5a,0xde,0xdd,0x4e,0x57,0x76,0x79,0x68,0x1e,0x09,0xd1,0xfb,0x26,0x12,0xd2,0x00,0x00,
+ 0x05,0x20,0xd1,0x54,0x90,0xe9,0xdf,0x7f,0x0c,0x34,0xf8,0xe9,0x46,0x26,0x65,0x1e,0xa8,0x9c,0x2c,0x98,0xb7,0xea,0x60,0xef,0x91,0xd2,0xc8,0x92,0x9f,0x81,0x37,0x27,0xaa,0xac,0x00,0x00,
+ 0x05,0x20,0xd1,0xd3,0x69,0xb9,0x56,0xe3,0x2f,0x59,0xa9,0x9d,0x7b,0xbd,0xb5,0x24,0xf8,0x77,0xd6,0x59,0x02,0x25,0x11,0xa0,0xfd,0x1d,0xfd,0x47,0x08,0xfb,0xee,0x15,0x9b,0x68,0x00,0x00,
+ 0x05,0x20,0xd2,0x4c,0x5b,0xdf,0x33,0x97,0xa2,0x58,0xf5,0x9a,0x45,0x94,0xb5,0xcf,0x00,0xd2,0x99,0x42,0x25,0xaa,0xa1,0x5f,0x3e,0x04,0x15,0xb2,0x4e,0x8d,0x27,0xe5,0x66,0x18,0x00,0x00,
+ 0x05,0x20,0xd2,0x67,0xd0,0x51,0x50,0xda,0x15,0xf0,0xd3,0x85,0x8d,0x0c,0x8e,0xd0,0x6a,0xb2,0xc4,0xa3,0x9c,0xd7,0x8e,0x52,0x74,0xd4,0xb9,0x41,0x1c,0xc5,0x5f,0x80,0x35,0xe1,0x00,0x00,
+ 0x05,0x20,0xd2,0xb6,0xbc,0xcf,0x25,0x02,0xf6,0xaf,0x0d,0x7f,0xc4,0x4f,0xa4,0xe1,0x45,0x06,0xee,0xf6,0x3a,0x9a,0x17,0xc4,0xcd,0x12,0xce,0xe4,0x05,0x35,0x2a,0xa1,0x39,0x6b,0x00,0x00,
+ 0x05,0x20,0xd2,0x83,0xb0,0x24,0x1e,0x5b,0xbc,0xfa,0x68,0x3a,0xfc,0xdd,0x2f,0x72,0x66,0x77,0x15,0x7c,0x82,0x64,0xd6,0x78,0x4b,0x6d,0x8f,0x62,0xa5,0x03,0xfa,0xd9,0x4c,0xa6,0x00,0x00,
+ 0x05,0x20,0xd3,0x28,0xae,0xff,0x5d,0xec,0xc6,0xce,0x1b,0x5f,0xd9,0x71,0xf0,0x22,0x71,0x64,0x1b,0x3a,0x46,0x93,0xf2,0xa3,0x07,0x26,0xf9,0xff,0x93,0x29,0x46,0x0c,0xd4,0x64,0x00,0x00,
+ 0x05,0x20,0xd3,0xb9,0x97,0x12,0xfa,0x7c,0x21,0x80,0x8f,0x17,0xa5,0x9c,0x86,0x37,0x6a,0x26,0xb6,0x08,0x3b,0x85,0x68,0x0c,0xb6,0x47,0x87,0xb1,0xc1,0x40,0x9d,0xa4,0x7b,0xdd,0x00,0x00,
+ 0x05,0x20,0xd3,0x87,0xc3,0x49,0x01,0xea,0x9a,0xa8,0x74,0xa7,0x0b,0x31,0x27,0xed,0xa1,0x21,0xe7,0x2f,0x7d,0xa5,0x06,0xbc,0x9a,0xf8,0xca,0x24,0x88,0x7b,0x60,0x55,0xfc,0xca,0x00,0x00,
+ 0x05,0x20,0xd3,0xa7,0xf2,0x20,0x00,0x90,0x6e,0x73,0x83,0x53,0xb9,0xa4,0x91,0xf0,0x9e,0x43,0x68,0x64,0x0c,0xfe,0xc4,0x5c,0xd4,0x8d,0x48,0xc0,0x41,0xd9,0x4b,0x6a,0x9e,0x35,0x00,0x00,
+ 0x05,0x20,0xd4,0x42,0xca,0xec,0xf8,0x8f,0x17,0xcd,0x62,0x55,0x4f,0xb4,0x33,0x3b,0x2b,0x63,0xa4,0x39,0x47,0xdd,0xbf,0x07,0x03,0x56,0xfb,0x05,0xcb,0x9c,0x5b,0x54,0xc4,0xdb,0x00,0x00,
+ 0x05,0x20,0xd5,0x7a,0xd8,0xee,0x9b,0x90,0x83,0x8b,0x8f,0x6d,0x54,0x2e,0x86,0xdb,0x4f,0xac,0x20,0x4f,0x7b,0x1c,0x38,0xb7,0x4f,0x19,0xd3,0x42,0xf5,0x23,0x07,0x08,0xac,0x69,0x00,0x00,
+ 0x05,0x20,0xd5,0x64,0xb2,0x2c,0x56,0xce,0x2f,0x5a,0xb3,0x71,0xcc,0x74,0x88,0x86,0xa0,0xb7,0xc9,0x84,0x2d,0x79,0x9d,0x8b,0x11,0x8f,0x5c,0xcc,0x8e,0x7b,0x1c,0xbd,0x8b,0x13,0x00,0x00,
+ 0x05,0x20,0xd5,0x6c,0xb6,0x58,0x32,0x6b,0x3c,0x54,0x14,0xa2,0x5f,0x5a,0x6c,0xf0,0xdf,0x8f,0x27,0x84,0x12,0x9f,0x4f,0x2e,0xc7,0xd9,0x6c,0x16,0xaf,0x75,0xe9,0x98,0x1e,0xb3,0x00,0x00,
+ 0x05,0x20,0xd5,0xdb,0x6a,0xc3,0x8c,0x90,0x30,0xba,0xe8,0x0e,0x67,0xda,0x7a,0x16,0x49,0xc4,0x0e,0xef,0xc0,0xfb,0x33,0xd0,0x44,0xea,0xc1,0x5f,0x90,0xc1,0x94,0x0b,0xc4,0x5d,0x00,0x00,
+ 0x05,0x20,0xd6,0x79,0x01,0x2a,0x09,0x56,0x75,0x74,0xda,0x2e,0x3a,0x13,0xef,0x72,0x0b,0x04,0x41,0x77,0x6a,0x38,0x04,0x85,0x25,0xdb,0x84,0x39,0x53,0x79,0xae,0x76,0x72,0xf3,0x00,0x00,
+ 0x05,0x20,0xdf,0xe6,0xcb,0x43,0x43,0xc7,0x24,0xc8,0x1b,0x9e,0x82,0x8d,0x59,0x75,0xee,0x10,0x36,0x71,0x11,0xc4,0x79,0xcc,0xae,0xb9,0xa9,0x89,0x93,0x7c,0x3c,0xfc,0x18,0xd7,0x00,0x00,
+ 0x05,0x20,0xd8,0xa7,0x0e,0xa6,0x82,0x65,0x0d,0x74,0xd1,0x9a,0xb8,0x18,0xc2,0x87,0x26,0x1b,0x25,0x7d,0x6c,0x0a,0xdb,0xc9,0x45,0x7b,0x81,0xfd,0x4d,0x0e,0xdb,0x99,0xf9,0xe1,0x00,0x00,
+ 0x05,0x20,0xd8,0xfa,0x75,0x9a,0x8e,0xde,0x32,0x1c,0xd8,0x3f,0x22,0xb9,0xea,0x09,0x5a,0x67,0xbf,0x4e,0x62,0x94,0x7f,0x3b,0xeb,0x62,0xc3,0xae,0x4f,0x90,0x64,0x54,0xe6,0xeb,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,0xd9,0xf2,0x84,0x0e,0x2f,0xcc,0x2a,0xd9,0x71,0x36,0x2c,0x0f,0x90,0xfd,0xb8,0x1d,0xb8,0xc9,0xb5,0xaa,0x05,0x9e,0x48,0x96,0xad,0x04,0x69,0xbc,0xbe,0x8f,0xd2,0x0f,0x00,0x00,
+ 0x05,0x20,0xda,0x11,0x7a,0xe2,0xd7,0x85,0x9b,0x2e,0x7f,0xf1,0xf0,0x2e,0x7c,0x2c,0xa2,0x99,0x21,0xd0,0xd8,0xc6,0xc7,0xc4,0xc8,0x86,0x93,0x84,0x48,0x3e,0xf1,0x48,0x35,0x9c,0x00,0x00,
+ 0x05,0x20,0xda,0x60,0x9c,0x4c,0x9a,0x57,0xae,0xd7,0x12,0x78,0x33,0x3c,0x62,0x81,0x48,0x95,0x33,0xb2,0x42,0xf1,0xd9,0x45,0x4e,0x2f,0xaa,0x65,0x37,0x94,0x15,0xed,0x51,0xeb,0x00,0x00,
+ 0x05,0x20,0xdb,0x81,0xd2,0xe0,0x57,0xdc,0xf0,0x41,0x1c,0x65,0x33,0x9d,0x3b,0x89,0xe0,0x7f,0xe5,0x7f,0xbf,0x72,0x05,0x88,0xd8,0x87,0x38,0xc5,0xe3,0x3c,0x7f,0x91,0x9f,0xf3,0x00,0x00,
+ 0x05,0x20,0xdc,0x7e,0xce,0xb0,0x24,0x71,0x95,0x1f,0x4b,0x1e,0xf1,0x7c,0x6d,0xeb,0xad,0x91,0x74,0x94,0x21,0x93,0x28,0xdb,0xda,0xfa,0xcf,0xbe,0x7d,0x48,0x32,0x58,0x0c,0x12,0x00,0x00,
+ 0x05,0x20,0xdc,0xbf,0x96,0x01,0x86,0x2b,0x16,0x7b,0x56,0x2d,0xeb,0xab,0xbd,0x52,0x86,0x0a,0xc6,0xe5,0x03,0xe9,0xb8,0x49,0x3a,0x7a,0x69,0x94,0x36,0x1c,0xaa,0x21,0xe8,0xc4,0x00,0x00,
+ 0x05,0x20,0xdd,0x28,0x34,0xf9,0x65,0xc5,0x93,0x08,0x85,0x0f,0x59,0xac,0xe0,0x5d,0xe4,0x0e,0x95,0xc6,0x03,0xfd,0x62,0xd8,0xf4,0x43,0xee,0xb5,0x76,0x17,0x16,0xcb,0xa8,0x07,0x00,0x00,
+ 0x05,0x20,0xde,0x38,0xe4,0x5b,0xe2,0x32,0xf3,0x99,0x1c,0x12,0x03,0xca,0xc5,0xcc,0x9f,0x45,0xc2,0x67,0xaf,0x89,0x97,0xed,0xa0,0x16,0x43,0xe6,0x5a,0x46,0x53,0x83,0x19,0x0a,0x00,0x00,
+ 0x05,0x20,0xe6,0x8d,0x48,0x4a,0xa3,0x21,0x39,0x36,0x43,0x70,0x07,0x58,0x9b,0x76,0xa9,0x56,0x54,0xaa,0x2b,0xa4,0x02,0x1a,0x41,0x4a,0x32,0x19,0x49,0x7d,0xdb,0x05,0xfc,0xed,0x00,0x00,
+ 0x05,0x20,0xe7,0x20,0x1d,0xb4,0xb2,0x89,0x23,0xa2,0xf0,0x98,0x3f,0x79,0x2f,0xc0,0x75,0xb5,0xd1,0x85,0x26,0x24,0x8f,0xfc,0x94,0x92,0xa2,0x0b,0xc6,0xdd,0xa3,0xd4,0x06,0x02,0x00,0x00,
+ 0x05,0x20,0xe7,0x2a,0xd2,0x00,0x8c,0x40,0xff,0xd1,0x3b,0xb3,0xfc,0x52,0xd7,0xed,0xc5,0x78,0x23,0xdd,0x18,0xda,0x38,0x61,0x8f,0x89,0x8e,0x59,0x5a,0xbd,0x60,0xe9,0x13,0x1f,0x00,0x00,
+ 0x05,0x20,0xe7,0x48,0x7f,0x46,0xe1,0x2a,0xd1,0xc4,0xd3,0x5e,0x14,0x00,0x5f,0x6e,0xa5,0x97,0x6f,0x7f,0x64,0xd3,0xf9,0xdb,0xba,0x67,0x39,0xdb,0x48,0xce,0x74,0x7c,0x7c,0xbd,0x00,0x00,
+ 0x05,0x20,0xe7,0xae,0xe8,0xe3,0xde,0x78,0xbd,0x0b,0x8f,0xc6,0x58,0x1e,0xc1,0x46,0xf4,0x4b,0xfd,0x61,0x76,0x56,0x31,0xce,0x16,0x9f,0x01,0xa9,0x2d,0x72,0x95,0xdb,0xf9,0x81,0x00,0x00,
+ 0x05,0x20,0xe7,0xd3,0x15,0xc1,0x63,0xf3,0x3e,0x00,0x82,0xfe,0x63,0x17,0x8d,0x6d,0xe6,0xe1,0xf0,0x07,0x89,0x4c,0xbf,0x0e,0x7c,0xe6,0x4e,0xca,0x8c,0x09,0x5a,0x14,0xdb,0x43,0x00,0x00,
+ 0x05,0x20,0xe0,0x7e,0xc1,0x3a,0x9f,0xb4,0xc1,0x97,0x5e,0xd7,0x7b,0x3b,0x35,0xf2,0x6a,0xfc,0x00,0x05,0xb4,0x01,0x1f,0x91,0xfb,0x55,0xac,0x7d,0x7a,0xe6,0x55,0xdf,0x71,0x96,0x00,0x00,
+ 0x05,0x20,0xe0,0xc7,0x44,0x62,0x6e,0x7e,0xe0,0x94,0x38,0x61,0xd2,0x5b,0x6a,0x9e,0xad,0xc4,0x7d,0x6d,0xe3,0xa0,0xbe,0x77,0x5c,0xab,0xb0,0x89,0x48,0x5a,0x47,0x85,0x37,0xa1,0x00,0x00,
+ 0x05,0x20,0xe0,0xd1,0x79,0x18,0x6b,0xd8,0x5e,0xd5,0x20,0x07,0x67,0xe8,0x06,0xd1,0xf8,0x13,0xca,0x6e,0xec,0xf7,0x70,0x6e,0x66,0x74,0xb2,0x6c,0xaa,0xf9,0xeb,0x07,0x02,0xe0,0x00,0x00,
+ 0x05,0x20,0xe2,0xcb,0x45,0x57,0x29,0x15,0x1f,0x2a,0xa4,0x73,0x76,0x08,0x05,0x80,0x39,0x08,0xe4,0xfd,0x82,0x3c,0x9a,0x42,0x7b,0xce,0xd8,0x78,0x43,0xa5,0xfd,0x9a,0x13,0xed,0x00,0x00,
+ 0x05,0x20,0xe2,0xd8,0x76,0xea,0xf0,0x2a,0x1a,0x42,0x62,0x14,0xbd,0xeb,0xd4,0x5d,0xd9,0x82,0x9b,0xc2,0x62,0x99,0x10,0x96,0xaf,0x6b,0xd0,0xf7,0xd0,0xc7,0xdf,0xa7,0x6b,0x4f,0x00,0x00,
+ 0x05,0x20,0xe2,0xdc,0xc6,0x36,0xe0,0xce,0x3c,0x2f,0xef,0x98,0xc0,0x82,0xcc,0xc1,0x4e,0x1a,0xf2,0x2b,0xbe,0xd2,0x0e,0x3b,0x65,0xb0,0xed,0x38,0x83,0x83,0x01,0x86,0xb4,0x6e,0x00,0x00,
+ 0x05,0x20,0xe3,0x10,0xf5,0xda,0xed,0xb1,0xf6,0xb6,0x80,0x06,0xd3,0xd2,0x43,0x8f,0x17,0xc6,0x4d,0x12,0xe7,0xd8,0x17,0xab,0x6a,0x2c,0x34,0x37,0x93,0x1e,0x45,0xa4,0x9e,0x53,0x00,0x00,
+ 0x05,0x20,0xe3,0x6e,0x3c,0x2e,0x66,0x1d,0x9e,0x55,0x02,0x93,0x7c,0x40,0xb0,0x08,0x6b,0x72,0xf2,0xb7,0xda,0x3c,0xd8,0x93,0xc4,0x1b,0x86,0x76,0x5b,0xdc,0x73,0x66,0x57,0x9b,0x00,0x00,
+ 0x05,0x20,0xe4,0x50,0xf4,0x5f,0x52,0x23,0xba,0x01,0x6c,0x29,0x0f,0x01,0xd5,0xba,0x87,0x98,0x70,0x23,0x1f,0x05,0xda,0xc9,0x89,0x20,0x78,0xd6,0xac,0xd0,0x81,0x5f,0x9e,0x53,0x00,0x00,
+ 0x05,0x20,0xe4,0x5d,0xe7,0x28,0x3b,0xbf,0xb8,0x6f,0xd3,0x8a,0x39,0xc5,0xf8,0xc0,0x0b,0x62,0xac,0xa5,0x51,0x81,0x05,0x54,0x2b,0xfe,0xb0,0x78,0xaa,0xa4,0x6a,0x8d,0x07,0xf4,0x00,0x00,
+ 0x05,0x20,0xe4,0xb7,0xf2,0x63,0x76,0xe2,0xda,0x29,0x7a,0xf7,0xc0,0x9b,0x75,0x48,0x27,0x04,0xcb,0x5b,0xea,0x73,0x30,0xb6,0xe0,0x8e,0xaf,0x44,0x51,0x1e,0x67,0x29,0x04,0xa5,0x00,0x00,
+ 0x05,0x20,0xef,0xe4,0x71,0x17,0x28,0x07,0xfa,0xa2,0x4d,0x71,0x84,0x5b,0x53,0x5e,0xa0,0x42,0x4e,0x19,0xb7,0x72,0x6c,0x53,0x6f,0x7b,0x60,0x6a,0xba,0x10,0x27,0xf0,0x8e,0xba,0x00,0x00,
+ 0x05,0x20,0xe8,0x0d,0x85,0x84,0xaa,0xa5,0xad,0x06,0xe1,0x10,0xb4,0xcd,0x73,0x41,0x78,0x0b,0x94,0xa8,0x16,0xae,0xbd,0x92,0x15,0x0b,0xfb,0xd0,0x82,0xe9,0xf4,0xba,0xcf,0x1b,0x00,0x00,
+ 0x05,0x20,0xe8,0x60,0xd7,0xb3,0x73,0x82,0xd5,0x83,0x40,0xd4,0xea,0xdb,0x9b,0xde,0x96,0xf0,0x42,0x91,0xe6,0x0a,0x18,0x42,0xc5,0x94,0x39,0x6f,0x37,0xc8,0x3f,0x09,0xfb,0x27,0x00,0x00,
+ 0x05,0x20,0xe9,0x19,0x33,0xb3,0xeb,0xa2,0x92,0x03,0xe9,0xed,0x83,0xa9,0x16,0x34,0xe9,0x57,0xb2,0x7a,0x26,0x26,0xca,0x60,0x32,0x54,0x99,0x19,0x7c,0x3f,0x54,0x0b,0x12,0xd0,0x00,0x00,
+ 0x05,0x20,0xe9,0x75,0x2b,0xf5,0xa4,0xd0,0x87,0xd6,0x4d,0xc1,0x8e,0x80,0x12,0x19,0x99,0xb1,0xf4,0xef,0x21,0x04,0xde,0x17,0x13,0x99,0x23,0x50,0x51,0x54,0xc0,0x23,0x63,0xc9,0x00,0x00,
+ 0x05,0x20,0xea,0x14,0x9c,0x75,0xf9,0x32,0x55,0xbf,0x9c,0xff,0x28,0x94,0xdc,0x60,0xf7,0xed,0x7a,0xb5,0x08,0xe9,0x82,0x9b,0x7f,0x9f,0x11,0x29,0x62,0x9f,0x9e,0xbf,0x5e,0x03,0x00,0x00,
+ 0x05,0x20,0xea,0x9c,0x6f,0xee,0x96,0x99,0xe5,0xae,0xf6,0x63,0x8d,0x88,0x4f,0x8c,0x5a,0x7c,0x8f,0x0f,0x5d,0x74,0x50,0x6f,0x37,0x99,0xbb,0x08,0x6d,0x46,0xb3,0xba,0x4d,0x87,0x00,0x00,
+ 0x05,0x20,0xeb,0x05,0x75,0xe2,0x79,0xbf,0x78,0x21,0xf6,0xde,0x75,0x18,0xe9,0x6c,0x01,0xfe,0x30,0x0d,0xda,0xe0,0xcc,0x60,0x29,0xf2,0x82,0xf6,0x8b,0xa1,0xea,0x72,0xde,0x41,0x00,0x00,
+ 0x05,0x20,0xeb,0x6a,0xb2,0x0d,0xb5,0x92,0x4e,0xff,0xf4,0xbf,0xeb,0xd8,0xbc,0x64,0x14,0x4a,0xb3,0x2a,0xd8,0x4a,0xad,0x65,0x8a,0x02,0xb1,0x92,0xca,0x28,0x77,0x26,0x4e,0xe6,0x00,0x00,
+ 0x05,0x20,0xeb,0xd2,0x00,0x12,0xe8,0x53,0x17,0x83,0xaf,0xa3,0x41,0xf3,0x58,0x07,0x0a,0xa1,0x05,0xea,0x65,0x58,0xa2,0x6b,0x59,0x74,0x29,0x72,0x3c,0x79,0xac,0x3b,0x75,0xf3,0x00,0x00,
+ 0x05,0x20,0xeb,0xe9,0x5a,0xab,0x15,0xf4,0x23,0xa5,0x02,0x01,0xd0,0x2a,0x18,0x5f,0x27,0x1e,0x11,0x0a,0x1d,0x5a,0xff,0xbe,0xe6,0x1d,0xc0,0xd4,0xbb,0xa3,0x09,0xa5,0x15,0xf9,0x00,0x00,
+ 0x05,0x20,0xec,0x5c,0x93,0x49,0x55,0x12,0x19,0x49,0x10,0x80,0xbb,0xd2,0x87,0x1d,0x81,0xf0,0x7b,0x1e,0xd6,0x5e,0xaf,0x8e,0x72,0x03,0x1b,0x51,0x19,0x10,0x42,0xac,0x37,0x91,0x00,0x00,
+ 0x05,0x20,0xed,0x1b,0x4a,0x0e,0x2d,0xbc,0x14,0x33,0x42,0x51,0x28,0x64,0xcb,0xed,0x1e,0x45,0xad,0x33,0xa2,0xad,0x34,0xca,0xcf,0xc8,0x63,0x7c,0xd2,0x8c,0xbe,0x17,0x79,0xc3,0x00,0x00,
+ 0x05,0x20,0xed,0xe5,0x4a,0x22,0x85,0x0b,0x1c,0xd1,0x0e,0xb6,0x57,0x7b,0x11,0xf2,0x12,0xd7,0x1c,0x46,0x3a,0x93,0x38,0x22,0x7e,0x9d,0xbe,0xd6,0x3e,0xf6,0xfa,0x39,0x57,0x88,0x00,0x00,
+ 0x05,0x20,0xf6,0xa5,0x1b,0x6b,0x65,0xe4,0x63,0x7c,0xcb,0x7a,0xee,0xcd,0xf6,0x07,0x4b,0x0b,0x9f,0xb7,0x95,0xf2,0xa7,0x7c,0x6e,0xa1,0x0f,0x9c,0x40,0xed,0xc1,0xc0,0x90,0xf8,0x00,0x00,
+ 0x05,0x20,0xf0,0xd5,0x53,0xac,0xf6,0x72,0x2c,0xf1,0xa5,0xe4,0x0d,0x08,0xcb,0xc3,0xde,0x93,0x8f,0xe7,0x4b,0xd7,0x06,0xa5,0x0e,0x68,0x76,0x39,0x42,0xfd,0x8f,0x92,0x1e,0x4c,0x00,0x00,
+ 0x05,0x20,0xf1,0x36,0x14,0x1b,0x0f,0x04,0xd9,0x51,0x52,0x65,0x6c,0xd6,0xe6,0x9e,0x27,0x79,0x45,0xdc,0x70,0xe1,0x5f,0x05,0x80,0x04,0xc9,0xae,0xad,0x3f,0x14,0xf6,0x4d,0xf7,0x00,0x00,
+ 0x05,0x20,0xf1,0xe0,0xe1,0xe1,0xb5,0xa9,0x41,0xbc,0x15,0x71,0x15,0x58,0xf6,0xa3,0x0d,0xed,0x76,0x81,0xcd,0x42,0x9d,0xfe,0x64,0x24,0x6b,0xaf,0x6c,0x31,0xef,0xf7,0x6c,0x38,0x00,0x00,
+ 0x05,0x20,0xf2,0x4f,0xcb,0x8e,0x12,0xdf,0x56,0xa3,0xc1,0xb8,0x6d,0xc5,0x3c,0x1e,0x08,0x50,0x9b,0x87,0xae,0xb2,0xe2,0x69,0x53,0x05,0x33,0xe6,0x46,0xbc,0xc6,0x7c,0xa3,0xcf,0x00,0x00,
+ 0x05,0x20,0xf3,0x0e,0xb5,0x13,0x8e,0x6b,0xc7,0x01,0x15,0x40,0x27,0xb0,0x8d,0x6d,0x84,0x2b,0x67,0xae,0x5c,0xd5,0x43,0xc2,0xed,0x71,0x50,0x5d,0x33,0xac,0x5f,0xc5,0x15,0x1d,0x00,0x00,
+ 0x05,0x20,0xf3,0x22,0xe3,0x03,0xff,0x21,0x8b,0xa2,0xe6,0x5f,0xc7,0x3c,0x7a,0x1e,0xf6,0x24,0x9e,0xfb,0xdf,0xca,0xfe,0x92,0x2f,0x9f,0x42,0xcb,0x61,0xa2,0xb0,0x40,0x22,0xe5,0x00,0x00,
+ 0x05,0x20,0xf3,0x4e,0x57,0xa4,0xdd,0xe1,0x87,0x6c,0xe9,0x2b,0x7e,0xe1,0x99,0xf9,0x83,0xaa,0x95,0xd2,0xbf,0xe9,0x8f,0x02,0x2d,0xf5,0xe7,0xda,0xbb,0x0f,0x8d,0xbe,0x13,0x4b,0x00,0x00,
+ 0x05,0x20,0xf3,0x4e,0x60,0x0b,0xd6,0x7b,0x04,0x73,0x89,0x8e,0xc6,0xfd,0x87,0x80,0x94,0xf5,0x02,0x2f,0x96,0x1c,0x95,0x11,0xe7,0x9d,0x0d,0xe6,0x5e,0x05,0x27,0x6c,0x60,0x6e,0x00,0x00,
+ 0x05,0x20,0xf3,0x6e,0xe0,0x31,0x29,0x92,0x8a,0x59,0x96,0x8b,0x8d,0xe5,0x2e,0xb2,0xae,0x0f,0x7d,0x8a,0x20,0xbc,0x2d,0xce,0x8b,0xfa,0xf2,0xb6,0xba,0x83,0x53,0x87,0xf9,0x08,0x00,0x00,
+ 0x05,0x20,0xf4,0x43,0xc6,0xb5,0xab,0x00,0x26,0x99,0x3c,0x8e,0x85,0xfb,0xb3,0x23,0xef,0xd6,0x38,0x50,0x1a,0xd3,0xa0,0x8e,0xbd,0x33,0x4b,0xde,0x8e,0x72,0x45,0x26,0x50,0x30,0x00,0x00,
+ 0x05,0x20,0xf5,0x6b,0x74,0x22,0x0c,0x78,0x80,0x0c,0xe4,0xb7,0xe9,0xf5,0xb0,0x78,0xef,0x79,0xa6,0xc9,0x03,0xfd,0x36,0xdc,0x44,0x21,0x7d,0x2f,0x4f,0x8a,0x99,0xa4,0x86,0x8e,0x00,0x00,
+ 0x05,0x20,0xf5,0x6e,0x0b,0x70,0x63,0xa6,0x36,0x72,0xb8,0xa5,0xe0,0x27,0x02,0xaa,0x7c,0x18,0xb7,0x81,0xff,0x76,0x43,0x16,0x32,0x11,0x8f,0x2c,0x4b,0x13,0xfa,0x18,0x28,0xee,0x00,0x00,
+ 0x05,0x20,0xf5,0xa7,0x22,0x0d,0xcd,0x98,0x3b,0x87,0x24,0x38,0xff,0xc1,0x32,0x41,0x5a,0x73,0xc1,0x95,0x0e,0x99,0xf8,0x69,0x1f,0xad,0xce,0xf8,0xe5,0xb8,0xea,0x9e,0xbd,0x41,0x00,0x00,
+ 0x05,0x20,0xf5,0xae,0x46,0xae,0xb3,0x4e,0x78,0x4f,0xf0,0x4f,0xe8,0xc5,0x8f,0x12,0xda,0x95,0x93,0xc5,0x98,0x56,0xe5,0xa1,0x3e,0x7a,0xe1,0x26,0x32,0x43,0x58,0xb2,0xd1,0x01,0x00,0x00,
+ 0x05,0x20,0xf6,0x04,0x38,0xc5,0x3c,0x91,0xe7,0x57,0xf7,0x1d,0x77,0x5a,0x03,0x5e,0x67,0xf1,0x3f,0xd6,0xc5,0x6f,0x69,0x89,0x2b,0x3e,0x77,0x5e,0x41,0x70,0x43,0xb3,0x9c,0x12,0x00,0x00,
+ 0x05,0x20,0xff,0x9c,0x14,0x9c,0x71,0xb7,0xa5,0x65,0x2e,0xb9,0xf6,0x83,0x8e,0xd4,0xa3,0x58,0xe8,0x61,0xb1,0x39,0xfc,0x50,0x50,0xa8,0x34,0x01,0x3f,0xa9,0x08,0x23,0x72,0x7d,0x00,0x00,
+ 0x05,0x20,0xff,0xfd,0xfc,0x62,0xd7,0x6e,0xb4,0xe6,0xf2,0xb3,0xf1,0x17,0x6f,0x79,0xcd,0x19,0xc4,0x25,0x7d,0x70,0x10,0x06,0xfd,0xf0,0x3a,0xd3,0x28,0x52,0x09,0x3a,0xb6,0x18,0x00,0x00,
+ 0x05,0x20,0xff,0xc6,0x05,0xc8,0xd1,0xe5,0x42,0x95,0x0d,0xbb,0x2c,0x4e,0x85,0x2e,0xa4,0x35,0x03,0xe0,0x04,0xcb,0x90,0x81,0x08,0x81,0x14,0x85,0x9b,0xbd,0x8b,0x75,0x9d,0xbe,0x00,0x00,
+ 0x05,0x20,0xf8,0x84,0x13,0xdc,0x9b,0x72,0x41,0x2e,0x91,0x5e,0x34,0xf1,0x03,0x7b,0x8c,0x80,0x86,0x28,0x2a,0x39,0x27,0x36,0xda,0x58,0x6b,0x71,0x48,0x7e,0xcf,0x65,0x88,0xdd,0x00,0x00,
+ 0x05,0x20,0xf8,0xf6,0xc2,0xd5,0x89,0x0e,0x2b,0x79,0x81,0x06,0x9e,0x75,0xdb,0x7e,0x21,0x68,0x61,0x2c,0xd2,0x62,0x35,0x5c,0x04,0x70,0xcb,0x3e,0xf3,0x4a,0xef,0x86,0x5b,0xee,0x00,0x00,
+ 0x05,0x20,0xf8,0xe0,0x92,0x68,0x43,0xa3,0x15,0xdc,0x10,0xbb,0xe7,0xad,0x2f,0xdb,0xb3,0xf6,0xc4,0xcd,0xa5,0x28,0x40,0x77,0x96,0x4c,0x77,0xba,0x9a,0x08,0x57,0xa0,0xbc,0xa8,0x00,0x00,
+ 0x05,0x20,0xf9,0x3d,0x7c,0xf5,0xe5,0x6d,0xa4,0xd9,0x73,0x62,0xba,0x3f,0x0c,0x1b,0x00,0x96,0x2a,0xb2,0xc5,0x5f,0x32,0x49,0x05,0xb3,0xc0,0x92,0xfc,0xf0,0xb7,0x97,0x2e,0xd5,0x00,0x00,
+ 0x05,0x20,0xf9,0x26,0xfc,0x6f,0x75,0xaf,0x17,0x9f,0x59,0x8c,0x6f,0x1d,0xb7,0x7c,0xf4,0x09,0x8d,0x24,0x1a,0xed,0x58,0x36,0x47,0x0b,0x98,0x60,0xb1,0xe1,0x91,0xc2,0x9d,0x8f,0x00,0x00,
+ 0x05,0x20,0xf9,0x46,0x37,0xd1,0xac,0x9e,0x3e,0x48,0xd0,0xf4,0x64,0x34,0x88,0x03,0x58,0xb7,0x44,0xa1,0x37,0xd7,0x7c,0xad,0xaf,0x3d,0x3e,0x14,0x9a,0x76,0xcf,0x1b,0x48,0xa0,0x00,0x00,
+ 0x05,0x20,0xf9,0x61,0xe8,0x1d,0x77,0x55,0xc5,0xac,0x86,0x72,0x3a,0xce,0x42,0xec,0xb5,0xf4,0x9c,0x38,0x22,0x5c,0x90,0x38,0xe4,0x97,0xa4,0x3a,0x16,0x77,0x78,0x7b,0x55,0x5b,0x00,0x00,
+ 0x05,0x20,0xf9,0xbc,0xd0,0x0c,0xd2,0xa8,0xd5,0xe3,0x91,0x63,0x1d,0x3e,0xd1,0x64,0xe7,0x93,0xea,0x1e,0xf2,0xc6,0x75,0x4f,0x70,0xec,0x69,0x53,0xc7,0xca,0x86,0x6a,0xc0,0xe7,0x00,0x00,
+ 0x05,0x20,0xf9,0xdf,0x58,0x87,0xe2,0x5a,0x15,0xee,0xe9,0xa5,0xdc,0xbd,0x63,0xad,0x57,0xe3,0xd3,0x77,0x5a,0x6f,0x40,0xd7,0x9d,0x7f,0x74,0xcb,0x75,0x29,0xf4,0x38,0x66,0x5e,0x00,0x00,
+ 0x05,0x20,0xfa,0x10,0x81,0x69,0x0a,0x8d,0x98,0x23,0xc9,0xab,0xad,0xbc,0x96,0xff,0xb5,0x7d,0x67,0x4a,0x1a,0xff,0x64,0x08,0x10,0xaf,0xd8,0x6a,0xf9,0x84,0x4f,0xe0,0xf2,0x57,0x00,0x00,
+ 0x05,0x20,0xfa,0x6d,0x5b,0xfc,0x86,0x20,0xf7,0xc1,0x4e,0x26,0xc4,0x67,0xdc,0x7a,0xfd,0x7f,0xef,0x95,0x15,0xe8,0x1d,0x6d,0x1b,0xa5,0xeb,0x86,0x2d,0x00,0x74,0x70,0x59,0xb6,0x00,0x00,
+ 0x05,0x20,0xfa,0xfc,0xbe,0x7d,0x7f,0x7d,0x91,0xfa,0x94,0x9f,0x8b,0x98,0xb5,0x3d,0xae,0x85,0x3f,0xe1,0xc7,0x86,0x79,0xe2,0x36,0x20,0x5c,0x9e,0x46,0xa3,0x21,0x05,0x36,0x7b,0x00,0x00,
+ 0x05,0x20,0xfb,0xad,0x4b,0xf4,0x1b,0xdf,0x60,0x6c,0x77,0xf9,0xfa,0xc9,0x56,0xfc,0x85,0x77,0x5e,0xdc,0xd5,0x75,0x60,0x4f,0x3e,0x7a,0x80,0xf8,0xac,0x8e,0xa6,0x1e,0x89,0xec,0x00,0x00,
+ 0x05,0x20,0xfc,0x34,0xfd,0xce,0xb8,0xe1,0x6d,0xbd,0xf5,0xed,0x63,0xc5,0x85,0x0e,0x89,0x6a,0x8d,0xaf,0xed,0x87,0x80,0xb8,0xea,0x69,0x14,0x6c,0x24,0x80,0x77,0x41,0x32,0x5c,0x00,0x00,
+ 0x05,0x20,0xfc,0x25,0x6f,0x00,0x55,0xff,0xb4,0xe2,0xe1,0xac,0x97,0x73,0xa2,0x6f,0xbc,0x9d,0x5f,0xa5,0x73,0xba,0xfa,0xfc,0x82,0xba,0x3f,0xb6,0xe8,0xa5,0xe4,0x08,0x98,0xf7,0x00,0x00,
+ 0x05,0x20,0xfc,0x78,0x60,0x5d,0x41,0xd2,0x2c,0xd1,0x80,0xa8,0x96,0x86,0x2c,0x80,0x5b,0x06,0x98,0x59,0x4a,0xe4,0x51,0x2e,0x5a,0x97,0xbb,0x7f,0xe4,0x84,0x66,0x86,0x36,0xac,0x00,0x00,
+ 0x05,0x20,0xfc,0x79,0x14,0x77,0x6b,0x0e,0x34,0x8d,0xde,0x01,0x33,0xed,0xb4,0x0e,0xa7,0xc9,0x15,0x4f,0xd0,0x27,0x2c,0xd6,0x5f,0xe9,0x63,0x82,0x8d,0xd5,0x0c,0x9e,0x18,0x29,0x00,0x00,
+ 0x05,0x20,0xfc,0x43,0x09,0xcf,0x99,0x05,0x09,0x60,0xb9,0xa1,0x15,0x40,0x84,0x30,0xab,0xad,0xd2,0xa4,0x3c,0x3d,0x9f,0xcd,0x49,0x61,0xff,0x61,0x47,0x05,0x91,0xed,0x50,0x47,0x00,0x00,
+ 0x05,0x20,0xfc,0xe3,0x81,0xe6,0xe0,0xbf,0xdc,0x7d,0xf1,0xfb,0x9b,0xa7,0x74,0x13,0xbf,0x56,0xee,0x88,0x54,0x23,0x16,0xc3,0xa3,0x05,0xe9,0xa0,0xc1,0xf7,0x60,0x90,0x77,0x50,0x00,0x00,
+ 0x05,0x20,0xfc,0xe6,0x95,0xac,0xee,0x23,0x2a,0x24,0xd8,0xdc,0x86,0x4d,0x11,0x46,0x1a,0xa6,0x36,0x2e,0x6e,0x8d,0x33,0x46,0xe6,0x07,0x84,0x01,0xc5,0x24,0xe3,0x5d,0x25,0x31,0x00,0x00,
+ 0x05,0x20,0xfd,0x26,0x2f,0x66,0x79,0x80,0x16,0x99,0xa2,0x20,0x09,0x76,0xbe,0xe1,0xb5,0x2e,0xc0,0xa6,0x65,0xc5,0x06,0x10,0x3e,0x08,0x08,0x07,0x9a,0x3f,0x67,0xc0,0xd1,0x03,0x00,0x00,
+ 0x05,0x20,0xfd,0x8d,0x1c,0x58,0xf2,0x50,0xf5,0xc5,0x42,0x09,0xab,0x87,0x7f,0x06,0xed,0x4b,0x6b,0xbf,0xf2,0xeb,0x6c,0x6d,0x29,0x63,0xf9,0x80,0xf9,0x6c,0x83,0xa3,0x8c,0x19,0x00,0x00,
+ 0x05,0x20,0xfd,0x9f,0xc8,0xc4,0xa5,0xd9,0x43,0x1a,0x0e,0x29,0xed,0x33,0x2a,0xc3,0x97,0x71,0x55,0x34,0xf6,0x69,0xfb,0x98,0xd7,0x8a,0x16,0xe3,0x3f,0x11,0x26,0x47,0x96,0xf2,0x00,0x00,
+ 0x05,0x20,0x06,0xb2,0x87,0x38,0x58,0xe6,0x76,0x94,0x25,0xbe,0x86,0x57,0xa3,0x45,0x05,0x80,0xfe,0x7a,0xd1,0x5e,0x50,0x0c,0x9a,0xf5,0x80,0x74,0x22,0xdb,0xd9,0xd4,0x10,0xdd,0x00,0x00,
+ 0x05,0x20,0x07,0x7f,0x41,0x73,0xa2,0x89,0xb1,0x39,0x96,0x5e,0x42,0x76,0x58,0xf3,0x90,0xe5,0xba,0x84,0xfb,0x18,0xf1,0x58,0x70,0xab,0x1b,0xff,0x01,0x4f,0xc6,0x70,0xe4,0xb4,0x00,0x00,
+ 0x05,0x20,0x00,0x6e,0xc6,0x41,0x43,0xa3,0x51,0xfd,0xa9,0x1e,0x00,0x33,0x85,0xf7,0x3b,0x0f,0x88,0x13,0xfb,0x62,0x2c,0x89,0xcd,0xe5,0xda,0x29,0xaa,0xf8,0x3b,0xfd,0x5f,0xe3,0x00,0x00,
+ 0x05,0x20,0x00,0xd8,0x53,0x8f,0x43,0xd9,0xa9,0xba,0x92,0xa0,0x8a,0x47,0xe9,0x86,0x78,0xfc,0x61,0xf2,0x86,0x91,0x3a,0x93,0xfe,0x5f,0xb4,0x01,0x85,0xc7,0x1a,0x95,0x64,0xf3,0x00,0x00,
+ 0x05,0x20,0x01,0xdd,0xa8,0xa5,0xcf,0x48,0xc8,0x7d,0xec,0xa8,0xf7,0xde,0x15,0x6f,0x0b,0x89,0x7e,0x6c,0x36,0xb7,0xcb,0x2d,0xe6,0x3e,0x96,0xa1,0x45,0x0c,0x67,0x17,0x36,0x42,0x00,0x00,
+ 0x05,0x20,0x02,0x5c,0xbf,0xf0,0x5c,0xf2,0x0c,0x01,0xac,0x99,0x23,0x46,0x7a,0xda,0x7d,0xf1,0x84,0xc8,0x8c,0x40,0x3d,0x38,0x91,0x80,0x33,0xfb,0xbc,0xde,0x55,0xba,0xbd,0x7d,0x00,0x00,
+ 0x05,0x20,0x03,0x9c,0xfe,0xb7,0x8a,0x3c,0x02,0xe0,0xf8,0xb5,0x16,0x9b,0x7c,0x61,0xcb,0x21,0x1a,0x42,0xc7,0x0a,0xa0,0xe7,0x10,0xcd,0x32,0x3e,0xc0,0x29,0x41,0x29,0x50,0xe0,0x00,0x00,
+ 0x05,0x20,0x03,0x9e,0xd8,0x8c,0xbc,0xef,0x01,0xcf,0x56,0x0d,0xa9,0x85,0x7f,0x99,0x5b,0x57,0x68,0x0e,0x9a,0xac,0x3c,0xdd,0x58,0x38,0x6d,0x81,0xb2,0x21,0x7b,0xa7,0x2f,0xce,0x00,0x00,
+ 0x05,0x20,0x03,0xa2,0x14,0x41,0x78,0x2e,0xcd,0x6a,0x2a,0x68,0xfd,0xb4,0x27,0x93,0x6c,0x93,0xf4,0x05,0x78,0x7c,0x81,0x17,0x80,0x6a,0x8c,0x3b,0xcf,0xa3,0x14,0x1c,0x1f,0x76,0x00,0x00,
+ 0x05,0x20,0x04,0x13,0xa1,0xf6,0xd8,0x50,0x4f,0x48,0x93,0xb8,0x28,0x28,0x32,0x10,0x6e,0x65,0x8e,0xee,0x18,0x39,0xd2,0xcd,0xb5,0x9c,0x2c,0x1f,0x9c,0x33,0xe3,0x9f,0x20,0xe6,0x00,0x00,
+ 0x05,0x20,0x04,0x27,0x06,0x27,0x2c,0xf4,0xeb,0x17,0x0e,0xac,0x6a,0x12,0x5b,0x09,0xbf,0x35,0x2c,0xc3,0x48,0xe1,0xf6,0x04,0x22,0xad,0x4f,0x2a,0x3e,0xd0,0x08,0xab,0xe9,0x60,0x00,0x00,
+ 0x05,0x20,0x04,0x91,0x20,0xe1,0x68,0x81,0x9e,0xdc,0x72,0x72,0x30,0xdd,0x5f,0x4e,0xac,0x5d,0x09,0x9c,0xfe,0xb4,0x55,0x27,0xcc,0x41,0x4f,0x33,0xee,0xa8,0xaf,0xa3,0x07,0xd2,0x00,0x00,
+ 0x05,0x20,0x05,0x04,0x43,0xf6,0x14,0x9f,0x4e,0x25,0x70,0xd9,0x59,0xf5,0x74,0xce,0xdd,0x83,0x86,0x64,0x36,0x08,0xb9,0x2d,0xc7,0x4c,0x90,0x76,0x51,0x69,0x9b,0x8e,0x17,0x38,0x00,0x00,
+ 0x05,0x20,0x05,0x09,0xd5,0x8d,0xd5,0xb7,0x32,0x1d,0x01,0x1b,0x6c,0x92,0x82,0x48,0x67,0x49,0xc6,0xd3,0x18,0x1a,0x4b,0x8a,0xf9,0xbe,0x60,0x76,0xcc,0x34,0x51,0x22,0x80,0xcb,0x00,0x00,
+ 0x05,0x20,0x05,0xac,0x7c,0x5e,0xf7,0x97,0xd4,0xa0,0xe9,0xf5,0x34,0x7b,0xed,0x8b,0x8d,0xe3,0x01,0x98,0xa2,0xb1,0x63,0x8b,0x6f,0xc4,0x77,0xd6,0x47,0x4d,0xf1,0x76,0xcc,0xac,0x00,0x00,
+ 0x05,0x20,0x06,0x38,0x23,0x93,0x67,0x08,0xf4,0xff,0x30,0x1d,0x81,0x1d,0xe5,0x07,0xa6,0x3a,0x1b,0xc1,0xcf,0x4d,0x3f,0x03,0x27,0xbc,0x44,0x55,0x53,0x68,0x14,0x4a,0x6f,0xf0,0x00,0x00,
+ 0x05,0x20,0x06,0x1b,0xf8,0xed,0x23,0x42,0x4e,0x25,0xfa,0x7e,0x31,0x2e,0xc8,0x73,0xa3,0xb6,0xa6,0x07,0xe9,0x7e,0xfc,0x5b,0xfb,0x99,0xc8,0x90,0x08,0xd5,0x11,0x7f,0xe5,0x8e,0x00,0x00,
+ 0x05,0x20,0x06,0x4b,0x30,0x2e,0x0e,0xb6,0x65,0x17,0x0c,0xc8,0x57,0x2e,0x2d,0x9d,0x25,0x32,0xca,0x5e,0x9a,0x17,0xc8,0xba,0xc4,0x0c,0xd5,0xb1,0x31,0x5e,0x3e,0x34,0xc2,0xb6,0x00,0x00,
+ 0x05,0x20,0x0f,0xbd,0x2d,0x45,0xf3,0xf7,0xc6,0x56,0x1e,0xcb,0x90,0x4e,0xa4,0x3d,0xbe,0xcb,0x54,0x2d,0x7c,0x65,0x99,0xfa,0x9d,0xf4,0xbb,0x8e,0x9f,0x2d,0xb4,0x9e,0xe8,0x2d,0x00,0x00,
+ 0x05,0x20,0x08,0x25,0x81,0x5e,0x4b,0xb0,0x17,0xf2,0xcc,0x9b,0xf1,0x25,0x21,0x72,0x2f,0xf4,0x9c,0xa9,0x60,0x9f,0x22,0xd0,0x8f,0x12,0x2f,0x98,0x74,0xb2,0xc5,0xa3,0xd6,0x25,0x00,0x00,
+ 0x05,0x20,0x08,0x56,0xf6,0x2f,0xd8,0x47,0xa4,0x5c,0xb9,0xf8,0xd1,0x63,0xae,0xae,0x53,0x24,0xbe,0x5d,0xf1,0x68,0x33,0x55,0x6a,0x13,0x60,0xa3,0x7a,0xa6,0x79,0x14,0x0d,0xb9,0x00,0x00,
+ 0x05,0x20,0x09,0x5e,0x43,0x76,0x0f,0x50,0x49,0x1e,0x0f,0x3d,0x5c,0xe6,0x30,0xe2,0x6e,0xff,0x9b,0x23,0x15,0xae,0xda,0x88,0xec,0xd8,0xcc,0xf4,0xdd,0x90,0x65,0x53,0x04,0x5d,0x00,0x00,
+ 0x05,0x20,0x09,0xfb,0xc4,0x8c,0xa5,0x37,0xb3,0x2d,0x9f,0xa2,0xc1,0x21,0x24,0xfb,0x59,0x3a,0x3b,0x33,0xdd,0xf0,0x6e,0x6b,0xaa,0xc4,0xf2,0x58,0xe3,0xc9,0x04,0x4a,0x91,0xdc,0x00,0x00,
+ 0x05,0x20,0x0a,0x1a,0xd9,0xea,0xc1,0x2a,0xcf,0x8b,0x6b,0x02,0x9b,0xe8,0x3c,0xeb,0xe3,0x3b,0x6e,0x73,0x79,0x8e,0xb3,0x03,0x4b,0xdf,0x53,0x09,0xf8,0x10,0xbe,0x01,0xce,0x6c,0x00,0x00,
+ 0x05,0x20,0x0a,0x53,0x94,0xf5,0x2d,0xf1,0x03,0xb9,0x4a,0x36,0xfe,0xdf,0xdd,0x0c,0x5f,0xc3,0xe3,0xca,0xb2,0xa2,0x2f,0x30,0x4c,0xb2,0xce,0x4d,0x98,0xa4,0x45,0x7f,0xd2,0x71,0x00,0x00,
+ 0x05,0x20,0x0b,0x23,0x87,0xad,0x9d,0x46,0x11,0x14,0xd5,0xe6,0x82,0xbe,0x82,0x9d,0x87,0x0b,0xcc,0x9b,0x6e,0x08,0x2b,0x56,0xf8,0xc1,0x95,0x41,0xe6,0x86,0x37,0x48,0x75,0x4f,0x00,0x00,
+ 0x05,0x20,0x0b,0xbd,0x01,0x2f,0xc2,0x71,0x65,0xb1,0x47,0xc8,0x58,0x6e,0x4a,0x49,0x51,0x71,0x46,0x9d,0x2a,0x41,0x3d,0x0d,0x37,0x0a,0x24,0x08,0x1e,0x58,0xed,0x61,0x84,0xb6,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,0x0c,0x9b,0xd8,0xae,0x9c,0x3e,0xc1,0xcb,0xbd,0x4b,0x39,0xf0,0xcb,0xba,0x2e,0x35,0xde,0x33,0x50,0x72,0x9a,0xdc,0x25,0xe6,0x47,0x31,0xc3,0xc1,0x91,0x14,0x46,0xe3,0x00,0x00,
+ 0x05,0x20,0x0c,0xc7,0x52,0xda,0xec,0x89,0x9b,0x05,0x1c,0xfb,0x8b,0xe4,0x27,0xfe,0x59,0x4f,0xb1,0x80,0xb3,0xd6,0xfd,0x8f,0x70,0x7b,0xfe,0x8c,0xae,0x80,0x71,0x93,0x07,0xe6,0x00,0x00,
+ 0x05,0x20,0x0d,0x12,0x27,0x98,0x6f,0xf8,0xb7,0xdb,0xde,0x03,0x62,0xf1,0xc1,0xe2,0xf8,0xb0,0x1d,0x5b,0x95,0xc8,0x2f,0xc5,0xdd,0x27,0x7a,0x8d,0x45,0x2d,0xec,0xc4,0x29,0x31,0x00,0x00,
+ 0x05,0x20,0x0d,0x8d,0xe6,0x70,0x06,0xbd,0x34,0x54,0x57,0x63,0x57,0x71,0x2e,0x6b,0x81,0xd7,0xec,0x9c,0x84,0xfa,0xe0,0xf6,0x4b,0x4e,0x41,0xe1,0x07,0xd0,0x2c,0x2c,0x57,0x5e,0x00,0x00,
+ 0x05,0x20,0x0e,0x1d,0x41,0x12,0x28,0x1f,0x62,0x1d,0x0c,0x74,0x10,0x21,0x62,0x3c,0x18,0x9d,0x55,0x6e,0x07,0x8b,0xd5,0x98,0x12,0xa8,0x25,0x32,0x04,0x55,0x94,0x43,0xe0,0xe6,0x00,0x00,
+ 0x05,0x20,0x16,0xec,0xa2,0x72,0x87,0xf5,0x82,0x67,0xdb,0x2e,0xd6,0x65,0xb5,0xee,0x25,0x94,0x74,0x80,0xc8,0xb7,0x24,0x5a,0xb3,0xdc,0xd8,0x8d,0xe4,0x4a,0x19,0x71,0x1f,0x72,0x00,0x00,
+ 0x05,0x20,0x16,0xf2,0x13,0x4f,0x7a,0x77,0x0a,0xe4,0x03,0xf6,0x1d,0xcc,0x2d,0xbb,0x9a,0x65,0x26,0xc2,0x18,0xe7,0x26,0xfc,0x65,0xb1,0x8d,0xc6,0x65,0xae,0xf8,0xdf,0xfa,0xef,0x00,0x00,
+ 0x05,0x20,0x17,0x4a,0xaf,0x5d,0x36,0x09,0x47,0x48,0x91,0xe8,0x3a,0x86,0x9a,0xad,0x06,0x25,0xd7,0x9b,0x53,0xdc,0xc9,0xf4,0x4e,0xc9,0x23,0xeb,0xd8,0x7a,0xd7,0x7c,0x53,0x01,0x00,0x00,
+ 0x05,0x20,0x17,0x85,0xe1,0x78,0x64,0x92,0xa9,0x3d,0xec,0x9e,0xcb,0x1d,0x8b,0xd8,0xf3,0x07,0x80,0x01,0xcd,0x20,0x9c,0xc2,0x89,0x71,0xf0,0x25,0xb4,0x63,0xb6,0xbc,0x33,0xcc,0x00,0x00,
+ 0x05,0x20,0x17,0xa4,0x30,0xe4,0x4a,0x75,0x42,0xbf,0x9c,0x7d,0x0c,0x3a,0xf2,0xa9,0x56,0x16,0xaf,0x31,0xaa,0xff,0x0e,0xfb,0xf0,0xab,0x75,0xe5,0x47,0x27,0xe5,0x98,0xdf,0x05,0x00,0x00,
+ 0x05,0x20,0x10,0x22,0x6f,0xfb,0xaf,0x57,0x48,0x5d,0x76,0xa7,0xab,0xe9,0xf7,0x9e,0x92,0xff,0x70,0xfd,0x5d,0x96,0x2f,0x13,0x47,0x9e,0x8b,0x92,0xa5,0x08,0x9d,0xdd,0x54,0x64,0x00,0x00,
+ 0x05,0x20,0x10,0x5a,0x57,0xc4,0x1e,0x8b,0x95,0xda,0xfb,0x3c,0x14,0x50,0x58,0x52,0x77,0xfa,0x2d,0x66,0xda,0xc1,0x58,0xb3,0x9e,0xcc,0xac,0x87,0x16,0xa5,0x0d,0x3e,0x97,0x4c,0x00,0x00,
+ 0x05,0x20,0x10,0xec,0xff,0xbe,0xe2,0x82,0x24,0xe2,0x4f,0x8a,0x58,0x11,0xc9,0xcc,0x8c,0x24,0x92,0xea,0xd1,0x9f,0xcc,0x04,0xfd,0x2c,0x22,0xc3,0x6c,0x47,0x2f,0x6a,0x81,0x5a,0x00,0x00,
+ 0x05,0x20,0x12,0x2d,0x54,0x32,0x72,0xfe,0x72,0xec,0x45,0x4d,0x3a,0xdd,0x66,0x64,0xfb,0xeb,0x33,0x7e,0x09,0x74,0x87,0xe9,0x81,0x5b,0x65,0x28,0x84,0xaa,0x3a,0xbc,0x9a,0x53,0x00,0x00,
+ 0x05,0x20,0x13,0x0a,0x6b,0xd1,0x72,0x99,0xbb,0x38,0xb5,0x8c,0x94,0x93,0x51,0xc6,0x1d,0x27,0xe6,0x08,0x16,0x60,0xf2,0x5f,0x44,0x43,0x20,0x54,0x28,0x91,0x8c,0xeb,0x4c,0xb8,0x00,0x00,
+ 0x05,0x20,0x14,0x06,0x52,0xae,0x46,0x68,0xa4,0xbd,0xe1,0xed,0xb0,0xc5,0xe1,0x8e,0xc3,0x71,0x2b,0xfc,0x88,0x69,0x91,0x06,0x37,0xaf,0x2f,0xd6,0x27,0x73,0xb3,0xb6,0x51,0x50,0x00,0x00,
+ 0x05,0x20,0x14,0x90,0x45,0xb0,0x89,0x15,0x9a,0xe4,0xf8,0x69,0x9f,0xdc,0xee,0xbb,0x80,0x64,0x5f,0xe7,0xdd,0xf9,0xa9,0x4c,0xf3,0x84,0xb8,0x91,0x7e,0xbb,0x0f,0xfb,0x41,0xb8,0x00,0x00,
+ 0x05,0x20,0x15,0xcb,0x74,0xf3,0x56,0x0b,0xaf,0x35,0x59,0x49,0xa0,0x15,0x12,0x13,0x9d,0xb8,0x8a,0x36,0x4c,0xe4,0x57,0x11,0xf8,0x5e,0x34,0xcf,0x92,0xfc,0x14,0xbe,0x93,0xa9,0x00,0x00,
+ 0x05,0x20,0x16,0x39,0x60,0x30,0xe7,0x4c,0x0d,0xf0,0x30,0x0d,0xb9,0x10,0x56,0xed,0x2c,0x24,0xb4,0x96,0xd0,0x02,0x9d,0x53,0x3b,0xba,0xa1,0x84,0x13,0xeb,0xfb,0x35,0x24,0x02,0x00,0x00,
+ 0x05,0x20,0x16,0x41,0x1b,0xa8,0x8c,0x2b,0x4f,0xd6,0xbe,0x1b,0x4d,0x4c,0x40,0x03,0x06,0xce,0x9f,0xb1,0xb5,0x8d,0x99,0xa9,0xb6,0xa7,0x3e,0xe1,0x1d,0xd2,0xe6,0x95,0xd4,0x42,0x00,0x00,
+ 0x05,0x20,0x16,0x63,0xeb,0xc7,0x41,0xf3,0x2e,0x65,0x61,0x9e,0x2a,0x40,0x12,0x19,0x39,0x30,0x91,0x78,0x70,0x09,0x11,0x89,0x7b,0xdb,0x4c,0x3c,0xa9,0x4d,0xd2,0xa7,0x3d,0xcc,0x00,0x00,
+ 0x05,0x20,0x1f,0x08,0xff,0xf7,0x83,0x1c,0x25,0xcb,0xdc,0x67,0x51,0xaf,0x99,0x4b,0x80,0xfb,0x02,0x50,0x6b,0x64,0x05,0x58,0xc6,0x98,0xe6,0x4c,0x88,0x56,0xe4,0x4a,0x9f,0xb1,0x00,0x00,
+ 0x05,0x20,0x1f,0x86,0xd2,0xa0,0xa0,0xb2,0xf2,0x59,0xea,0x06,0xae,0x9e,0x60,0xe8,0xff,0x19,0x15,0x7f,0xc7,0x85,0x4b,0xfd,0x57,0x1b,0x7a,0x3c,0x1f,0x14,0x63,0xde,0x7d,0x94,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,0x18,0xe1,0xf3,0xc1,0x17,0x5f,0xf5,0x0b,0xbd,0xf8,0x5c,0x6c,0xd6,0x23,0xbf,0xca,0xcd,0x48,0x44,0x56,0x4d,0x22,0x5f,0x33,0x15,0xb4,0x19,0x30,0xed,0x7a,0x2f,0x12,0x00,0x00,
+ 0x05,0x20,0x18,0xe7,0x40,0x30,0x6e,0xc3,0x64,0x0e,0x47,0xbc,0xdb,0xe4,0x49,0x9e,0x9c,0xc1,0x8b,0x4b,0x54,0x42,0xf9,0x66,0xb0,0xeb,0x80,0x56,0x9b,0xbe,0x99,0xac,0x22,0x8e,0x00,0x00,
+ 0x05,0x20,0x1b,0x08,0x3f,0x11,0x7a,0x3f,0x7c,0x9e,0xa9,0xae,0xfd,0xdc,0x20,0x2d,0x3e,0x57,0xc8,0x77,0x4b,0x11,0xd1,0x43,0x61,0x45,0x5d,0xc1,0x7d,0xa1,0x6c,0x83,0x13,0x87,0x00,0x00,
+ 0x05,0x20,0x1b,0x87,0xe8,0xa4,0x44,0x5b,0x92,0x51,0x27,0x18,0x04,0xa1,0x21,0x18,0x04,0xed,0xab,0x14,0x46,0x9a,0x2d,0x86,0xe3,0x7b,0x6f,0xbd,0x55,0x76,0x51,0xa4,0x95,0x9d,0x00,0x00,
+ 0x05,0x20,0x1b,0xb3,0xa1,0x8e,0x8b,0xc0,0xc7,0x14,0x51,0x9f,0x55,0x54,0x12,0xb2,0x49,0xf7,0x43,0xf1,0xea,0x74,0x6c,0x53,0xe5,0x63,0x27,0xc9,0xa4,0x15,0x03,0xd8,0x5c,0x9b,0x00,0x00,
+ 0x05,0x20,0x1c,0x91,0xef,0xae,0x13,0xdc,0xfd,0x43,0xaa,0x18,0x7c,0xd6,0xd0,0x20,0x3b,0x48,0x37,0x8d,0x3b,0x7a,0xa3,0x2c,0x20,0xae,0x8b,0x96,0x80,0x87,0x64,0xba,0x81,0x75,0x00,0x00,
+ 0x05,0x20,0x1d,0x11,0x5b,0xb6,0x2f,0x2a,0xee,0xfb,0x03,0x4d,0x1f,0x68,0x84,0xb4,0x6b,0x2d,0x1f,0x01,0xbe,0x9e,0x37,0xc5,0xcb,0x35,0x97,0x2a,0xf5,0x46,0x88,0x95,0x93,0x85,0x00,0x00,
+ 0x05,0x20,0x1d,0xbe,0xe7,0x55,0xfc,0xe2,0x9a,0x78,0xa1,0x48,0xa9,0x59,0x3d,0x9e,0x5a,0x5e,0x75,0x38,0xad,0xe1,0xfd,0xdd,0x49,0xf8,0x6b,0x43,0x4a,0xdc,0xdc,0x80,0x16,0xe4,0x00,0x00,
+ 0x05,0x20,0x1e,0x34,0x23,0xf8,0x0c,0xde,0xab,0x87,0x04,0x14,0xba,0x2b,0xca,0x94,0x71,0x42,0x73,0x93,0xe8,0x1b,0xa8,0x28,0xc0,0x01,0x0f,0xd7,0x59,0xb3,0x3a,0x4c,0xbb,0x98,0x00,0x00,
+ 0x05,0x20,0x1e,0x4b,0x05,0x83,0x7f,0x43,0x79,0x77,0x9b,0x6f,0x07,0x01,0x42,0x28,0x5c,0xab,0xd3,0x3f,0x3c,0x1f,0xe6,0x4a,0x3d,0xc4,0xe8,0x25,0xb4,0x9a,0x44,0xa5,0x57,0x81,0x00,0x00,
+ 0x05,0x20,0x1e,0x55,0x2c,0x8d,0x16,0x86,0xeb,0x12,0x4f,0x30,0x44,0xe0,0x00,0x86,0xf1,0x1d,0x77,0xd4,0x4f,0x31,0xd8,0xd6,0x22,0xa6,0x4a,0xb7,0x78,0x4c,0x03,0xc2,0xb0,0xa6,0x00,0x00,
+ 0x05,0x20,0x26,0xa3,0x05,0xd0,0xdb,0x6d,0x89,0x25,0x9f,0x45,0xe1,0x0d,0x0e,0xa6,0x61,0x31,0x5e,0x5b,0xd5,0x36,0x4d,0xe7,0x7a,0x35,0x40,0xd2,0x13,0x2c,0x92,0x98,0x86,0xc8,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,0x27,0xa0,0xec,0x00,0x93,0x4e,0xf2,0x5e,0xa5,0x80,0xab,0x79,0xc0,0x56,0x49,0x1e,0x1b,0x7f,0x38,0x5e,0x5d,0xc6,0x6b,0x96,0x50,0xd0,0x61,0xbc,0xd0,0x9c,0x6e,0x09,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,0x20,0xaf,0x9b,0xcf,0x36,0xc1,0x6d,0x56,0x77,0x18,0x02,0x02,0x2e,0xdb,0x74,0x47,0xbc,0x58,0xa3,0xa0,0xf3,0x3f,0x31,0xc9,0xd0,0x3d,0x1f,0x98,0x41,0xf2,0x65,0xdb,0x00,0x00,
+ 0x05,0x20,0x20,0xdd,0xeb,0x14,0x0e,0x8f,0xdc,0x0f,0x45,0x98,0x06,0x08,0x89,0x40,0x7f,0x51,0x5a,0x1c,0x65,0x6b,0x0e,0x25,0x5c,0xa1,0x27,0x64,0x94,0x6b,0xdc,0x69,0xb7,0xe6,0x00,0x00,
+ 0x05,0x20,0x21,0x53,0xaf,0x75,0x5c,0xab,0x7b,0x3d,0xd6,0x1b,0xad,0x1f,0xfc,0xa9,0x4e,0x07,0xc6,0xb8,0x06,0xcb,0x39,0xf1,0xf7,0xd6,0xe9,0x8c,0x16,0x86,0xed,0xba,0x3d,0x9d,0x00,0x00,
+ 0x05,0x20,0x21,0xb8,0x9f,0x16,0x6d,0xe0,0x54,0xea,0xde,0xeb,0x06,0x4c,0x7a,0x46,0x26,0x6c,0xed,0xa7,0xb3,0x36,0xa9,0x0c,0x56,0x85,0x7b,0x13,0x84,0x30,0x52,0x43,0x05,0x90,0x00,0x00,
+ 0x05,0x20,0x21,0xcc,0x80,0xf3,0x82,0xe1,0x9e,0xfe,0x39,0xcd,0x56,0xa6,0x18,0x9a,0x4d,0x97,0xb8,0x6b,0xe9,0x13,0xa5,0x77,0xcd,0x7b,0x33,0xaf,0xa8,0xd8,0xe2,0xf6,0x59,0xc6,0x00,0x00,
+ 0x05,0x20,0x22,0x61,0xbe,0x59,0xd3,0x44,0xd2,0xaf,0xbb,0xb7,0x65,0xc6,0xbb,0xfb,0x20,0x54,0x6e,0x23,0xda,0xd3,0x57,0x2a,0x63,0x3c,0xaf,0xbd,0xf4,0x00,0xe0,0x02,0x89,0xf5,0x00,0x00,
+ 0x05,0x20,0x22,0x91,0x0a,0x84,0x90,0x80,0x5a,0xbf,0x23,0x05,0xeb,0x4a,0xae,0x29,0x36,0x13,0x21,0xad,0xd8,0xe6,0x63,0xd4,0xfe,0x28,0x16,0x01,0xf0,0x6c,0xe7,0x7d,0x49,0x6c,0x00,0x00,
+ 0x05,0x20,0x23,0x99,0x78,0xb1,0x86,0x28,0xa0,0x28,0xff,0x33,0xf6,0x57,0x3c,0xd3,0x6b,0xd3,0xcc,0x4a,0xfe,0x43,0x61,0x52,0xc9,0x3f,0x4c,0x7f,0x45,0x69,0xef,0x1a,0xb1,0x6e,0x00,0x00,
+ 0x05,0x20,0x24,0x42,0x4c,0x6a,0x52,0xb5,0x9b,0xee,0x1a,0x91,0x1f,0xfd,0x87,0x51,0x35,0x6e,0x88,0x06,0x18,0xa5,0xe9,0xc1,0x28,0xa1,0xcc,0x34,0x3d,0xf7,0x08,0x6c,0xf7,0xcf,0x00,0x00,
+ 0x05,0x20,0x24,0xf1,0xf9,0x89,0x49,0xd1,0x05,0x14,0xa3,0x23,0x11,0x92,0x51,0x65,0x42,0xf5,0x98,0x00,0x8f,0xeb,0xb2,0xec,0xa1,0x69,0x6e,0x22,0xfa,0x9d,0xe3,0x30,0x04,0x01,0x00,0x00,
+ 0x05,0x20,0x25,0x02,0xc0,0xe5,0x5e,0x8c,0xdf,0x4d,0xd2,0x79,0xe0,0xa2,0x3b,0x55,0x9a,0x4e,0x3b,0xee,0x0b,0x16,0xb5,0xa3,0x6f,0x0f,0x3f,0x5e,0x94,0x5c,0xd4,0x08,0xc5,0x0e,0x00,0x00,
+ 0x05,0x20,0x25,0x32,0x0c,0xe6,0x7e,0x33,0x48,0x55,0x73,0x1c,0x0d,0xf9,0xcb,0x08,0xa6,0x65,0x02,0xb0,0xfb,0x92,0xe7,0x36,0x84,0x1f,0xb3,0xd0,0x70,0xf4,0x39,0x69,0xb7,0xa7,0x00,0x00,
+ 0x05,0x20,0x26,0x0b,0xe1,0xbb,0xec,0xd8,0xc8,0x20,0xe5,0xe2,0x8f,0x7c,0x18,0xa8,0x9d,0xbb,0x15,0x7b,0x3c,0x00,0xf3,0x8e,0x4b,0xc2,0xff,0x04,0xe1,0xef,0x88,0x92,0xb5,0x62,0x00,0x00,
+ 0x05,0x20,0x26,0x70,0xf1,0xb4,0xb9,0x79,0xcd,0x8d,0xf0,0x9d,0x55,0x19,0xaa,0xdc,0x5c,0x4a,0xb9,0x42,0x8b,0x75,0xc2,0xff,0x77,0xb6,0x32,0x38,0x50,0x65,0x4c,0xa0,0x3d,0x0c,0x00,0x00,
+ 0x05,0x20,0x28,0x51,0x9e,0x8f,0xb2,0xa3,0x9f,0xb7,0x10,0x48,0x98,0x7a,0x6b,0xe2,0x68,0x31,0x9c,0x64,0x54,0x5d,0xf0,0xb3,0x3c,0x07,0x5c,0xbd,0xd3,0x80,0x87,0xa6,0xb9,0x88,0x00,0x00,
+ 0x05,0x20,0x28,0x68,0x4a,0x09,0xce,0xab,0xe0,0x21,0xfd,0x5c,0x52,0xf2,0x52,0x15,0x6a,0x1d,0x21,0x48,0x06,0x6c,0x84,0x92,0x4b,0x3e,0xeb,0xde,0xd4,0xe3,0x20,0x0c,0x9c,0x8c,0x00,0x00,
+ 0x05,0x20,0x29,0x0d,0x28,0x48,0x0c,0xe7,0x76,0x89,0xa5,0x27,0x0d,0xc6,0xea,0x04,0x82,0xce,0x4b,0xf4,0x30,0x74,0x69,0x0d,0x27,0xa3,0x5d,0x21,0x51,0x2b,0x0a,0x30,0x60,0x8d,0x00,0x00,
+ 0x05,0x20,0x2a,0x17,0x65,0x6e,0xc3,0xac,0xc6,0x42,0x03,0xe7,0x32,0x16,0xbd,0x24,0x5e,0x64,0xda,0xa9,0x92,0x4c,0x7f,0x52,0x61,0x78,0xde,0x9c,0xe3,0xcb,0xf4,0x45,0xc6,0xc1,0x00,0x00,
+ 0x05,0x20,0x2a,0x5c,0xab,0x83,0x51,0x4b,0xba,0x4f,0xbe,0x24,0x78,0x03,0xb9,0x13,0x31,0xfa,0x11,0xf4,0x8a,0x82,0xcd,0x3c,0x75,0xcc,0xd5,0x18,0xd2,0x1b,0xbf,0xed,0x4b,0x4e,0x00,0x00,
+ 0x05,0x20,0x2a,0xb5,0xe5,0x94,0x2e,0xd1,0xde,0x53,0xb3,0x2a,0x6e,0xcc,0xcf,0x2a,0xe9,0x90,0xf5,0x61,0x4b,0x37,0xf0,0x22,0x1c,0xd7,0x79,0xd1,0x7e,0x2e,0x1e,0x5c,0x6a,0x88,0x00,0x00,
+ 0x05,0x20,0x2a,0x9f,0xcc,0x1b,0xe6,0x58,0x81,0xe0,0x20,0x41,0x20,0xbc,0xff,0x37,0x74,0x08,0x7f,0xd1,0x37,0x0b,0x44,0x68,0x2e,0xd9,0x74,0x16,0x64,0xc4,0x4f,0x6c,0x03,0x63,0x00,0x00,
+ 0x05,0x20,0x2b,0x28,0xe0,0xd8,0x48,0xc3,0xea,0x06,0xcb,0xe3,0xc5,0x9c,0x62,0x5f,0xd9,0x60,0x7e,0xb1,0xed,0x5f,0x36,0xf9,0x1b,0xa9,0xb6,0xa8,0x19,0xe4,0xa0,0x43,0x99,0xe8,0x00,0x00,
+ 0x05,0x20,0x2b,0x6c,0xd5,0xa9,0x25,0xc4,0x89,0x57,0x49,0x9b,0x92,0xae,0x5f,0x2d,0xa2,0xd0,0x3a,0x52,0xed,0x78,0xb5,0x69,0x29,0xa5,0x4f,0x40,0x7b,0xa2,0xf4,0xcf,0x8c,0xc9,0x00,0x00,
+ 0x05,0x20,0x2b,0x85,0xb7,0x2c,0x9b,0x09,0x65,0x7c,0xe7,0xd2,0xbd,0x0a,0xdb,0x64,0xf7,0xfe,0x84,0x84,0x89,0xde,0x71,0x0b,0x63,0x18,0xfe,0x07,0xd9,0x7f,0xab,0x13,0x0a,0xb6,0x00,0x00,
+ 0x05,0x20,0x2c,0x11,0x17,0x1d,0xd0,0x42,0xda,0xf5,0x3c,0xd2,0x8b,0x03,0x5d,0xfa,0x91,0x2a,0xf9,0x16,0x3c,0x33,0x00,0x71,0x1a,0x25,0x07,0x68,0xc0,0x49,0x73,0x8e,0xfe,0x33,0x00,0x00,
+ 0x05,0x20,0x2d,0x23,0x43,0x7a,0x5c,0x1a,0x42,0x86,0xb8,0x8e,0x11,0x81,0x3f,0x47,0x01,0x77,0xdf,0x5a,0xab,0x05,0xb6,0x43,0x76,0x1a,0x4d,0x1a,0x6e,0xcd,0x5d,0x7c,0x88,0x88,0x00,0x00,
+ 0x05,0x20,0x2d,0x26,0xf7,0x94,0x68,0xac,0x88,0xad,0xea,0x57,0xcd,0x18,0x26,0xb9,0x5d,0x7b,0xb2,0xc5,0x5d,0x98,0x0a,0x24,0x3e,0x69,0x80,0xcd,0xa6,0x34,0x3a,0xac,0x9d,0x96,0x00,0x00,
+ 0x05,0x20,0x2d,0x51,0x8a,0xe7,0xd0,0xb0,0x15,0x33,0x7a,0xab,0x9e,0x72,0x01,0xf1,0xd2,0x8d,0xc4,0x84,0x3e,0x95,0x23,0xe9,0xba,0xfb,0xc6,0xb7,0xd6,0xef,0xef,0xc2,0x71,0xc4,0x00,0x00,
+ 0x05,0x20,0x2d,0xdc,0x15,0xe0,0x08,0xa7,0xac,0x67,0x71,0x73,0xc8,0x37,0x34,0xd6,0x40,0xda,0x87,0x9c,0x1c,0x28,0x42,0x1a,0xb6,0x45,0x61,0xcc,0xe4,0x8b,0x04,0xac,0x42,0xef,0x00,0x00,
+ 0x05,0x20,0x36,0xbc,0x66,0xec,0xd2,0x5e,0x77,0x03,0x80,0x12,0x5d,0x2f,0x1c,0xe9,0x63,0x78,0x3a,0x33,0xc2,0xa1,0x15,0xa8,0xd6,0x5c,0x05,0x7d,0x83,0xd1,0x4f,0x86,0x3a,0xf4,0x00,0x00,
+ 0x05,0x20,0x37,0x41,0x83,0x9c,0x20,0x6a,0x1e,0x42,0x76,0xd8,0x21,0xea,0x59,0x17,0xa2,0xa4,0x1b,0xa1,0xa5,0x7e,0xbd,0x62,0x26,0x52,0xba,0x8f,0xe9,0x2f,0x32,0x22,0x5f,0xc6,0x00,0x00,
+ 0x05,0x20,0x37,0x71,0x92,0x9c,0x04,0x58,0x5a,0x68,0x6f,0x30,0x2b,0xe8,0x51,0xc5,0xed,0x9b,0xe1,0x1e,0xd2,0x2d,0x74,0xc8,0x0b,0xb1,0xb9,0x82,0x85,0x22,0xd2,0x12,0xec,0xab,0x00,0x00,
+ 0x05,0x20,0x37,0x8a,0x3f,0x86,0x9a,0x70,0x09,0xcd,0x8e,0x88,0xfe,0x73,0x6d,0xf1,0xbc,0xf8,0x5a,0x70,0xcf,0x6c,0x4b,0x94,0x50,0x24,0xbc,0xf6,0x4c,0x5f,0x4c,0x1f,0xb0,0x52,0x00,0x00,
+ 0x05,0x20,0x37,0xb3,0x5b,0xa8,0x74,0x1d,0x7c,0x90,0x34,0x6f,0x93,0x87,0xf0,0xf7,0x12,0xe2,0xba,0xe6,0x64,0x4c,0xd2,0x6b,0xd3,0x03,0x7b,0xc9,0x3d,0x5a,0x34,0xf0,0xa1,0x62,0x00,0x00,
+ 0x05,0x20,0x30,0x35,0xd7,0x00,0xf3,0xb9,0x81,0xaf,0xbd,0x84,0x11,0x37,0x26,0xd7,0x55,0x5b,0xc4,0x86,0x70,0xc8,0x9d,0x72,0x95,0xf3,0x4c,0x16,0xdd,0x75,0x1c,0x4b,0xb9,0x92,0x00,0x00,
+ 0x05,0x20,0x30,0xfb,0x1f,0x25,0xc1,0xc2,0x88,0xc9,0x07,0x61,0x22,0x1f,0xf5,0x00,0xe0,0x66,0xe7,0x82,0xc7,0x5b,0xb7,0xd7,0x15,0x26,0xae,0xde,0x40,0x68,0x98,0x31,0x33,0x53,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,0x31,0x2a,0x7c,0x15,0x86,0x70,0x86,0x41,0xa0,0xae,0x7e,0x89,0xe1,0x1e,0x5b,0xb9,0x24,0x1d,0x8e,0x85,0x4b,0xed,0x69,0x43,0x07,0x49,0xfe,0xc2,0xfa,0x17,0xd6,0x93,0x00,0x00,
+ 0x05,0x20,0x31,0x41,0x19,0xda,0x3e,0x7a,0x83,0x9e,0x03,0x7d,0xf1,0xc8,0x4c,0xf3,0x7e,0x2d,0xba,0x86,0x72,0x67,0x43,0x11,0x32,0x4d,0xbe,0x90,0xe5,0x0e,0xf5,0xf1,0x0f,0xf9,0x00,0x00,
+ 0x05,0x20,0x31,0x4a,0xfe,0x3f,0xc6,0x92,0x5f,0x33,0x45,0x28,0xe8,0x59,0xf0,0xdf,0x01,0x68,0x20,0x29,0xa5,0xd2,0x60,0xe4,0xed,0x23,0x6f,0x24,0x1f,0x4b,0x58,0x69,0x19,0x33,0x00,0x00,
+ 0x05,0x20,0x31,0x71,0x2a,0xc9,0xda,0xa3,0x89,0x45,0x8b,0xf3,0xe0,0xd2,0xa3,0x3c,0x05,0xb8,0xd4,0xed,0xaa,0x3d,0x65,0x68,0x24,0x0d,0x01,0x32,0x41,0xa9,0x0b,0x60,0x70,0xfb,0x00,0x00,
+ 0x05,0x20,0x31,0xe8,0x5e,0xef,0x1b,0x1d,0xc6,0xdb,0x99,0x29,0xb8,0x25,0x3e,0xf9,0x22,0x92,0x5c,0x77,0x5c,0xa5,0x17,0x3a,0xc0,0xdf,0xb6,0xad,0xf5,0xb6,0x4f,0xd0,0xf3,0x55,0x00,0x00,
+ 0x05,0x20,0x31,0xea,0xc7,0x60,0xe4,0x7f,0x24,0x0c,0x1c,0xc4,0x6f,0xc5,0xa7,0x88,0xdd,0xff,0x40,0x84,0x1e,0x36,0x58,0x9a,0x66,0x7d,0x77,0xbc,0x26,0x1c,0x30,0x26,0x62,0x0e,0x00,0x00,
+ 0x05,0x20,0x31,0xeb,0x72,0x98,0xc7,0xf0,0x4f,0x4e,0x41,0x90,0x51,0x1f,0x48,0x80,0xaf,0xad,0x60,0xc0,0x07,0xbb,0xe6,0x64,0x1a,0xf2,0x11,0xcf,0x6f,0xe7,0xcf,0xd6,0x31,0x69,0x00,0x00,
+ 0x05,0x20,0x33,0x07,0x85,0x63,0x5f,0xff,0x7d,0x71,0xf0,0x62,0x56,0x3f,0xbe,0x2a,0x90,0x43,0x92,0x6b,0x0c,0x27,0x05,0x73,0xe7,0x53,0xfb,0x1b,0xd4,0x6d,0x5c,0xf6,0x4c,0x65,0x00,0x00,
+ 0x05,0x20,0x33,0x24,0xaf,0x44,0xfc,0xc0,0x39,0x09,0xc9,0xa8,0xa6,0xa8,0x72,0x1e,0xe0,0xad,0xc1,0x12,0xb0,0x8e,0x48,0x49,0xf9,0x05,0x3a,0xd3,0x9f,0x0f,0x1b,0x51,0x93,0x0e,0x00,0x00,
+ 0x05,0x20,0x34,0x09,0x15,0xf4,0x2f,0xf0,0x63,0x04,0x2b,0x8f,0xb8,0x0d,0x65,0x8c,0x3e,0x1e,0xa5,0x8e,0x91,0xa1,0xb8,0x2b,0xfc,0x68,0x1c,0x9c,0xcc,0x41,0x65,0x6a,0xf0,0xf3,0x00,0x00,
+ 0x05,0x20,0x34,0x40,0x29,0x1f,0x84,0x29,0x0c,0x8e,0xf0,0xd2,0x61,0xa0,0xfa,0xaa,0x0f,0x64,0x2f,0x46,0x46,0xda,0x3b,0x53,0x47,0x52,0xa0,0xb1,0xb5,0xc3,0xaf,0xe5,0x28,0x48,0x00,0x00,
+ 0x05,0x20,0x34,0xf7,0x6d,0x2f,0x85,0x19,0xfb,0x78,0x6e,0xb3,0x11,0xb3,0xa8,0x47,0xdc,0x5d,0xfd,0x64,0x6b,0x30,0x34,0x6e,0x9a,0x7c,0x77,0x8c,0x5c,0x44,0x91,0x8d,0xe5,0xfb,0x00,0x00,
+ 0x05,0x20,0x36,0x01,0xd8,0x24,0x8a,0x42,0xf8,0x52,0x66,0x81,0xef,0xf3,0xfd,0xbe,0xc2,0x14,0xa4,0x75,0x4d,0xd3,0xd0,0x5b,0x1f,0xd8,0x4a,0x3b,0x02,0x5b,0x5f,0xac,0xcb,0x12,0x00,0x00,
+ 0x05,0x20,0x36,0x06,0x4d,0x39,0xed,0x38,0xf7,0x6a,0xd8,0x0b,0x04,0xa8,0x6b,0xb0,0x8b,0x51,0xc7,0xb2,0xfe,0x72,0x24,0xb1,0x43,0xbd,0xee,0xfc,0x83,0x9c,0xf6,0xd2,0x01,0x19,0x00,0x00,
+ 0x05,0x20,0x3f,0x2f,0xca,0x47,0x8b,0x8f,0x62,0x29,0x3d,0xa4,0x6b,0x33,0x8f,0x23,0xaf,0x06,0xc9,0xb7,0x8e,0x72,0xc5,0x5a,0x52,0xf6,0x9d,0x59,0xf7,0x52,0x0e,0xbe,0xdc,0x2b,0x00,0x00,
+ 0x05,0x20,0x3f,0x31,0x2b,0x5e,0x2c,0x5b,0x08,0xfe,0x33,0x70,0xa7,0x0a,0xff,0x38,0x7a,0x7f,0xd6,0x87,0x38,0x6c,0x4b,0xf9,0x98,0xa1,0xf7,0x79,0xfe,0x12,0xd5,0x98,0xdf,0x16,0x00,0x00,
+ 0x05,0x20,0x3f,0x62,0x15,0xfd,0x73,0xa2,0x2a,0x8f,0x1a,0xfc,0x43,0x9f,0xc4,0x09,0x2f,0xaa,0x9f,0xa8,0xcd,0x9e,0x9b,0x6c,0x41,0x8d,0x51,0x82,0x82,0x2b,0x2c,0x67,0xce,0xfb,0x00,0x00,
+ 0x05,0x20,0x3f,0xb7,0x18,0x20,0xad,0x99,0x1a,0x9f,0x4d,0x13,0xc1,0x9c,0xd6,0x9b,0x7f,0xf3,0xaa,0x05,0xf6,0xa6,0x7e,0x8d,0x3c,0xff,0x54,0xa6,0x6e,0x5c,0xa7,0x1f,0x36,0xb9,0x00,0x00,
+ 0x05,0x20,0x38,0xab,0xdc,0xa3,0x2b,0x88,0xc8,0xc0,0x14,0x44,0xcd,0xb2,0x23,0xd3,0xea,0x5e,0x06,0x18,0xc2,0x94,0x9b,0x07,0x58,0xf6,0xb6,0x00,0x2c,0x31,0x3c,0x56,0x75,0x31,0x00,0x00,
+ 0x05,0x20,0x39,0x83,0xb4,0xd5,0x79,0xbe,0x97,0x08,0x9a,0xd2,0x3e,0x55,0x98,0x08,0xf6,0xda,0x99,0x61,0xad,0xe0,0x67,0x71,0xe4,0xfa,0xcb,0xb0,0x13,0x07,0x6e,0x41,0x60,0xc2,0x00,0x00,
+ 0x05,0x20,0x39,0xda,0x47,0x48,0xe2,0x17,0xfc,0x70,0xf5,0xe0,0xed,0x61,0xa7,0x9b,0xf5,0x07,0x2e,0x4d,0xa1,0x41,0x68,0x04,0x3c,0xd2,0x21,0xc8,0x47,0x2c,0x18,0x28,0x3a,0x10,0x00,0x00,
+ 0x05,0x20,0x3a,0x7c,0xa2,0xa5,0xfe,0xc5,0x24,0x4c,0xe2,0x54,0xa8,0x2e,0x46,0x8c,0xb5,0xd0,0x71,0x6d,0x12,0x2d,0x42,0xa9,0xe5,0xe6,0x65,0x50,0x3f,0xbf,0x1b,0xa8,0x07,0xe1,0x00,0x00,
+ 0x05,0x20,0x3a,0xf3,0xf5,0x67,0xef,0x51,0xfd,0x38,0xfc,0x34,0xc9,0x4c,0xdc,0x4a,0x36,0x69,0xd4,0x77,0xfd,0x94,0xff,0x8e,0x16,0x1f,0x4d,0x6f,0xc3,0xad,0x2f,0xb5,0x97,0x63,0x00,0x00,
+ 0x05,0x20,0x3b,0x59,0x10,0x07,0x28,0x72,0x2d,0x74,0xfb,0x88,0x3e,0xb7,0xf8,0xdc,0xba,0xc8,0x47,0x39,0x95,0xa3,0x41,0x1e,0xff,0xd5,0x0a,0x9e,0x92,0xa7,0x7d,0xd5,0xac,0x55,0x00,0x00,
+ 0x05,0x20,0x3b,0x6f,0x79,0x5f,0xf2,0x9d,0xf2,0x49,0x21,0x2e,0x2f,0x0a,0x68,0xf2,0xf7,0xc4,0xa8,0xd4,0x3d,0xa8,0xab,0x6e,0x2d,0xae,0x09,0xd2,0xc8,0x59,0x7d,0x5f,0x1c,0x0a,0x00,0x00,
+ 0x05,0x20,0x3b,0xc0,0xba,0x99,0x3f,0x29,0xf6,0x1c,0x7d,0xba,0xaf,0x8e,0x0d,0xc2,0x55,0xf1,0xeb,0xf8,0x17,0x89,0x13,0xab,0x32,0x18,0x30,0x5c,0xe6,0x69,0xbb,0x7b,0x28,0xbe,0x00,0x00,
+ 0x05,0x20,0x3d,0x40,0x56,0xba,0x7b,0xe6,0x3b,0x4c,0x0a,0x23,0x52,0xa8,0x4d,0x9a,0x2f,0x07,0x64,0xc4,0x3a,0x55,0x5e,0xda,0x77,0x11,0x10,0x57,0x83,0xe2,0x37,0x7a,0xee,0x1c,0x00,0x00,
+ 0x05,0x20,0x3d,0xdc,0x0a,0x1a,0xfb,0x65,0x9b,0x87,0x99,0x2a,0x66,0xf7,0x54,0x0c,0xcf,0xe5,0x67,0xe9,0x9d,0xe2,0x54,0x4a,0x08,0x14,0xc8,0x2e,0x1b,0xa0,0xe5,0x58,0x4b,0x0a,0x00,0x00,
+ 0x05,0x20,0x3d,0xed,0xe4,0x36,0x34,0xf0,0xa2,0x56,0x2a,0x88,0xe5,0xd2,0x9a,0x0a,0xc3,0x4f,0x5e,0x52,0x91,0x3d,0x51,0x3d,0xfc,0xe1,0xa1,0x37,0x8f,0x6d,0x84,0xd1,0x21,0xdd,0x00,0x00,
+ 0x05,0x20,0x3e,0x22,0xc1,0x92,0x00,0x2d,0x2b,0xed,0xe0,0x6d,0x41,0xe9,0x66,0xd0,0xe0,0x03,0x42,0xb4,0x4d,0x64,0x9d,0xbb,0xf8,0x53,0x98,0x99,0x94,0x6a,0x4b,0xa4,0x96,0x44,0x00,0x00,
+ 0x05,0x20,0x3e,0x2e,0xe3,0x3e,0xf1,0x7b,0x62,0x9c,0x49,0xc5,0xa7,0x0d,0x1e,0xa4,0x6f,0x99,0x67,0x64,0xa5,0x79,0xf4,0xcf,0x0b,0x90,0xb2,0x01,0x45,0x31,0x4f,0x47,0x15,0xed,0x00,0x00,
+ 0x05,0x20,0x46,0x95,0xbd,0x48,0x3b,0x2b,0x14,0x72,0x32,0x9a,0x36,0x59,0xf3,0xf1,0x9a,0xe5,0x02,0x23,0x40,0x6e,0x39,0xcd,0x0e,0x72,0x18,0x07,0xf2,0x15,0x44,0xd6,0xf3,0x28,0x00,0x00,
+ 0x05,0x20,0x46,0xaf,0xfd,0x27,0x4e,0x22,0x54,0xda,0x0c,0x83,0xbc,0x82,0x0b,0xaf,0xc0,0x64,0x3c,0x0f,0xbc,0xe8,0x2c,0xbd,0xb0,0x95,0xb5,0x6d,0x2f,0x72,0x8f,0x43,0x27,0xef,0x00,0x00,
+ 0x05,0x20,0x46,0xb1,0x7e,0xfa,0xad,0x92,0x04,0x06,0x33,0xad,0xcc,0xb2,0x3f,0x02,0x77,0x35,0xf1,0xa5,0xcd,0x34,0x2d,0x41,0xe4,0xa8,0xb4,0x49,0x23,0xb0,0x6d,0xee,0x48,0x92,0x00,0x00,
+ 0x05,0x20,0x47,0x04,0x40,0xbc,0xae,0x41,0x00,0xfc,0x7e,0x97,0x6e,0x3f,0x14,0xd5,0xb9,0xfa,0x57,0xf8,0xc2,0xbd,0xdc,0x8a,0xb3,0x03,0xbc,0x78,0x1e,0xbe,0x43,0x02,0x5f,0xc8,0x00,0x00,
+ 0x05,0x20,0x47,0xf0,0x67,0xba,0x42,0x01,0x5c,0x39,0x33,0x34,0x43,0xa7,0x4a,0x3f,0xf0,0x49,0xb0,0xa5,0xd7,0x73,0xa0,0x0f,0xa8,0xfe,0x39,0xa5,0xac,0xae,0x31,0x89,0x0f,0x27,0x00,0x00,
+ 0x05,0x20,0x41,0x7a,0xd8,0x8a,0x0d,0x4d,0x34,0x1c,0x76,0x3e,0x6e,0x99,0x76,0x18,0xd0,0xf6,0x6d,0xa8,0x0e,0x42,0x9a,0x76,0x41,0xbe,0x0c,0x4b,0x2b,0x05,0x79,0xa3,0x9a,0x80,0x00,0x00,
+ 0x05,0x20,0x41,0xc0,0x8b,0x7c,0xf2,0xf3,0x83,0x57,0xa7,0x84,0x3b,0xbd,0x88,0x00,0xc8,0xe1,0x05,0x42,0xf4,0x24,0x8f,0x8e,0xba,0xba,0x8f,0x8a,0x0b,0xcc,0x96,0xf1,0xfe,0x8c,0x00,0x00,
+ 0x05,0x20,0x42,0x3f,0x10,0x75,0x6e,0x87,0xdb,0x6e,0x6d,0x57,0x4c,0xe3,0xe9,0x8c,0xe5,0xf0,0x97,0x59,0xb4,0xb0,0x80,0x26,0xd0,0x67,0x4c,0x9c,0x7c,0xf2,0xf4,0xf8,0x22,0xc3,0x00,0x00,
+ 0x05,0x20,0x42,0xe5,0x76,0x3b,0x0d,0x19,0x2d,0xc2,0x0f,0x46,0x32,0xcb,0xd6,0x06,0xce,0x77,0x2c,0x4e,0xce,0x7e,0x83,0x1f,0xc5,0x66,0xb9,0xc6,0x6b,0x62,0x57,0x48,0x91,0x7f,0x00,0x00,
+ 0x05,0x20,0x43,0x6d,0x2a,0x90,0xa2,0xbc,0xb2,0x72,0x45,0x3e,0x0d,0xdb,0xf7,0x53,0xf2,0xac,0x91,0x39,0xe3,0x5d,0xf6,0xfe,0x7c,0xf1,0x05,0xc3,0x7f,0x7c,0xc4,0x27,0xff,0x27,0x00,0x00,
+ 0x05,0x20,0x45,0x03,0xaa,0xf8,0xf8,0x33,0x79,0x96,0xb7,0x7c,0x6d,0xb5,0x9a,0x20,0xf4,0x78,0xb3,0x11,0x3d,0xa8,0x86,0x82,0x34,0x2e,0xb2,0x5a,0xc6,0xb9,0x50,0x45,0x8c,0x60,0x00,0x00,
+ 0x05,0x20,0x45,0xce,0x60,0x59,0xef,0xe8,0x1b,0x15,0xda,0xf7,0x31,0x68,0xde,0x65,0x7b,0x67,0x6e,0x75,0xdc,0x12,0x94,0xb2,0xd1,0x3c,0xfc,0x47,0x09,0xe0,0x61,0x81,0xe9,0x61,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,0xbc,0x67,0x80,0x0d,0xe8,0x02,0xb0,0xf7,0xca,0xe4,0x66,0x12,0x01,0x95,0xda,0x0e,0x3e,0x54,0x79,0x1d,0x7f,0xc1,0xdb,0x8a,0x51,0x2b,0x78,0xd0,0x0f,0xb0,0x23,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,0x49,0xee,0x7b,0x15,0x10,0xc4,0xa2,0x9e,0x8d,0x0f,0x0c,0xc6,0xe5,0x20,0xba,0xe8,0x0f,0x24,0xff,0xa0,0x98,0xe1,0x10,0xad,0xd8,0xef,0xb8,0xc2,0x75,0x77,0x20,0x06,0x00,0x00,
+ 0x05,0x20,0x4a,0xa5,0x9b,0xfb,0xd5,0x70,0x14,0xf0,0x7f,0x44,0x29,0x54,0x9d,0x5e,0xe9,0x6f,0x20,0x65,0xc9,0x03,0xb1,0x12,0xcb,0xb9,0x90,0xc0,0x8f,0x56,0xe1,0xe6,0x87,0xca,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,0x4a,0xc5,0x98,0x67,0xad,0x42,0xd7,0xba,0xc8,0x41,0x4d,0xf8,0x92,0xb3,0xae,0x35,0xc6,0xad,0x97,0x2d,0xac,0xa5,0x89,0xe5,0x20,0x6b,0xb5,0x43,0x91,0x9c,0xb5,0x62,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,0xe2,0xb3,0x6d,0xd6,0x9e,0xfe,0x6a,0x04,0xfb,0xdc,0x34,0x75,0xe7,0x4a,0xbe,0xf9,0x51,0xde,0x9c,0xf7,0x1f,0xd7,0xc0,0x1c,0xc1,0xec,0x02,0xdd,0xaf,0xa3,0xd8,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,0x4d,0x95,0x39,0xe8,0xeb,0xe1,0x36,0x87,0x96,0x23,0xbf,0x89,0xa3,0x48,0x33,0x3e,0x6d,0x11,0xa4,0xe0,0x0c,0x6c,0x8c,0x51,0x8a,0x6e,0xb3,0x6d,0xab,0x6f,0xe2,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,0x93,0x4b,0x17,0x24,0x09,0x85,0x82,0x1e,0xa7,0xeb,0x37,0xb4,0x57,0xc3,0xf0,0x86,0xf7,0x28,0x80,0x51,0x4f,0xba,0xb6,0x50,0xab,0xe8,0x14,0x08,0x5f,0xdc,0x1a,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,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,0xe1,0x84,0x64,0x9a,0x14,0xfc,0xc6,0x6d,0x35,0xae,0x41,0x56,0x6b,0x21,0x10,0xa4,0xe2,0x76,0x03,0xe1,0x15,0x07,0x7f,0x26,0x9f,0xfb,0x1c,0xe7,0x6c,0x6a,0x37,0x00,0x00,
+ 0x05,0x20,0x57,0x5d,0x86,0xfc,0xe8,0x33,0xe1,0x60,0x46,0x47,0xdd,0x14,0x33,0x32,0xfb,0xcf,0xa7,0x58,0x0a,0xc9,0xa7,0x2e,0x0b,0x44,0xc4,0xf0,0x01,0x2b,0x44,0x6d,0x73,0xb6,0x00,0x00,
+ 0x05,0x20,0x57,0x6a,0x98,0xaf,0x33,0xde,0xc6,0x75,0x6e,0xce,0x94,0x8a,0xde,0x8c,0x8f,0x65,0x71,0xd9,0xdc,0x28,0xab,0xeb,0x9d,0xda,0x3d,0xd3,0x00,0x04,0x24,0xd7,0x3e,0x67,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,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,0xe4,0x04,0xf0,0xda,0x49,0xff,0x6f,0x9a,0xf6,0x14,0xda,0x85,0x4c,0xdb,0x3c,0x2d,0x27,0xb3,0xf9,0x5a,0xad,0x39,0x02,0xf6,0xe3,0x69,0xbe,0xa6,0x52,0x48,0x25,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,0x8f,0xfe,0x2a,0xa1,0x29,0xa8,0x80,0x33,0x7b,0x2c,0x88,0x51,0xad,0x52,0xe9,0xe7,0x41,0x2a,0xa1,0xd9,0xf1,0xbf,0x54,0xe1,0x65,0x6c,0x78,0xc1,0x77,0x78,0x58,0x00,0x00,
+ 0x05,0x20,0x54,0xc8,0x41,0xaf,0x6a,0xf2,0xad,0xf5,0x19,0xbd,0x30,0x63,0x00,0x8d,0x77,0xab,0x20,0x13,0x20,0x13,0x05,0x1b,0x08,0xc2,0x6d,0x47,0xa9,0x6f,0xd3,0x0a,0x71,0x7d,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,0x5f,0x9d,0xd7,0x90,0xab,0x48,0x8d,0xa2,0x94,0x71,0x0d,0x41,0x3c,0x8b,0x7f,0x06,0x86,0xab,0xc5,0xa3,0xd7,0x73,0xfa,0xdd,0x48,0x66,0xa7,0xbc,0xb2,0x59,0xb4,0x8f,0x00,0x00,
+ 0x05,0x20,0x58,0xbb,0xc0,0x3b,0x4e,0xab,0x7c,0x0b,0x13,0x2b,0xf3,0x8c,0xfb,0x8f,0x77,0x02,0x89,0x6e,0x79,0xd3,0x1d,0x3f,0x45,0xe3,0xa0,0x34,0xc2,0x36,0x20,0xaa,0x33,0xf9,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,0x5a,0x9a,0x96,0x22,0xf6,0xad,0xf2,0xb0,0x6c,0x46,0xa8,0x7b,0x06,0x3c,0x24,0x3c,0x1e,0x52,0xae,0x89,0x10,0x1e,0xde,0xb0,0xea,0x55,0x3d,0xbb,0x80,0x06,0xb9,0xa4,0x00,0x00,
+ 0x05,0x20,0x5a,0xc1,0x5a,0x79,0xa7,0x36,0x9c,0xfa,0x81,0xfa,0x5e,0xfb,0x42,0xa3,0x5f,0xfe,0x7e,0x4b,0x6a,0xcd,0x99,0x1f,0x57,0x45,0xb4,0x05,0x79,0x3f,0x15,0x8f,0x61,0x72,0x00,0x00,
+ 0x05,0x20,0x5b,0x2e,0x80,0x3e,0x46,0x70,0x7a,0x08,0x24,0x9e,0x71,0x69,0xc6,0xbe,0xee,0x17,0x4c,0xd4,0xcc,0x25,0x19,0xb1,0x2e,0x88,0x81,0xe1,0xc3,0x21,0x3a,0x33,0x5e,0x71,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,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,0x4a,0x29,0xcb,0xf8,0x8d,0xa1,0xc8,0x4e,0x20,0x0a,0xf6,0x04,0x75,0x69,0xbb,0x4e,0x60,0xe4,0x1c,0x72,0x43,0xa7,0x29,0xb9,0x73,0x82,0x3a,0x8d,0xb9,0x3b,0xfd,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,0x5d,0xcf,0xc1,0xcb,0x26,0xb5,0x53,0x92,0xa5,0xf8,0xde,0x89,0x14,0x0c,0x2d,0xd6,0x2f,0x96,0x08,0x22,0x2c,0xbd,0x73,0x81,0x9f,0xd7,0xf5,0x11,0xec,0x6c,0x44,0xf0,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,0x40,0xd1,0x09,0x74,0x77,0xd7,0x99,0x1b,0xb9,0xca,0xf0,0xe6,0x27,0x9c,0x20,0x03,0x0a,0xb9,0xe1,0xd7,0xea,0xb0,0xc8,0x11,0x31,0x26,0x90,0xa0,0x3f,0x91,0xc7,0x00,0x00,
+ 0x05,0x20,0x5e,0x62,0x6d,0xd4,0x84,0xdd,0x83,0x9f,0xc0,0x1a,0x1f,0x19,0x50,0x21,0x39,0x20,0x70,0xd3,0xdf,0x7d,0xf7,0xe2,0xf4,0x9c,0x75,0x20,0x48,0x4a,0x94,0xe5,0x8b,0xfc,0x00,0x00,
+ 0x05,0x20,0x60,0x70,0x5e,0x8f,0x75,0x3a,0xf0,0xa4,0xb2,0x0f,0x50,0xd1,0x6e,0x6a,0x4f,0x08,0x7f,0x4e,0x0b,0xf5,0xa7,0xd3,0x4a,0xcb,0x78,0x28,0x6c,0x08,0x4d,0x2d,0x83,0x7b,0x00,0x00,
+ 0x05,0x20,0x60,0x73,0xcb,0x60,0xa4,0x84,0xd6,0xb1,0x08,0x11,0xc6,0x85,0x10,0x2b,0x50,0x2b,0xaa,0xd0,0x43,0x5b,0xf7,0xaa,0x31,0x8e,0x2e,0xff,0x90,0x7b,0x88,0x00,0xa9,0x5f,0x00,0x00,
+ 0x05,0x20,0x60,0xaa,0xa1,0x92,0x7a,0xf5,0xf3,0x2c,0xf3,0xe7,0x5d,0x21,0xdc,0x98,0x18,0x66,0x13,0x5c,0xeb,0x3e,0x6a,0x24,0x2e,0x92,0x6c,0x6b,0xd4,0xea,0x0f,0x2a,0xc2,0xd1,0x00,0x00,
+ 0x05,0x20,0x64,0x2b,0x8c,0xfb,0x8b,0xc5,0xba,0xe5,0x0d,0xf2,0x2a,0x4a,0x52,0x80,0x34,0xed,0x34,0xb2,0x38,0x3e,0xa4,0xa0,0xc2,0x8f,0xa0,0x9f,0x48,0x00,0x7e,0x3b,0xf8,0xcb,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,0x65,0xcc,0xb3,0x43,0xa8,0x17,0x23,0xa6,0x20,0xd3,0xa3,0x09,0xde,0x3a,0xc5,0xd3,0xd4,0xe5,0xa7,0x91,0xb4,0x4c,0xa5,0xd7,0xb0,0x90,0xfa,0x06,0x07,0xb5,0x62,0x32,0x00,0x00,
+ 0x05,0x20,0x6e,0xdf,0xd1,0xa9,0x1c,0xaa,0x92,0xca,0xc3,0xec,0x33,0xfa,0x12,0x1c,0x05,0x27,0x45,0x1a,0xaf,0xd0,0xeb,0xc8,0xa1,0x14,0x47,0x8d,0xb1,0x39,0x7c,0x7e,0x18,0x43,0x00,0x00,
+ 0x05,0x20,0x6e,0xee,0x4b,0xbf,0x4a,0x4d,0x45,0x08,0x8f,0xb7,0x93,0x0c,0xe1,0xbe,0x5a,0x41,0xeb,0x59,0x28,0x50,0x45,0x1e,0xbd,0x0d,0xd9,0x1e,0x43,0x1c,0x90,0x1e,0x4b,0x61,0x00,0x00,
+ 0x05,0x20,0x6f,0x4e,0x81,0xcb,0xfd,0xfb,0x4e,0x74,0xb3,0x84,0x2a,0x1a,0xd2,0xd4,0xc1,0xea,0x98,0x6b,0xda,0xb3,0xf0,0x06,0x60,0x9f,0xdc,0xe9,0xba,0x54,0x85,0xe7,0x11,0xff,0x00,0x00,
+ 0x05,0x20,0x6f,0xd2,0xe8,0xa1,0x8b,0x84,0x52,0x59,0x0c,0x32,0xad,0x9d,0x96,0x13,0xc4,0x40,0x9f,0x44,0x6f,0xbb,0x13,0xb6,0xe8,0x07,0x48,0xa3,0xca,0x4b,0x7a,0xcb,0x4b,0x53,0x00,0x00,
+ 0x05,0x20,0x68,0x1d,0x7f,0xe5,0xe0,0x32,0xb7,0x9d,0x64,0x51,0x13,0x63,0x56,0xa6,0x54,0x80,0x4c,0xc3,0xca,0x61,0xde,0x7a,0x6c,0xb5,0xed,0x1d,0xb6,0x75,0x87,0x97,0xee,0x40,0x00,0x00,
+ 0x05,0x20,0x68,0xb4,0x36,0xf9,0xa8,0x29,0x3e,0x92,0x30,0x41,0x50,0x97,0xb4,0x19,0xf8,0xb5,0x29,0x94,0x77,0xb2,0x9c,0x09,0x5d,0xca,0xa2,0x6b,0x68,0x9d,0x02,0x69,0x75,0x97,0x00,0x00,
+ 0x05,0x20,0x68,0xc7,0xb8,0x91,0x85,0xda,0x06,0x2e,0x7e,0x84,0xa6,0x1e,0x7d,0xec,0x44,0xd0,0xcd,0x0b,0x3d,0x11,0xb8,0x20,0xe6,0x54,0xda,0xd5,0x5b,0xf1,0x94,0xb6,0xd2,0xfc,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,0x6a,0x1e,0x4a,0x9f,0xae,0x78,0x8d,0xf9,0x4e,0x4c,0x2f,0xb8,0x3a,0xcd,0x5d,0x0b,0x79,0xd7,0x44,0x4a,0x70,0x35,0x1d,0xf8,0xc2,0x6c,0xcb,0xd4,0x6c,0xf2,0xda,0x47,0x00,0x00,
+ 0x05,0x20,0x6a,0x93,0xac,0x80,0x29,0xe8,0x79,0x53,0xb9,0x63,0xde,0xdb,0x9d,0xa8,0xcf,0xd5,0xf6,0x8d,0x92,0x5a,0x5e,0xd1,0x9f,0x72,0x37,0xbf,0xc8,0xcf,0xc5,0x46,0xa0,0x41,0x00,0x00,
+ 0x05,0x20,0x6a,0xe9,0x69,0x19,0xe1,0x56,0xc4,0xf5,0x88,0x3a,0x2b,0xda,0x57,0xa6,0x27,0x74,0xf5,0x6f,0x83,0xcc,0x9a,0x4c,0x65,0x41,0x0a,0xa0,0xe4,0xfc,0x4a,0x0b,0x90,0x89,0x00,0x00,
+ 0x05,0x20,0x6b,0x34,0x3a,0x48,0xdb,0x7e,0x3f,0xf6,0x6b,0x62,0x8e,0xdb,0x3d,0x27,0x90,0xfd,0x15,0x6c,0xd6,0x06,0xaf,0x8f,0xed,0xf5,0xf6,0xe4,0x96,0x6b,0x59,0xf3,0x22,0x8a,0x00,0x00,
+ 0x05,0x20,0x6b,0xdc,0x57,0x84,0x31,0xa6,0x75,0x00,0x70,0x35,0x11,0xd6,0x05,0xef,0xdb,0x8e,0xe8,0x84,0x78,0xc9,0x61,0x8a,0xf1,0x76,0x31,0x21,0x83,0xa7,0x23,0xab,0x10,0x15,0x00,0x00,
+ 0x05,0x20,0x6c,0xde,0xd2,0xc7,0x42,0x65,0xf2,0xb6,0x4b,0x2d,0xa9,0x8b,0x5d,0xea,0x36,0xd3,0xc7,0x50,0xe7,0xec,0xbd,0x27,0xb0,0x99,0xe7,0x27,0x1d,0xae,0x0e,0x0b,0xa8,0xf8,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,0x8a,0x3b,0x2c,0x2b,0x3d,0x06,0xe6,0x6d,0xd0,0x26,0xf5,0x8c,0xe6,0x94,0x4e,0xa4,0x1d,0xfe,0x69,0xaa,0xd8,0x86,0x22,0x34,0xe0,0x9c,0x0c,0xa3,0xa5,0x89,0x09,0x00,0x00,
+ 0x05,0x20,0x6d,0xcf,0x2f,0xa8,0xff,0xd1,0xa6,0x4b,0xff,0x67,0x3d,0x3a,0x0f,0xcc,0xc9,0xa2,0xfb,0x96,0x7a,0x1f,0x1d,0xc8,0x98,0x15,0x75,0x1c,0x3c,0x17,0x43,0xc0,0xe3,0x11,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,0x76,0xa2,0x25,0x46,0x1f,0x49,0x12,0xaf,0x64,0xb7,0x85,0x37,0x92,0x0f,0xb5,0xc2,0x5f,0x00,0x19,0x5e,0x71,0xa1,0x27,0xc3,0xfe,0xf9,0x2a,0x01,0x12,0x3a,0x9d,0x81,0x00,0x00,
+ 0x05,0x20,0x77,0x26,0xa0,0x0f,0xf6,0x19,0x30,0x08,0x90,0xb4,0x25,0xb4,0x3d,0xe2,0x6f,0xb0,0xb9,0xd9,0xd9,0x42,0x07,0x6a,0xe0,0x99,0x03,0x3d,0x2b,0xe3,0xff,0x91,0xdc,0x8b,0x00,0x00,
+ 0x05,0x20,0x77,0x65,0xd4,0xec,0xc7,0x3a,0x3e,0x94,0x3e,0x43,0xe2,0x7a,0x91,0x07,0xf0,0x48,0x64,0x09,0xaa,0xd7,0x15,0x5d,0x33,0x25,0x38,0x34,0xc4,0x9d,0xad,0x00,0x4b,0xb0,0x00,0x00,
+ 0x05,0x20,0x70,0x1a,0xfe,0xcb,0x8e,0x5c,0xba,0x81,0xc5,0xeb,0x03,0x98,0xb5,0x25,0xde,0xbf,0x88,0x00,0x25,0x1a,0xb8,0x69,0xd5,0x35,0x6e,0xa5,0xc0,0x76,0x59,0x19,0x82,0x1f,0x00,0x00,
+ 0x05,0x20,0x70,0x30,0x29,0xb3,0xf5,0xbc,0xc0,0x66,0x8e,0xc0,0x7b,0x7b,0x27,0x26,0x16,0xd6,0xdc,0x33,0x37,0x2d,0xd8,0xb9,0xfc,0xae,0xc2,0xed,0xc0,0xb1,0x45,0xa5,0x2e,0x15,0x00,0x00,
+ 0x05,0x20,0x70,0xfd,0x70,0x0e,0xb5,0x5c,0x08,0x35,0xfe,0xa9,0x27,0x41,0x4a,0x39,0xfc,0x7b,0x6c,0x5d,0x79,0xe5,0x4f,0x3c,0xcb,0xde,0x82,0xac,0xf7,0xc8,0xaf,0xb7,0xeb,0xb8,0x00,0x00,
+ 0x05,0x20,0x70,0xd9,0xc7,0x5d,0xd9,0x63,0x0d,0xda,0x94,0xf9,0xf8,0xbf,0x55,0xbd,0xe8,0x50,0x75,0x2f,0xcf,0xd1,0x69,0xd5,0xd4,0x07,0x3d,0xa9,0x92,0x4f,0xb3,0x68,0x30,0xba,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,0xde,0x08,0xc6,0x86,0xaa,0x74,0xb8,0x1d,0x23,0xee,0x8b,0xb0,0x8d,0x9b,0xb0,0x38,0xc6,0x13,0x5d,0x76,0x53,0x04,0xc0,0xc2,0x32,0x5b,0x4e,0x4a,0x56,0xc2,0x40,0x00,0x00,
+ 0x05,0x20,0x72,0x14,0x51,0x06,0xf4,0x36,0xf9,0x59,0x95,0xaa,0x2a,0xcf,0xe7,0x19,0xa2,0xbb,0xeb,0x99,0x75,0x39,0x29,0xc0,0x04,0x6b,0x97,0xa5,0x73,0x86,0x96,0x48,0xdc,0x97,0x00,0x00,
+ 0x05,0x20,0x72,0x29,0x23,0x1d,0xfb,0x56,0xf9,0xb7,0x16,0x58,0xb6,0xb0,0xcf,0x20,0x89,0xaa,0x32,0xda,0x2a,0xfd,0x5c,0x4e,0x02,0xdf,0x23,0x04,0x98,0x95,0x63,0x5c,0x45,0xc2,0x00,0x00,
+ 0x05,0x20,0x72,0x8b,0x72,0x38,0xfe,0x44,0xe9,0xc2,0xf4,0xbc,0xd8,0xce,0x1c,0xd5,0x50,0xb1,0x63,0x56,0x74,0x5e,0xf2,0xd3,0xe5,0xd5,0x29,0xe4,0x34,0x1d,0xf5,0x1c,0x7a,0xb9,0x00,0x00,
+ 0x05,0x20,0x73,0x14,0x85,0xbf,0xe4,0x1e,0x55,0xf2,0xbd,0x8c,0x5e,0x8b,0x85,0x82,0x3e,0xe3,0xc5,0xd7,0x28,0x17,0xa2,0x33,0x5f,0xcc,0xb0,0x56,0xa0,0xc9,0x14,0x6e,0x53,0xf8,0x00,0x00,
+ 0x05,0x20,0x74,0x72,0x72,0xac,0x9f,0xc1,0x1a,0x14,0x12,0x51,0x99,0xb7,0xf5,0xa9,0x78,0xa2,0x84,0x9c,0x24,0x55,0x28,0xe2,0xf5,0x6d,0xed,0x8c,0x64,0x79,0xaf,0xd2,0x18,0xa3,0x00,0x00,
+ 0x05,0x20,0x75,0x54,0x9c,0x2c,0x32,0x29,0x35,0xfe,0xf8,0x4f,0x79,0xf3,0x7d,0x66,0xa7,0x3b,0x26,0x12,0x4e,0x3d,0x12,0x3d,0x2b,0x33,0x03,0x80,0xba,0x89,0x81,0x30,0xbb,0x3e,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,0x7e,0xe1,0x73,0xcd,0xd7,0x02,0x54,0xc9,0xfe,0x66,0x17,0xa5,0x3a,0xf7,0xac,0x92,0x09,0x51,0x77,0x7a,0xdc,0x67,0x19,0x22,0xd2,0x9d,0x66,0x5d,0xfd,0x16,0x47,0x07,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,0x97,0xc5,0x6f,0x0b,0xf1,0xd9,0x22,0x3f,0x92,0x3c,0x79,0xf6,0x92,0xf6,0xc8,0xfa,0xce,0x4f,0xe3,0x1e,0x7d,0x82,0x3d,0x7a,0x94,0x18,0xa4,0x0a,0xf5,0x28,0x42,0x00,0x00,
+ 0x05,0x20,0x79,0x23,0x63,0x95,0x6f,0x9b,0x12,0xaa,0x30,0xa1,0xd4,0x36,0xc9,0xde,0x0a,0xc9,0xd5,0x88,0x3f,0xfa,0xda,0xc2,0xbe,0x0a,0x7a,0xca,0x2a,0x7c,0x32,0x8f,0x54,0xe9,0x00,0x00,
+ 0x05,0x20,0x7a,0xc8,0x27,0x35,0xb4,0x50,0xe7,0xc2,0xbf,0xe2,0x48,0x92,0x7f,0x80,0xba,0x06,0xdb,0x99,0x35,0x45,0x82,0x4d,0x7d,0x4b,0xe9,0x0f,0x6f,0x83,0xc3,0x61,0xed,0xc0,0x00,0x00,
+ 0x05,0x20,0x7b,0x98,0xe1,0xe0,0xbb,0x6b,0x41,0x5f,0xe0,0x94,0xd5,0x25,0x19,0x1f,0x30,0xf8,0xea,0x38,0x02,0xd1,0x3b,0x81,0x4d,0xd2,0xeb,0x43,0x11,0x53,0xe3,0x9e,0x5b,0x01,0x00,0x00,
+ 0x05,0x20,0x7b,0xa8,0x45,0xdf,0x63,0x53,0xa0,0xde,0x8e,0xab,0x0e,0xaa,0x40,0x64,0xe8,0x42,0x9b,0x6a,0xce,0xa0,0x18,0x43,0x95,0x3e,0x2a,0xdb,0x59,0x55,0xf2,0xb0,0x78,0x98,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,0x1e,0x98,0xa5,0xb5,0x0c,0x57,0x9c,0xe5,0xb5,0xdc,0x5b,0xae,0x3d,0x45,0x23,0x2b,0xed,0x4a,0x83,0x1c,0x66,0x5e,0xab,0x37,0xba,0xf6,0x00,0x91,0x5d,0xb9,0x77,0x00,0x00,
+ 0x05,0x20,0x7c,0xf6,0x85,0x05,0x70,0xd6,0x26,0xe8,0x10,0x44,0x9d,0xc7,0x44,0x6c,0x97,0x16,0x24,0xd8,0x87,0x29,0xd4,0x6d,0x1e,0x40,0x37,0x84,0xd6,0x25,0x2e,0x4a,0x4b,0xba,0x00,0x00,
+ 0x05,0x20,0x7d,0x0e,0x49,0x44,0x50,0xeb,0x92,0x2a,0xbc,0x8d,0x1b,0xd3,0x5e,0x9d,0x1f,0x51,0x6f,0x5c,0x7b,0x87,0x5b,0xcc,0x27,0x28,0xb6,0x44,0x36,0x22,0x29,0xcc,0x3c,0x7c,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,0xdb,0xe0,0x17,0x76,0xe3,0xfc,0x0a,0x19,0x6a,0x9a,0x09,0x45,0x52,0x5e,0xa6,0x73,0xa7,0x85,0xfa,0x26,0x01,0xc7,0x52,0xb1,0xfa,0xf2,0xbb,0x9f,0x46,0x8e,0x79,0x00,0x00,
+ 0x05,0x20,0x87,0x74,0x2d,0x93,0x04,0xd9,0xaa,0x02,0x3e,0x07,0xa7,0x3a,0xd9,0xf1,0x07,0x34,0x0b,0x4c,0xca,0x3d,0x39,0xfa,0xce,0xb4,0xd0,0x9c,0x4f,0x06,0x59,0x24,0x4a,0x5b,0x00,0x00,
+ 0x05,0x20,0x87,0xd8,0xd6,0x3c,0xcb,0xef,0x04,0x10,0x3a,0x24,0x68,0x94,0x0c,0x04,0xf6,0x69,0xfa,0xea,0xe0,0x0a,0x15,0x66,0x76,0x24,0x72,0x65,0x61,0x44,0x3f,0xa4,0x2f,0x1a,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,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,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,0x83,0x3d,0x52,0xc3,0x8f,0x2d,0x52,0x6d,0xc7,0x86,0xd6,0xae,0xa3,0x73,0xf7,0x17,0x07,0xac,0x74,0x5f,0x82,0xe4,0xe8,0x60,0xe5,0x7b,0xe5,0x53,0xec,0xd1,0x49,0x54,0x00,0x00,
+ 0x05,0x20,0x83,0x21,0x20,0xe0,0x1f,0xc1,0xde,0x35,0x1a,0xf8,0x84,0xf2,0x26,0x5c,0x09,0x41,0xc8,0x36,0xbf,0xd2,0x61,0xda,0x6b,0xfe,0x5a,0x6f,0x0d,0x7e,0xb2,0x91,0x9f,0xac,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,0xc1,0xd6,0xbf,0xff,0x64,0x4c,0x96,0x30,0xe7,0xfe,0x83,0x04,0xb4,0xeb,0xbc,0x3a,0x94,0xec,0x0d,0x6c,0xce,0xe8,0x58,0x5f,0xd4,0xb3,0xfa,0x71,0x3c,0xca,0x8d,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,0x23,0x5c,0x0a,0x74,0x73,0x25,0x78,0x22,0x0a,0xb4,0xf2,0xf2,0xde,0x63,0x73,0xf3,0x11,0xc1,0x80,0xbb,0x6c,0xd3,0xb6,0x99,0xca,0xf4,0xb8,0x8c,0x56,0xf9,0x9e,0x00,0x00,
+ 0x05,0x20,0x85,0x82,0xc4,0xdc,0xcd,0xb3,0x51,0x34,0x37,0x5f,0x30,0x2d,0x3a,0x76,0xc4,0x46,0x02,0xee,0xb5,0xab,0x34,0xb9,0x38,0xc4,0xfd,0xaa,0x3b,0xad,0x74,0xa4,0xcb,0x11,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,0x85,0xa6,0xf6,0x1f,0xd2,0x93,0x54,0x47,0x59,0xc2,0x6d,0x57,0xfa,0x54,0x94,0x39,0x5c,0x33,0xcf,0x67,0x91,0xad,0x6c,0x0c,0xf8,0xdd,0x79,0x76,0x5a,0x01,0xb5,0x49,0x00,0x00,
+ 0x05,0x20,0x85,0xec,0x3d,0xb6,0x9c,0x52,0x05,0x6a,0x60,0xee,0x49,0x38,0x30,0x18,0x67,0x0a,0x0b,0xc0,0xdc,0x8c,0xe4,0x95,0xd2,0x4e,0xb5,0x41,0xb0,0x20,0x93,0xba,0x71,0x50,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,0x44,0x8b,0x59,0xc8,0x63,0xb7,0x5e,0xf4,0x1f,0x6f,0x2e,0x1d,0x60,0xf8,0xb9,0x23,0x4a,0xe7,0x13,0xd0,0x86,0x52,0x34,0xdb,0x3e,0xc1,0x10,0x1a,0x1c,0x46,0x51,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,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,0x8a,0x21,0x15,0x27,0xf9,0x3d,0x2d,0x00,0xbc,0x6b,0xa1,0x16,0x84,0x9b,0x14,0xae,0x28,0x12,0x40,0x99,0xd3,0x46,0xda,0xa3,0xd9,0x26,0x59,0x51,0x5a,0x0c,0xc5,0xe5,0x00,0x00,
+ 0x05,0x20,0x8a,0x77,0xf3,0x26,0x77,0xd5,0x19,0x01,0x08,0x4b,0xbd,0x99,0x32,0x8c,0xc3,0xba,0x8b,0x2b,0x3f,0x8f,0x34,0x5a,0x68,0xd4,0xf0,0x87,0x0a,0x73,0xa6,0x04,0xa0,0xfe,0x00,0x00,
+ 0x05,0x20,0x8a,0xe5,0xe7,0x6b,0x68,0xcf,0x6c,0x30,0x0d,0xda,0x6d,0xe4,0x3b,0xda,0xf2,0x51,0x7c,0xc1,0x4e,0x45,0xf6,0xb6,0xa4,0x7a,0x8a,0xa3,0xe2,0x32,0xe9,0x65,0x10,0x6a,0x00,0x00,
+ 0x05,0x20,0x8b,0x3d,0x54,0x9e,0x74,0x6f,0x72,0x94,0x6c,0xa4,0x30,0x6b,0x4d,0x65,0x83,0x5b,0xbd,0xf9,0xd2,0xa3,0x06,0x86,0x1a,0x92,0x08,0xd5,0x59,0x08,0x5c,0x71,0x0c,0x96,0x00,0x00,
+ 0x05,0x20,0x8c,0x19,0x6c,0x70,0x40,0xcd,0xa6,0xc5,0x55,0x74,0xb5,0xf3,0x9f,0xab,0x4b,0xc7,0x53,0x61,0x39,0x01,0x04,0x7d,0x52,0xdd,0xf1,0xee,0x80,0x06,0x2e,0x2c,0xed,0x88,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,0x8c,0xb8,0x4b,0xb7,0x1c,0x99,0xf6,0x0f,0xb4,0xc8,0x34,0x4c,0xf5,0xae,0x46,0x71,0x25,0x77,0x5f,0x30,0x82,0xbb,0x47,0xe7,0x34,0xd7,0x0c,0x32,0xd7,0xd1,0x48,0x05,0x00,0x00,
+ 0x05,0x20,0x8c,0xec,0xcf,0x35,0x24,0x2f,0x66,0x82,0xda,0xbd,0x72,0xe5,0xb0,0xf1,0xb2,0x0b,0x9a,0x84,0x1b,0xaa,0x1d,0xb7,0xa4,0x2b,0xb0,0x0d,0x77,0x66,0x1d,0xce,0xdb,0xc2,0x00,0x00,
+ 0x05,0x20,0x96,0x93,0xa8,0xd7,0x43,0x12,0x32,0x6d,0xa0,0x2c,0x8d,0xb2,0x2a,0xc0,0x9d,0x11,0xa6,0x01,0x93,0x20,0xb3,0xac,0xdf,0xf9,0x7e,0x91,0x60,0x39,0xa8,0xad,0xce,0x52,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,0x8b,0x8c,0xe4,0x6d,0xc0,0x9e,0xf0,0xea,0xb2,0xe2,0x00,0x4f,0xda,0xc9,0x88,0x67,0x8b,0x4e,0x85,0xe2,0x31,0x81,0x81,0x0e,0x5a,0xab,0x9c,0x68,0x7e,0x0e,0xe6,0x00,0x00,
+ 0x05,0x20,0x91,0x0c,0xda,0xcd,0x49,0x84,0x0f,0x97,0x77,0x4d,0x4d,0xd8,0x0d,0xa4,0xc4,0x8d,0x82,0xb6,0xbe,0xb0,0x8b,0x92,0x9c,0x12,0x90,0x36,0x41,0x5f,0x8e,0xc9,0x5e,0x5c,0x00,0x00,
+ 0x05,0x20,0x91,0x1a,0x19,0x6a,0xa3,0xdb,0x12,0x69,0x17,0x4d,0xab,0xd2,0x26,0x93,0xdb,0x7e,0x44,0x57,0x2d,0xaa,0xd5,0x66,0x5d,0x26,0xe0,0xfb,0xee,0x41,0x50,0x8f,0x2a,0x53,0x00,0x00,
+ 0x05,0x20,0x91,0x94,0x32,0xe9,0xaa,0xf6,0xa4,0xbb,0xf8,0xd3,0x8b,0x63,0x72,0x39,0x0a,0x6b,0xc6,0x72,0xa5,0x39,0x6c,0x22,0x22,0x4c,0x6d,0xa6,0x93,0xd4,0x21,0x73,0xbf,0x84,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,0xcf,0xa2,0x5b,0x04,0x33,0x69,0x66,0xb0,0x72,0x27,0x54,0xbe,0xcd,0xd8,0x08,0xeb,0x95,0x55,0x5a,0xc2,0x79,0x91,0x3a,0xd9,0xf2,0x2c,0x73,0x9f,0x78,0x50,0xca,0x00,0x00,
+ 0x05,0x20,0x92,0x22,0x1f,0x8a,0x44,0x4c,0xd5,0xfb,0xda,0x3e,0x86,0x18,0x63,0x50,0x73,0x2c,0xfc,0x2b,0x0f,0xa3,0xe2,0x22,0xe4,0xf2,0xab,0x02,0x4e,0x84,0x3e,0x7a,0x3a,0x01,0x00,0x00,
+ 0x05,0x20,0x92,0x65,0xff,0x27,0xea,0x05,0x16,0xd7,0xad,0xfe,0xb2,0x65,0xd6,0xb9,0x52,0x38,0xdd,0x63,0x14,0x3f,0x17,0x9a,0xf6,0x32,0x6d,0x6c,0x10,0xc3,0x66,0xf7,0x89,0xf5,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,0x93,0x96,0x86,0xc8,0x64,0xb6,0x32,0x33,0x40,0x24,0xe5,0xe4,0xef,0x59,0x5d,0x47,0xa5,0x4e,0x18,0x56,0x04,0xbd,0x9b,0x8f,0x90,0xdb,0x99,0xc5,0xa6,0xa9,0xaf,0x34,0x00,0x00,
+ 0x05,0x20,0x93,0xda,0x29,0x12,0xda,0xc9,0xb0,0xd0,0x4f,0x15,0xaa,0xfa,0xc0,0xf2,0x74,0xc4,0x87,0xfd,0xba,0xec,0x06,0x66,0x14,0x59,0x2d,0x70,0x96,0x4c,0x5e,0x84,0xbe,0x29,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,0x96,0x01,0xec,0x0d,0x1c,0x47,0x87,0x25,0xe5,0x37,0x62,0xd7,0x43,0x4b,0xa6,0xc3,0xa4,0x6f,0xc5,0xf6,0xb1,0x4c,0x05,0xc7,0x27,0x1e,0xb9,0xf5,0x73,0x57,0x88,0x83,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,0x61,0x5b,0x17,0x98,0xbb,0x61,0x57,0xbe,0x35,0xf5,0x33,0x75,0x37,0xf5,0x75,0xc0,0x1d,0x23,0xb6,0x21,0x81,0xf5,0x37,0xbe,0x74,0x69,0xa4,0x7a,0xcf,0xcd,0x27,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,0xbc,0x8c,0x21,0xab,0xa0,0x66,0x6e,0x65,0xa7,0x9e,0x81,0xe3,0x5a,0xc2,0xc2,0x0b,0x34,0xba,0x54,0x87,0xee,0x1a,0x47,0x86,0x29,0x14,0xa3,0xdb,0x0c,0xbb,0x86,0x00,0x00,
+ 0x05,0x20,0x98,0xfc,0x41,0x3a,0x3f,0x83,0xce,0x68,0xd3,0xbe,0xbc,0xf5,0x81,0xa0,0xfe,0x57,0xa6,0x04,0xee,0x75,0x7f,0xff,0x93,0xa1,0x8e,0x4f,0x35,0x3d,0xad,0xdd,0xa7,0xda,0x00,0x00,
+ 0x05,0x20,0x99,0x18,0x50,0x29,0xbb,0x47,0xec,0x0d,0x0c,0x8a,0x12,0xc2,0x6e,0x7e,0x4c,0xc0,0x4b,0xdd,0x3b,0x6a,0xc5,0xb8,0x26,0xe2,0xc2,0x64,0x4f,0x18,0x6c,0x60,0x4b,0x6c,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,0x9a,0x4a,0x37,0xf9,0x84,0x5e,0xed,0x91,0xbe,0xea,0x38,0x70,0x78,0xb0,0xb1,0x38,0x3e,0x62,0x2a,0xbb,0x31,0x8e,0x05,0xb6,0xe4,0xcc,0x59,0x56,0x9f,0x1a,0x68,0xa2,0x00,0x00,
+ 0x05,0x20,0x9b,0x05,0xde,0x44,0xe9,0xf6,0x2e,0xd2,0x64,0x86,0xf4,0x5d,0x53,0x4d,0x58,0x1f,0xd5,0x65,0x91,0x0d,0x0f,0xc4,0x9e,0x62,0x63,0x04,0xec,0x71,0x91,0x7c,0xac,0xad,0x00,0x00,
+ 0x05,0x20,0x9b,0xf1,0x2f,0x96,0xdf,0xd8,0x58,0x65,0xb5,0x33,0x44,0xee,0x40,0xbe,0x26,0xbc,0xce,0x6f,0x12,0xdc,0x33,0x4e,0xfe,0xf2,0x82,0xd6,0xc4,0xd2,0x10,0xbf,0x92,0x35,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,0x9d,0x19,0x58,0x72,0xaf,0x06,0xbb,0x9e,0xe7,0x8f,0x3c,0x97,0xa7,0x0e,0x26,0x95,0xa6,0x5d,0xac,0xe0,0xc4,0x4b,0x38,0x48,0x67,0xa9,0x13,0x9c,0xbf,0xf8,0xd6,0x56,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,0xac,0x96,0x06,0xb1,0x11,0x54,0xbf,0xcb,0x67,0x3f,0x3f,0xb4,0xd9,0x97,0x1e,0x25,0xac,0xdd,0xda,0x76,0x56,0x54,0x56,0x49,0xa8,0x4f,0xa5,0x38,0x2b,0xdd,0x65,0x00,0x00,
+ 0x05,0x20,0x9d,0xff,0xd9,0xf4,0x45,0x78,0xbb,0x49,0x31,0x0f,0x20,0xd8,0xde,0xdb,0xf2,0xbb,0x58,0x47,0x15,0xcb,0xbe,0x15,0xb9,0x44,0x52,0x1f,0x31,0x47,0xa9,0x46,0x95,0x3b,0x00,0x00,
+ 0x05,0x20,0x9d,0xd9,0x15,0x05,0x09,0xa3,0x0d,0x71,0x9e,0x3b,0xe9,0x83,0x88,0x48,0x45,0x0f,0x01,0xbc,0x7d,0x61,0x8a,0xf4,0x30,0x69,0xb8,0x84,0x47,0x34,0x2e,0x0f,0x27,0x7c,0x00,0x00,
+ 0x05,0x20,0xa7,0x08,0xd8,0x1d,0x0b,0x07,0xde,0xab,0x06,0xd4,0xc1,0x42,0x51,0xef,0xd0,0x5a,0xc3,0x8a,0xff,0x1b,0x7f,0x1a,0x45,0xdc,0x8a,0x89,0x76,0x54,0x65,0xfc,0x3c,0xf2,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,0xa0,0x38,0x51,0x80,0x99,0xf9,0x0a,0xdf,0xf3,0x08,0xad,0x57,0x83,0x6a,0x0e,0x74,0x85,0x09,0x2a,0xa8,0xa3,0xab,0x83,0x22,0x89,0x31,0xf6,0x9c,0x37,0xcf,0x28,0x18,0x00,0x00,
+ 0x05,0x20,0xa0,0x8c,0x2d,0xb8,0x4f,0x88,0x90,0x4c,0x25,0x3b,0x52,0x57,0x89,0x03,0xb8,0xd6,0x32,0x52,0x2a,0xb3,0x7b,0x08,0x6e,0x7a,0x7c,0x3c,0xeb,0x54,0x00,0x93,0xe9,0x2b,0x00,0x00,
+ 0x05,0x20,0xa0,0xb3,0x9d,0x6b,0x08,0x16,0x69,0x81,0xb5,0xd0,0x18,0xe3,0x80,0x23,0xdd,0xef,0x3e,0x05,0xf1,0x42,0xd6,0xc9,0x5f,0xd3,0xc2,0x61,0x92,0x36,0xda,0xf0,0xb0,0x9a,0x00,0x00,
+ 0x05,0x20,0xa1,0x38,0x9e,0x1d,0x56,0xf0,0xf1,0xc0,0xc2,0xfd,0x5f,0x0d,0x69,0x75,0x43,0x91,0x21,0x37,0x6b,0x1e,0xc5,0xc2,0x01,0x9f,0x7a,0xc2,0x1f,0x61,0x62,0xd2,0x2f,0x1e,0x00,0x00,
+ 0x05,0x20,0xa1,0x0c,0xbe,0x81,0x1d,0xae,0x86,0x3c,0x94,0x90,0xf1,0x06,0x0f,0xab,0x74,0x5e,0xbb,0xc2,0x08,0x38,0x4a,0x7a,0xb8,0x2c,0x53,0xfb,0x65,0x15,0xa5,0x37,0x54,0x8e,0x00,0x00,
+ 0x05,0x20,0xa1,0x7d,0xa4,0xd4,0x3d,0xf1,0x98,0x7c,0x96,0xb8,0xe4,0x37,0x18,0xc5,0x0f,0xb6,0xcc,0x0d,0x19,0xe4,0xa4,0xdf,0xec,0xe1,0xeb,0x29,0x22,0x2e,0x52,0x9f,0x4e,0x90,0x00,0x00,
+ 0x05,0x20,0xa1,0xd4,0x58,0xba,0x50,0x16,0xa9,0x01,0x66,0xc2,0x54,0xc2,0x1f,0xd1,0xf2,0xe8,0x7b,0x3d,0x51,0xff,0xc1,0xd8,0x81,0x47,0x11,0xcc,0x14,0xd5,0x27,0x7b,0xe4,0x5b,0x00,0x00,
+ 0x05,0x20,0xa2,0x42,0xbf,0x4b,0x0f,0xe1,0xff,0x63,0x84,0xcc,0x81,0x43,0x23,0xad,0xbf,0xbd,0x59,0x24,0x3a,0x29,0x87,0x6e,0x9d,0x76,0xd5,0x5f,0xac,0xf1,0x61,0x81,0xb5,0x81,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,0xa2,0xec,0x7a,0xc1,0x85,0x22,0x3d,0x9a,0xdd,0xb4,0x92,0xfb,0x88,0x61,0x37,0x30,0x7c,0x2b,0xba,0xee,0x28,0x34,0x43,0x3f,0xa4,0x15,0x62,0xfe,0x9e,0xef,0x64,0x23,0x00,0x00,
+ 0x05,0x20,0xa3,0x16,0x15,0x59,0xec,0xdf,0x46,0xf7,0xfb,0xc6,0x35,0xe7,0xad,0xcc,0x79,0x94,0x0f,0xb9,0xe8,0x0d,0x10,0xf1,0x13,0x03,0xad,0xba,0x06,0xdd,0x2d,0xaa,0x19,0xaf,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,0xc5,0x61,0x3c,0xf4,0x7e,0xc8,0xe4,0x43,0x8e,0x80,0x90,0xd3,0x76,0x2f,0x5a,0x84,0xbf,0x71,0x64,0x33,0x6b,0xed,0xc6,0xf7,0x8e,0xab,0xaf,0x02,0x7e,0x46,0xcf,0x00,0x00,
+ 0x05,0x20,0xa4,0x0a,0xf8,0xf0,0x7c,0xa8,0x83,0x2f,0xb4,0x7d,0x5f,0x5d,0xc9,0x6d,0x99,0x5e,0xc6,0xf9,0x82,0x42,0x31,0x24,0x54,0x44,0xb4,0xa1,0xeb,0x40,0x0f,0x23,0x6e,0xbc,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,0x02,0xe4,0xfb,0x4a,0x64,0x75,0x02,0x6d,0xec,0x07,0xd6,0x44,0xf3,0x56,0x30,0xae,0xad,0x23,0xc9,0xcc,0xd0,0xc5,0x5b,0x83,0x20,0x7f,0x82,0xf7,0xae,0x67,0xc2,0x00,0x00,
+ 0x05,0x20,0xaf,0xde,0xd1,0x52,0x17,0x5b,0x8b,0x66,0x1e,0xe8,0xd4,0x48,0x10,0xde,0xa9,0x8e,0xc5,0x01,0x8f,0x24,0xb0,0x73,0x73,0x49,0x92,0xcf,0x7e,0x8e,0xc6,0x49,0xe6,0x48,0x00,0x00,
+ 0x05,0x20,0xa8,0x2a,0xf7,0x12,0xb3,0x77,0x3a,0x3a,0xf6,0x4f,0x1f,0x05,0x25,0x6e,0x93,0xd8,0x0a,0x4e,0x89,0x63,0x9e,0x6a,0xe1,0x12,0x88,0x45,0xf8,0x86,0x99,0x85,0x3d,0xd6,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,0xaa,0xb3,0xfd,0x21,0x0c,0x24,0xad,0xe5,0x2d,0xb4,0x8d,0x12,0x9c,0x3b,0x00,0x79,0xcd,0x72,0xa7,0xfc,0xb1,0xbe,0x74,0xd1,0x18,0x8e,0xd2,0x78,0x53,0xe5,0x76,0xe3,0x00,0x00,
+ 0x05,0x20,0xaa,0xde,0xa9,0xd2,0x09,0x53,0x97,0xdc,0x56,0xa9,0x4c,0xc0,0xc5,0x87,0xaa,0xec,0xf5,0x8b,0x46,0x52,0xc6,0x9a,0x8a,0x81,0xa2,0x6e,0xc9,0x1e,0x61,0x8d,0xc5,0xd1,0x00,0x00,
+ 0x05,0x20,0xab,0xb5,0xa7,0x6b,0x38,0xf1,0x83,0xc6,0xc9,0x82,0x99,0x08,0xb7,0xe1,0xc0,0xe2,0x8e,0x7d,0x9d,0xc6,0x71,0x36,0x99,0x19,0x12,0xf6,0x0c,0xbc,0x46,0x77,0xca,0xdd,0x00,0x00,
+ 0x05,0x20,0xac,0x3b,0x53,0xf3,0xa3,0x41,0xf3,0x4b,0xa8,0xd5,0xa7,0x56,0x4f,0x30,0x14,0xa8,0xd6,0xc5,0x6d,0xe9,0xc9,0x5c,0x16,0x8a,0xa0,0x22,0xe8,0xcb,0x17,0xbe,0x1f,0x2d,0x00,0x00,
+ 0x05,0x20,0xac,0x27,0xad,0x5f,0x8d,0x69,0x56,0xc0,0x99,0x13,0x49,0xc8,0xd2,0x80,0xd9,0x3a,0x99,0x02,0x28,0x29,0x72,0x19,0xea,0xdd,0x2c,0x06,0x04,0xee,0x12,0xc3,0x6d,0xe5,0x00,0x00,
+ 0x05,0x20,0xac,0x40,0xdd,0x3c,0x9a,0xf4,0x53,0x4d,0x05,0xcb,0xf0,0xd6,0xb8,0x9d,0x86,0x8d,0x07,0xe2,0x52,0x6c,0x3f,0x91,0xa1,0xba,0x6b,0xaf,0x0c,0xd5,0x6f,0x14,0x56,0xb1,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,0x22,0x4b,0x2e,0x78,0xc5,0x1d,0xf9,0x7a,0xf9,0x6a,0x7f,0x41,0xa6,0x6e,0x82,0xc4,0xcf,0x75,0x5f,0xc8,0x4b,0xa4,0x8d,0x34,0x0a,0xc4,0xc4,0x50,0x8e,0x08,0x29,0x00,0x00,
+ 0x05,0x20,0xae,0x6b,0x3e,0x0c,0x6a,0x76,0x7f,0x21,0x25,0x89,0xcd,0x38,0x3a,0x81,0xaa,0x8a,0xaf,0x7d,0x86,0x53,0x2c,0x93,0x44,0x08,0x9e,0xe7,0xbc,0x15,0x92,0x84,0x32,0x65,0x00,0x00,
+ 0x05,0x20,0xb6,0xbb,0x09,0xb6,0x9d,0xcb,0xbb,0x2e,0x10,0x59,0x72,0x10,0x3c,0x5d,0x38,0xbe,0x8d,0x6f,0x69,0xa8,0x98,0x08,0xad,0xd1,0xd3,0x00,0x2c,0x08,0xd4,0x69,0xdf,0x46,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,0xa9,0x1a,0x58,0x25,0x83,0x29,0x17,0x27,0x92,0xd2,0x9c,0xd0,0xfd,0x22,0x9c,0x07,0xf6,0x4f,0x9f,0xc4,0x2d,0x23,0x1b,0x1e,0xe9,0xc9,0xf2,0xd4,0xb1,0x91,0xac,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,0xb6,0xe3,0xd3,0xc6,0xb8,0x0e,0x9e,0xf4,0x5a,0x8b,0xb7,0x65,0xa8,0xf6,0xd6,0x45,0x7d,0x7e,0xde,0xa8,0x8b,0xcb,0x31,0xd0,0xd5,0x9d,0x41,0x19,0xa8,0x88,0x2c,0x83,0x00,0x00,
+ 0x05,0x20,0xb7,0x33,0x86,0x25,0x90,0xf9,0x6e,0xf2,0x0b,0x02,0xf0,0x76,0xf9,0x08,0x12,0x48,0x51,0xb5,0x27,0x86,0x31,0x68,0x20,0xfc,0xc7,0xe5,0x9c,0x4c,0x09,0xa9,0x95,0xd8,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,0x04,0xad,0x10,0xac,0x24,0x86,0x4b,0x10,0xa7,0x18,0xe8,0x1d,0xf5,0xcf,0x92,0xb3,0x6e,0xf6,0x67,0xa0,0x6b,0x01,0x24,0xa0,0x0b,0x59,0x40,0x1f,0x34,0x5c,0xbc,0x00,0x00,
+ 0x05,0x20,0xb1,0x63,0x56,0x80,0x90,0x00,0xfd,0x92,0x54,0xab,0xc3,0x09,0xef,0x37,0x6f,0xff,0xc3,0xc0,0x5f,0x0c,0x6a,0x37,0xb2,0xd3,0x9a,0x09,0xe4,0x02,0x23,0xc2,0x64,0x5e,0x00,0x00,
+ 0x05,0x20,0xb2,0xf7,0xeb,0x70,0x68,0x10,0x1d,0x50,0x2e,0xbe,0xb7,0x2a,0x84,0xb7,0x69,0xb5,0xa5,0xeb,0x52,0x3b,0xed,0x5a,0xb3,0xa0,0x7d,0x8f,0xfc,0x70,0x2f,0x4e,0xa7,0x71,0x00,0x00,
+ 0x05,0x20,0xb3,0x85,0xed,0x8a,0x80,0xb5,0x2f,0xbd,0xe4,0xda,0x13,0xba,0x54,0x0e,0x76,0xd8,0x16,0x58,0x14,0x5b,0x63,0xab,0xb0,0xa5,0x5e,0xea,0x1f,0xc3,0x13,0x83,0xcf,0x09,0x00,0x00,
+ 0x05,0x20,0xb3,0xc1,0x4d,0xdc,0xcf,0x54,0x7f,0xa8,0xeb,0x12,0x08,0x1a,0x72,0x4f,0xff,0xb9,0xe6,0x0b,0x33,0xac,0x8b,0x3c,0x0f,0x32,0xa9,0x6d,0x78,0xe8,0x71,0x58,0x7d,0xea,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,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,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,0xb5,0xad,0x1b,0xfc,0xbb,0xa4,0x59,0xc3,0x68,0x3d,0xae,0xe3,0x31,0x5c,0x48,0x48,0xc8,0x54,0xa2,0x24,0xc4,0x30,0x25,0xf8,0x62,0x76,0x00,0xff,0x54,0x15,0xd4,0xa0,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,0x16,0xe1,0x81,0x6b,0x5f,0x82,0x3d,0xaf,0x75,0x49,0x41,0x95,0xd5,0x93,0x96,0x18,0x66,0xf4,0x2e,0x50,0xed,0x81,0xb0,0x39,0x7f,0x5a,0x2b,0x5b,0x7d,0x4b,0xe4,0x00,0x00,
+ 0x05,0x20,0xbe,0xd8,0x00,0xb0,0xd7,0xde,0x8e,0xb4,0x86,0xfc,0xf5,0xe0,0x97,0x04,0xfe,0x5e,0xe7,0x58,0xc5,0x03,0x6d,0xcd,0x15,0x83,0x90,0xfc,0xb4,0x13,0x29,0x5e,0xd8,0x20,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,0x5a,0xbd,0x49,0x91,0xff,0xfe,0x18,0x28,0xab,0xb0,0x73,0x29,0xd2,0xcc,0x5d,0x69,0xf2,0x55,0x77,0x5f,0x18,0x4d,0xe1,0xaf,0x38,0xa5,0xb2,0x7f,0x51,0x59,0xba,0x00,0x00,
+ 0x05,0x20,0xb9,0x79,0x74,0x9d,0x11,0xc6,0xef,0xdf,0x9a,0x5f,0xdd,0xce,0x22,0xca,0xd4,0x59,0x8d,0x90,0x64,0xae,0xa4,0xb2,0xa0,0x9b,0xb4,0x77,0xdc,0x05,0x0b,0xe2,0xa6,0xdd,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,0xf2,0xeb,0x82,0x4a,0x04,0x4f,0x4e,0xde,0x40,0xf4,0x81,0x3f,0xa8,0x37,0x78,0x89,0xe9,0xae,0xa2,0xd5,0x8b,0x0f,0x21,0x83,0x61,0x60,0x6b,0x04,0x38,0x86,0x1f,0x00,0x00,
+ 0x05,0x20,0xba,0x67,0x18,0xbc,0x23,0x77,0x47,0x58,0x27,0x32,0x8f,0xc6,0x77,0x61,0x2e,0x14,0x62,0xb4,0x95,0x54,0x9b,0xb1,0x16,0x0b,0x00,0x49,0x72,0x17,0xbb,0x2b,0xc4,0xe4,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,0x51,0x5c,0xfe,0xde,0xc1,0xd2,0x7a,0xc6,0xb8,0x9d,0x1e,0x5e,0x0f,0xe4,0x1e,0x06,0xd2,0xd7,0x2c,0x2b,0xe1,0x5f,0x34,0x67,0xb9,0x44,0xf5,0x0b,0x3c,0xf6,0x04,0x00,0x00,
+ 0x05,0x20,0xbb,0x8a,0x02,0x1e,0x26,0xdb,0xe6,0x9c,0x0c,0xc6,0x5e,0x32,0xab,0x6f,0xc2,0xba,0x3c,0x23,0x38,0xca,0x1c,0xff,0x81,0x71,0x6c,0x0b,0x4d,0xea,0xbd,0xae,0x21,0xaf,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,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,0x47,0x03,0x4e,0x69,0x75,0x76,0x9c,0x99,0x8a,0x26,0xdd,0x67,0x17,0x98,0xf6,0xd3,0x64,0x4e,0xf3,0x0d,0xca,0xb9,0x3e,0xef,0xf9,0xa0,0x5e,0x4f,0x55,0x70,0x6b,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,0xbe,0x55,0x60,0xbe,0xea,0x46,0xdf,0x19,0x45,0x98,0x5c,0x53,0x9c,0x1b,0xb9,0xd8,0x14,0x99,0xd6,0xdc,0x45,0x3b,0x93,0x92,0xac,0xcf,0x40,0x41,0x98,0x3a,0x6b,0x7b,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,0xc4,0x03,0x80,0x5b,0xb6,0x0f,0xe5,0x5e,0x81,0xb2,0x15,0x88,0xb8,0x24,0xe7,0x82,0xce,0x9c,0xe4,0xe3,0xab,0x76,0xf0,0x97,0xf6,0x4b,0xa7,0x25,0x4a,0x05,0xa3,0x00,0x00,
+ 0x05,0x20,0xc7,0xca,0xb2,0xa9,0x11,0x63,0x43,0x9c,0xd6,0xc9,0xc1,0x78,0xbe,0xbc,0xc4,0x86,0x52,0x6b,0xc7,0x67,0xd0,0xe5,0xed,0xac,0x5f,0x52,0xef,0xc0,0xe1,0x0d,0x23,0xad,0x00,0x00,
+ 0x05,0x20,0xc0,0x46,0x77,0xc8,0xcc,0x9d,0xb8,0x42,0x5a,0x24,0x77,0xd5,0x2b,0x09,0x66,0x25,0xc7,0x99,0xe5,0x5b,0xd0,0x3b,0x7e,0x3c,0x31,0xed,0xa5,0xe6,0xb3,0x9a,0x33,0xdd,0x00,0x00,
+ 0x05,0x20,0xc0,0x9b,0x34,0x23,0x0f,0x5a,0xc2,0xec,0x3f,0x68,0x52,0xfc,0xd4,0xa7,0x1c,0xf9,0xae,0xa2,0xe0,0x55,0xb0,0xaa,0xc0,0xe1,0x0a,0x91,0xda,0x9b,0xed,0x7a,0x0d,0x6a,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,0x74,0xdc,0x68,0x6e,0xce,0xa0,0x88,0x9a,0xcb,0xc8,0xbc,0x62,0x05,0x5e,0x22,0x0b,0x0a,0xe4,0x8e,0xc8,0x89,0x28,0x91,0x84,0xfd,0x3f,0xea,0x30,0xac,0xa8,0x38,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,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,0xf5,0x8d,0xc3,0x8a,0xf6,0xc7,0xc0,0x7e,0x75,0x82,0x58,0x19,0xc3,0x54,0xc6,0x59,0x14,0xc0,0xcd,0x3a,0xfb,0x70,0x4c,0x40,0x62,0x48,0xdf,0x14,0x00,0xbc,0x5d,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,0xee,0x88,0x4c,0x60,0xec,0x36,0x87,0x2d,0x18,0x29,0x78,0x29,0x5b,0x2b,0xc7,0x03,0x50,0x80,0x00,0x0b,0xd0,0x2f,0x08,0xf1,0x12,0xec,0x95,0x4f,0x7b,0x98,0xc1,0x00,0x00,
+ 0x05,0x20,0xc3,0x86,0xde,0xea,0x07,0xb7,0x2b,0xd0,0x38,0x0e,0x81,0x65,0x46,0xd4,0xa4,0x10,0x42,0xbf,0x0b,0x0a,0xea,0x78,0x08,0x69,0xe5,0x67,0x1d,0x3a,0x7b,0x70,0x5b,0xfc,0x00,0x00,
+ 0x05,0x20,0xc3,0x9e,0x7a,0x68,0xb9,0x2d,0x97,0x2f,0x0d,0x8f,0x69,0xf1,0xb3,0xe5,0xe5,0x21,0x73,0xb9,0x51,0xb4,0xf6,0xc3,0x3e,0xb9,0x1b,0xcd,0xfd,0x6c,0x14,0xe4,0x03,0xa9,0x00,0x00,
+ 0x05,0x20,0xc3,0xa4,0xd4,0xcb,0xa7,0x43,0x66,0xa0,0xa6,0x36,0xc4,0x6a,0x19,0x79,0x98,0x16,0xb2,0x3f,0x99,0xe5,0x94,0x4d,0xf9,0xfc,0x2f,0x8b,0x67,0x6c,0x21,0x70,0x69,0x5b,0x00,0x00,
+ 0x05,0x20,0xc3,0xc7,0x1a,0x37,0xf6,0xb8,0x76,0x03,0xf6,0x2f,0xf8,0xb0,0x26,0xa3,0x26,0xf1,0xda,0xa1,0xd1,0x0e,0x80,0x05,0xf7,0xff,0xab,0x52,0xe5,0x3a,0x0b,0x2e,0x42,0x53,0x00,0x00,
+ 0x05,0x20,0xc3,0xce,0xcc,0x7a,0xdb,0x66,0x31,0x8d,0x81,0x9d,0x05,0x86,0xa9,0x17,0x07,0x0b,0x18,0xb2,0x41,0x81,0x5c,0x69,0xb7,0x95,0xc0,0x49,0xd2,0x34,0x2d,0x53,0xb0,0xc4,0x00,0x00,
+ 0x05,0x20,0xc5,0x95,0x18,0x87,0x19,0xb1,0x85,0xd0,0xe9,0x74,0x0f,0x11,0xdc,0xf5,0x16,0x99,0x06,0x5c,0xe8,0x38,0x31,0xcf,0xfe,0xee,0xb9,0x5c,0x78,0xbb,0xc9,0x56,0x8c,0x9b,0x00,0x00,
+ 0x05,0x20,0xc5,0xfc,0x63,0xc0,0xe9,0xf8,0xbb,0x0d,0x8c,0xac,0xb4,0xd8,0xf3,0x73,0xc3,0x85,0x10,0x24,0x18,0x06,0x6d,0x8f,0x6f,0x02,0xdb,0x35,0x32,0x83,0x73,0x11,0x1d,0xa6,0x00,0x00,
+ 0x05,0x20,0xce,0x93,0x84,0x27,0x52,0x78,0xc5,0x64,0xc2,0x05,0xcf,0xa6,0x77,0x83,0x80,0xf0,0x5f,0xc5,0xe0,0xda,0x48,0x41,0x05,0x35,0x08,0xc6,0x07,0xc3,0xb8,0x41,0x5d,0x8d,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,0x8d,0xe5,0xb2,0xd4,0x3b,0x56,0x34,0x03,0x38,0x2f,0xf5,0x95,0xca,0xb3,0xb0,0x60,0xbe,0xb0,0xb5,0x7b,0x30,0x04,0x3e,0x95,0x49,0x6c,0xd0,0xfa,0x4b,0x22,0xfc,0x00,0x00,
+ 0x05,0x20,0xcf,0x8c,0x5f,0xd3,0xdf,0xf2,0x84,0x14,0x88,0xbb,0xbe,0x07,0x29,0x24,0x17,0x27,0xff,0x50,0x4e,0x11,0xfa,0xe3,0xcd,0xf7,0xd4,0x91,0x87,0x59,0x50,0xfd,0xe2,0x5e,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,0xc9,0xf7,0xca,0x27,0x62,0xb6,0x23,0xfc,0xcb,0x54,0x17,0x00,0x4c,0x44,0xe5,0x29,0xa8,0xcb,0x8f,0xb4,0xcb,0xca,0xf0,0xb0,0x34,0xc1,0x27,0x05,0x0f,0x77,0xc7,0x10,0x00,0x00,
+ 0x05,0x20,0xcb,0x67,0xe6,0x0e,0xac,0x94,0xee,0x21,0x82,0x04,0x45,0x1d,0xef,0xab,0x54,0x37,0x09,0xcd,0x68,0xc9,0x2c,0xe2,0xd6,0x7d,0xd5,0xd2,0x32,0x02,0x50,0xff,0xd8,0xfb,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,0x7f,0xce,0x2f,0x37,0xa6,0x97,0x5c,0xb4,0x54,0x10,0xac,0x17,0x69,0xfd,0x8b,0xdc,0x29,0x20,0x6e,0x89,0xfa,0xda,0x1b,0x48,0x9e,0xb0,0x59,0x3d,0xe1,0x12,0x64,0x00,0x00,
+ 0x05,0x20,0xcc,0xd8,0x73,0xec,0xfc,0xf5,0x2b,0x61,0xf5,0xec,0xa0,0x29,0x94,0x9c,0x52,0xc0,0x5d,0xe9,0xc0,0xd7,0xe8,0x38,0xf6,0x1d,0xee,0x5d,0xa7,0x7c,0x11,0x14,0x1f,0xae,0x00,0x00,
+ 0x05,0x20,0xcd,0xe3,0xa9,0x59,0x8a,0xdf,0xdb,0x76,0x88,0x6a,0xc9,0xf6,0x0c,0x33,0xc1,0x51,0x37,0x66,0xa8,0xbe,0xf6,0x4a,0x5a,0xf9,0x5c,0xb2,0x2a,0x22,0x7a,0x4c,0x0c,0x49,0x00,0x00,
+ 0x05,0x20,0xce,0x11,0x15,0xb3,0x32,0x69,0xd5,0x83,0x86,0x5a,0x5e,0x01,0xd6,0x34,0x35,0xc8,0x6a,0xdb,0xea,0x70,0x83,0x58,0xf5,0xaa,0x40,0xd1,0x0f,0x2f,0xcb,0x98,0xb8,0xa5,0x00,0x00,
+ 0x01,0x04,0x02,0x27,0xa3,0xbf,0x20,0x8d,
+ 0x01,0x04,0x02,0x53,0xf8,0x4d,0x20,0x8d,
+ 0x01,0x04,0x02,0x57,0x48,0xeb,0x20,0x8d,
+ 0x01,0x04,0x03,0x09,0xbc,0x2c,0x20,0x8d,
+ 0x01,0x04,0x03,0x4c,0x8f,0xb9,0x20,0x8d,
+ 0x01,0x04,0x03,0xe7,0x9a,0xc3,0x20,0x8d,
0x01,0x04,0x05,0x02,0x17,0xe2,0x20,0x8d,
+ 0x01,0x04,0x05,0x2d,0x48,0x0b,0x20,0x8d,
+ 0x01,0x04,0x05,0x4e,0x47,0xad,0x20,0x8d,
+ 0x01,0x04,0x05,0x4e,0x74,0x7f,0x20,0x8d,
0x01,0x04,0x05,0x80,0x57,0x7e,0x20,0x8d,
- 0x01,0x04,0x05,0x9d,0x67,0xca,0x20,0x8d,
+ 0x01,0x04,0x05,0x90,0x58,0x53,0x20,0x8d,
+ 0x01,0x04,0x05,0xac,0x84,0x68,0x20,0x8d,
+ 0x01,0x04,0x05,0xba,0x3c,0x0d,0x20,0x8d,
0x01,0x04,0x05,0xbc,0x3e,0x12,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,0x05,0xff,0x61,0x5c,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,0x12,0x1b,0x4f,0x11,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,0x0e,0xcb,0x39,0x32,0x20,0x8d,
+ 0x01,0x04,0x0f,0xeb,0x52,0xb2,0x20,0x8d,
+ 0x01,0x04,0x12,0xb7,0x57,0xf0,0x20,0x8d,
+ 0x01,0x04,0x14,0x59,0xf3,0x8b,0x20,0x8d,
+ 0x01,0x04,0x17,0x86,0x5e,0x52,0x20,0x8d,
+ 0x01,0x04,0x17,0x8e,0x91,0xee,0x20,0x8d,
0x01,0x04,0x17,0xaf,0x00,0xde,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,0x18,0x06,0x59,0x9b,0x20,0x8d,
+ 0x01,0x04,0x18,0x24,0x60,0x0e,0x20,0x8d,
+ 0x01,0x04,0x18,0x4c,0xc7,0x56,0x20,0x8d,
+ 0x01,0x04,0x18,0x74,0xa3,0xe3,0x20,0x8d,
+ 0x01,0x04,0x18,0x77,0x29,0xea,0x20,0x8d,
+ 0x01,0x04,0x18,0x92,0x21,0x0d,0x20,0x8d,
+ 0x01,0x04,0x18,0x94,0x34,0x6c,0x20,0x8d,
+ 0x01,0x04,0x18,0x9c,0x2a,0x9a,0x20,0x8d,
0x01,0x04,0x1b,0x94,0xce,0x8c,0x20,0x8d,
- 0x01,0x04,0x1f,0x19,0x62,0x10,0x20,0x8d,
- 0x01,0x04,0x1f,0x29,0x17,0xf9,0x20,0x8d,
- 0x01,0x04,0x1f,0x2f,0xca,0x70,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,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,0x1f,0x13,0xcd,0x13,0x20,0x8d,
+ 0x01,0x04,0x1f,0x1e,0x3b,0xc9,0x20,0x8d,
+ 0x01,0x04,0x1f,0xbd,0x18,0xbc,0x20,0x8d,
+ 0x01,0x04,0x23,0xaa,0x4d,0xce,0x20,0x8d,
+ 0x01,0x04,0x23,0xd0,0x3e,0x82,0x20,0x8d,
+ 0x01,0x04,0x23,0xd5,0x9f,0xa8,0x20,0x8d,
+ 0x01,0x04,0x23,0xe4,0xd2,0xc1,0x20,0x8d,
+ 0x01,0x04,0x23,0xf4,0x09,0xb6,0x20,0x8d,
+ 0x01,0x04,0x25,0x3c,0xf6,0x52,0x20,0x8d,
0x01,0x04,0x25,0x9d,0xc0,0x5e,0x20,0x8d,
- 0x01,0x04,0x25,0xdc,0x87,0x97,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,0x5b,0x6a,0x6f,0x20,0x8d,
+ 0x01,0x04,0x25,0xdd,0xc5,0xd0,0x20,0x8d,
+ 0x01,0x04,0x26,0x26,0xc0,0xf8,0x20,0x8d,
+ 0x01,0x04,0x26,0x28,0x6e,0x42,0x20,0x8d,
+ 0x01,0x04,0x26,0x4b,0xd7,0xfa,0x20,0x8d,
+ 0x01,0x04,0x26,0x4b,0xeb,0x61,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,0x26,0x6f,0x72,0x9b,0x20,0x8d,
+ 0x01,0x04,0x26,0xfe,0x8c,0x28,0x20,0x8d,
+ 0x01,0x04,0x28,0xa0,0x0d,0x07,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,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,0x33,0x9a,0x3e,0x67,0x20,0x8d,
- 0x01,0x04,0x33,0x9e,0x96,0x9b,0x20,0x8d,
+ 0x01,0x04,0x2b,0xc6,0x9f,0x11,0x20,0x8d,
+ 0x01,0x04,0x2b,0xe1,0x8f,0x11,0x20,0x8d,
+ 0x01,0x04,0x2d,0x2d,0x1b,0xe9,0x20,0x8d,
+ 0x01,0x04,0x2d,0x58,0x6a,0x6b,0x20,0x8d,
+ 0x01,0x04,0x2d,0x81,0x54,0x88,0x20,0x8d,
+ 0x01,0x04,0x2d,0x81,0xb5,0x6b,0x20,0x8d,
+ 0x01,0x04,0x2d,0x82,0x14,0xb1,0x20,0x8d,
+ 0x01,0x04,0x2d,0x8e,0xeb,0x2e,0x20,0x8d,
+ 0x01,0x04,0x2d,0x96,0x42,0x0a,0x20,0x8d,
+ 0x01,0x04,0x2d,0xcf,0x2b,0x6e,0x20,0x8d,
+ 0x01,0x04,0x2e,0x0a,0xd3,0x8f,0x20,0x8d,
+ 0x01,0x04,0x2e,0x17,0x57,0xda,0x20,0x8d,
+ 0x01,0x04,0x2e,0x1c,0xcd,0x44,0x20,0x8d,
+ 0x01,0x04,0x2e,0x20,0xb2,0x52,0x20,0x8d,
+ 0x01,0x04,0x2e,0x27,0xa7,0x31,0x20,0x8d,
+ 0x01,0x04,0x2e,0x3b,0x28,0x5b,0x20,0x8d,
+ 0x01,0x04,0x2e,0x94,0xeb,0x24,0x20,0x8d,
+ 0x01,0x04,0x2e,0x96,0xa1,0x2b,0x20,0x8d,
+ 0x01,0x04,0x2e,0xaf,0xb2,0x03,0x20,0x8d,
+ 0x01,0x04,0x2e,0xe5,0xee,0xbb,0x20,0x8d,
+ 0x01,0x04,0x2f,0x0c,0xe4,0x7a,0x20,0x8d,
+ 0x01,0x04,0x2f,0xb8,0x9f,0xec,0x20,0x8d,
+ 0x01,0x04,0x2f,0xfe,0xb2,0x2c,0x20,0x8d,
+ 0x01,0x04,0x32,0x04,0x12,0x5a,0x20,0x8d,
+ 0x01,0x04,0x32,0x1e,0x24,0x8c,0x20,0x8d,
+ 0x01,0x04,0x32,0x2d,0x80,0x1c,0x20,0x8d,
+ 0x01,0x04,0x32,0x4f,0x56,0x71,0x20,0x8d,
+ 0x01,0x04,0x32,0x7e,0x60,0x16,0x20,0x8d,
+ 0x01,0x04,0x32,0x90,0x87,0x28,0x20,0x8d,
+ 0x01,0x04,0x33,0x9a,0x1a,0x0b,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,0x3e,0x18,0x4c,0x7a,0x20,0x8d,
- 0x01,0x04,0x3e,0x6a,0x46,0xf9,0x20,0x8d,
+ 0x01,0x04,0x33,0xc2,0x0d,0x19,0x20,0x8d,
+ 0x01,0x04,0x3a,0xe5,0x69,0x26,0x20,0x8d,
+ 0x01,0x04,0x3b,0xbc,0x6c,0x96,0x20,0x8d,
+ 0x01,0x04,0x3e,0x0c,0xa8,0x64,0x20,0x8d,
0x01,0x04,0x3e,0xa8,0x41,0x2a,0x20,0x8d,
- 0x01,0x04,0x3e,0xab,0x81,0x20,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,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,0x3e,0xb1,0x6f,0x4e,0x20,0x8d,
+ 0x01,0x04,0x3e,0xd2,0xcf,0x3f,0x20,0x8d,
+ 0x01,0x04,0x40,0x14,0x2d,0x2a,0x20,0x8d,
+ 0x01,0x04,0x40,0x1f,0x3d,0x96,0x20,0x8d,
+ 0x01,0x04,0x40,0x2a,0xb0,0xea,0x20,0x8d,
+ 0x01,0x04,0x40,0x2e,0x3a,0xac,0x20,0x8d,
+ 0x01,0x04,0x40,0x44,0xcb,0x0b,0x20,0x8d,
+ 0x01,0x04,0x40,0x9c,0xc0,0x3d,0x20,0x8d,
+ 0x01,0x04,0x40,0xb9,0xe1,0x1a,0x20,0x8d,
+ 0x01,0x04,0x40,0xbb,0xa8,0xc6,0x20,0x8d,
+ 0x01,0x04,0x40,0xfd,0x68,0x76,0x20,0x8d,
+ 0x01,0x04,0x42,0x12,0x0d,0xa2,0x20,0x8d,
+ 0x01,0x04,0x42,0x1d,0x81,0xe9,0x20,0x8d,
+ 0x01,0x04,0x42,0x23,0x54,0x1e,0x20,0x8d,
+ 0x01,0x04,0x42,0xc2,0x26,0x2d,0x20,0x8d,
+ 0x01,0x04,0x42,0xe4,0x1c,0x3f,0x20,0x8d,
+ 0x01,0x04,0x43,0x91,0xcc,0x12,0x20,0x8d,
+ 0x01,0x04,0x43,0xcd,0xbe,0x8f,0x20,0x8d,
0x01,0x04,0x43,0xd2,0xe4,0xcb,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,0x43,0xd9,0x3d,0xd5,0x20,0x8d,
+ 0x01,0x04,0x43,0xfb,0x87,0x11,0x20,0x8d,
+ 0x01,0x04,0x44,0x27,0xbe,0xb9,0x20,0x8d,
+ 0x01,0x04,0x44,0x4b,0xc3,0x02,0x20,0x8d,
+ 0x01,0x04,0x44,0x66,0x86,0xe3,0x20,0x8d,
+ 0x01,0x04,0x44,0xdb,0xf2,0x22,0x20,0x8d,
0x01,0x04,0x45,0x04,0x5e,0xe2,0x20,0x8d,
- 0x01,0x04,0x45,0x08,0xaf,0xc9,0x20,0x8d,
- 0x01,0x04,0x45,0x39,0xa0,0x31,0x20,0x8d,
- 0x01,0x04,0x45,0x70,0x67,0x7c,0x20,0x8d,
+ 0x01,0x04,0x45,0x8e,0x1c,0x36,0x20,0x8d,
+ 0x01,0x04,0x45,0x92,0x3e,0x01,0x20,0x8d,
+ 0x01,0x04,0x45,0xb0,0xbc,0xfb,0x20,0x8d,
+ 0x01,0x04,0x45,0xb4,0xaa,0xd7,0x20,0x8d,
+ 0x01,0x04,0x45,0xb5,0x40,0x57,0x20,0x8d,
0x01,0x04,0x45,0xc4,0x98,0x21,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,0x46,0x23,0x62,0x0c,0x20,0x8d,
+ 0x01,0x04,0x46,0x43,0x8b,0xcc,0x20,0x8d,
+ 0x01,0x04,0x46,0x79,0x32,0x93,0x20,0x8d,
+ 0x01,0x04,0x46,0xac,0x84,0x4e,0x20,0x8d,
+ 0x01,0x04,0x47,0xe0,0xc9,0xe0,0x20,0x8d,
+ 0x01,0x04,0x48,0x12,0x35,0xbd,0x20,0x8d,
+ 0x01,0x04,0x48,0x2e,0x83,0x12,0x20,0x8d,
+ 0x01,0x04,0x48,0x32,0xdc,0x05,0x20,0x8d,
+ 0x01,0x04,0x48,0x47,0xd1,0x60,0x20,0x8d,
+ 0x01,0x04,0x49,0x23,0xf6,0xaf,0x20,0x8d,
+ 0x01,0x04,0x49,0x62,0x6b,0x25,0x20,0x8d,
+ 0x01,0x04,0x49,0x62,0xb2,0xec,0x20,0x8d,
+ 0x01,0x04,0x49,0x75,0x84,0x8a,0x20,0x8d,
+ 0x01,0x04,0x49,0x83,0xd1,0x46,0x20,0x8d,
+ 0x01,0x04,0x49,0x9d,0x70,0xb2,0x20,0x8d,
+ 0x01,0x04,0x49,0xe4,0xad,0x15,0x20,0x8d,
+ 0x01,0x04,0x49,0xfd,0x37,0xd9,0x20,0x8d,
+ 0x01,0x04,0x4a,0x49,0xe5,0x94,0x20,0x8d,
+ 0x01,0x04,0x4a,0x70,0x73,0xc5,0x20,0x8d,
+ 0x01,0x04,0x4a,0x76,0x8a,0x7c,0x20,0x8d,
+ 0x01,0x04,0x4a,0x76,0x8f,0x08,0x20,0x8d,
+ 0x01,0x04,0x4a,0x85,0x5a,0xfb,0x20,0x8d,
+ 0x01,0x04,0x4a,0xd5,0xfb,0xe9,0x20,0x8d,
0x01,0x04,0x4a,0xdc,0xff,0xbe,0x20,0x8d,
- 0x01,0x04,0x4d,0x14,0x30,0x90,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,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,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,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,0x50,0xf4,0x1a,0xc0,0x20,0x8d,
- 0x01,0x04,0x51,0x04,0x6e,0xa8,0x20,0x8d,
+ 0x01,0x04,0x4c,0x71,0x78,0xf6,0x20,0x8d,
+ 0x01,0x04,0x4c,0x7f,0xd3,0x5a,0x20,0x8d,
+ 0x01,0x04,0x4c,0x9a,0xa2,0xb6,0x20,0x8d,
+ 0x01,0x04,0x4d,0x21,0x90,0x9c,0x20,0x8d,
+ 0x01,0x04,0x4d,0x26,0x03,0x5a,0x20,0x8d,
+ 0x01,0x04,0x4d,0x64,0x14,0xb2,0x20,0x8d,
+ 0x01,0x04,0x4d,0x6d,0x70,0xdf,0x20,0x8d,
+ 0x01,0x04,0x4d,0xa5,0xfa,0x3e,0x20,0x8d,
+ 0x01,0x04,0x4d,0xdf,0x78,0x8b,0x20,0x8d,
+ 0x01,0x04,0x4d,0xf0,0xbe,0x29,0x20,0x8d,
+ 0x01,0x04,0x4e,0x1e,0x39,0x4e,0x20,0x8d,
+ 0x01,0x04,0x4e,0x9d,0x5b,0x78,0x20,0x8d,
+ 0x01,0x04,0x4f,0x36,0xf0,0x7c,0x20,0x8d,
+ 0x01,0x04,0x4f,0x74,0x35,0x32,0x20,0x8d,
+ 0x01,0x04,0x4f,0x86,0x63,0x72,0x20,0x8d,
+ 0x01,0x04,0x4f,0x9c,0x8a,0x6b,0x20,0x8d,
+ 0x01,0x04,0x50,0x3c,0x78,0x77,0x20,0x8d,
+ 0x01,0x04,0x50,0x40,0xd3,0x66,0x20,0x8d,
+ 0x01,0x04,0x50,0x40,0xd3,0x67,0x20,0x8d,
+ 0x01,0x04,0x50,0x5a,0x04,0xb2,0x20,0x8d,
+ 0x01,0x04,0x50,0x6c,0xdb,0x99,0x20,0x8d,
+ 0x01,0x04,0x50,0xd1,0xe7,0x7e,0x20,0x8d,
+ 0x01,0x04,0x50,0xf1,0xc2,0x93,0x20,0x8d,
0x01,0x04,0x51,0x07,0x11,0xca,0x20,0x8d,
- 0x01,0x04,0x51,0x13,0x0a,0x02,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,0xf2,0xef,0x8b,0x20,0x8d,
+ 0x01,0x04,0x51,0xc5,0xb6,0xc3,0x20,0x8d,
+ 0x01,0x04,0x51,0xe5,0xea,0x57,0x20,0x8d,
+ 0x01,0x04,0x52,0x0a,0xfa,0x82,0x20,0x8d,
+ 0x01,0x04,0x52,0x40,0x31,0x1b,0x20,0x8d,
0x01,0x04,0x52,0x42,0x0a,0x0b,0x20,0x8d,
- 0x01,0x04,0x52,0x42,0xcc,0xb1,0x20,0x8d,
- 0x01,0x04,0x52,0x60,0x60,0x28,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,0x52,0x47,0x2f,0xd8,0x20,0x8d,
+ 0x01,0x04,0x52,0x49,0xbc,0xb2,0x20,0x8d,
+ 0x01,0x04,0x52,0x55,0x6e,0x14,0x20,0x8d,
+ 0x01,0x04,0x52,0x7c,0x21,0x77,0x20,0x8d,
+ 0x01,0x04,0x52,0xae,0x8e,0xca,0x20,0x8d,
+ 0x01,0x04,0x52,0xc3,0xed,0xfb,0x20,0x8d,
+ 0x01,0x04,0x52,0xda,0x22,0xa2,0x20,0x8d,
+ 0x01,0x04,0x53,0x31,0x0a,0xe3,0x20,0x8d,
+ 0x01,0x04,0x53,0x4e,0x70,0x8e,0x20,0x8d,
0x01,0x04,0x53,0x88,0xe8,0x15,0x20,0x8d,
- 0x01,0x04,0x53,0xc0,0xe2,0x42,0x20,0x8d,
+ 0x01,0x04,0x53,0x90,0xb4,0x58,0x20,0x8d,
+ 0x01,0x04,0x53,0x96,0x02,0x80,0x20,0x8d,
+ 0x01,0x04,0x53,0xa8,0x41,0xba,0x20,0x8d,
0x01,0x04,0x53,0xd0,0xc1,0xf2,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,0x53,0xda,0xa0,0xa1,0x20,0x8d,
+ 0x01,0x04,0x54,0x20,0xf8,0x3f,0x20,0x8d,
+ 0x01,0x04,0x54,0x4b,0x00,0xb2,0x20,0x8d,
0x01,0x04,0x54,0x71,0x81,0xc3,0x20,0x8d,
- 0x01,0x04,0x54,0xd3,0xbb,0xd3,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,0x56,0x16,0x14,0x0d,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,0x57,0x5a,0x5e,0x78,0x20,0x8d,
- 0x01,0x04,0x57,0x5c,0xab,0x35,0x20,0x8d,
+ 0x01,0x04,0x54,0xc3,0x74,0x1a,0x20,0x8d,
+ 0x01,0x04,0x54,0xf6,0xc8,0x7a,0x20,0x8d,
+ 0x01,0x04,0x54,0xff,0xee,0x78,0x20,0x8d,
+ 0x01,0x04,0x55,0x0e,0x4f,0x1a,0x20,0x8d,
+ 0x01,0x04,0x55,0x92,0x73,0x88,0x20,0x8d,
+ 0x01,0x04,0x55,0x9f,0xed,0x47,0x20,0x8d,
+ 0x01,0x04,0x55,0xc3,0x53,0x32,0x20,0x8d,
+ 0x01,0x04,0x55,0xd6,0xa1,0xfc,0x20,0x8d,
+ 0x01,0x04,0x55,0xd6,0xdf,0x24,0x20,0x8d,
+ 0x01,0x04,0x55,0xd7,0x4b,0xd2,0x20,0x8d,
+ 0x01,0x04,0x55,0xea,0x91,0x84,0x20,0x8d,
+ 0x01,0x04,0x55,0xf6,0x26,0x96,0x20,0x8d,
+ 0x01,0x04,0x55,0xfc,0xd8,0x92,0x20,0x8d,
+ 0x01,0x04,0x56,0x29,0x82,0x6c,0x20,0x8d,
+ 0x01,0x04,0x56,0x65,0x5c,0x5d,0x20,0x8d,
+ 0x01,0x04,0x56,0x68,0xe4,0x0c,0x20,0x8d,
+ 0x01,0x04,0x56,0x68,0xe4,0x24,0x20,0x8d,
+ 0x01,0x04,0x56,0x6d,0x0c,0x3c,0x20,0x8d,
+ 0x01,0x04,0x56,0x6f,0x30,0x47,0x20,0x8d,
+ 0x01,0x04,0x56,0x6f,0x30,0x48,0x20,0x8d,
+ 0x01,0x04,0x56,0x7c,0x91,0xb8,0x20,0x8d,
+ 0x01,0x04,0x56,0x85,0x85,0x52,0x20,0x8d,
+ 0x01,0x04,0x57,0x78,0x08,0xef,0x20,0x8d,
+ 0x01,0x04,0x57,0xb3,0x7a,0x81,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,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,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,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,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,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,0x2a,0x6e,0xdb,0x20,0x8d,
- 0x01,0x04,0x5c,0x2b,0xbb,0x22,0x20,0x8d,
+ 0x01,0x04,0x58,0x55,0x58,0x85,0x20,0x8d,
+ 0x01,0x04,0x58,0x58,0x3a,0xfb,0x20,0x8d,
+ 0x01,0x04,0x58,0x63,0x47,0xd5,0x20,0x8d,
+ 0x01,0x04,0x58,0x77,0x80,0x24,0x20,0x8d,
+ 0x01,0x04,0x58,0x86,0x29,0x58,0x20,0x8d,
+ 0x01,0x04,0x58,0xd2,0x0f,0x18,0x20,0x8d,
+ 0x01,0x04,0x58,0xd4,0x35,0xf6,0x20,0x8d,
+ 0x01,0x04,0x58,0xda,0xe2,0x5b,0x20,0x8d,
+ 0x01,0x04,0x59,0x01,0x68,0x61,0x20,0x8d,
+ 0x01,0x04,0x59,0x27,0x6a,0x1a,0x20,0x8d,
+ 0x01,0x04,0x59,0xb3,0xf0,0x85,0x20,0x8d,
+ 0x01,0x04,0x59,0xcf,0x83,0x13,0x20,0x8d,
+ 0x01,0x04,0x59,0xe9,0xcf,0x43,0x20,0x8d,
+ 0x01,0x04,0x5a,0x1a,0x52,0x2d,0x20,0x8d,
+ 0x01,0x04,0x5a,0xad,0x76,0x6d,0x20,0x8d,
+ 0x01,0x04,0x5a,0xfa,0x0a,0xa5,0x20,0x8d,
+ 0x01,0x04,0x5b,0x5a,0xa6,0xcb,0x20,0x8d,
+ 0x01,0x04,0x5b,0x5c,0x90,0xe2,0x20,0x8d,
+ 0x01,0x04,0x5b,0x5c,0x9a,0x12,0x20,0x8d,
+ 0x01,0x04,0x5b,0xca,0x04,0x41,0x20,0x8d,
+ 0x01,0x04,0x5b,0xe4,0x2d,0x82,0x20,0x8d,
+ 0x01,0x04,0x5b,0xef,0x82,0x3e,0x20,0x8d,
+ 0x01,0x04,0x5b,0xf0,0x54,0x34,0x20,0x8d,
+ 0x01,0x04,0x5c,0x2a,0x6e,0xd6,0x20,0x8d,
+ 0x01,0x04,0x5c,0x54,0xbc,0xce,0x20,0x8d,
+ 0x01,0x04,0x5c,0xcd,0xe8,0x2f,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,0x7b,0xb4,0xa4,0x20,0x8d,
+ 0x01,0x04,0x5c,0xf7,0x31,0xd2,0x20,0x8d,
+ 0x01,0x04,0x5d,0x10,0x2b,0xf1,0x20,0x8d,
+ 0x01,0x04,0x5d,0x26,0x7f,0xb3,0x20,0x8d,
+ 0x01,0x04,0x5d,0x73,0x1a,0x06,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,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,0x52,0x82,0xdf,0x20,0x8d,
- 0x01,0x04,0x5f,0x58,0x3d,0xb0,0x20,0x8d,
+ 0x01,0x04,0x5e,0x13,0x80,0xcc,0x20,0x8d,
+ 0x01,0x04,0x5e,0x83,0x00,0x49,0x20,0x8d,
+ 0x01,0x04,0x5e,0x88,0x02,0x7e,0x20,0x8d,
+ 0x01,0x04,0x5e,0x9c,0x80,0x99,0x20,0x8d,
+ 0x01,0x04,0x5e,0xcb,0x85,0xfb,0x20,0x8d,
+ 0x01,0x04,0x5e,0xd2,0x37,0x59,0x20,0x8d,
+ 0x01,0x04,0x5e,0xf1,0x5a,0xfb,0x20,0x8d,
0x01,0x04,0x5f,0x69,0xac,0xab,0x20,0x8d,
- 0x01,0x04,0x5f,0x6e,0xea,0x5d,0x20,0x8d,
- 0x01,0x04,0x5f,0xa4,0xb6,0x2c,0x20,0x8d,
- 0x01,0x04,0x5f,0xbf,0x82,0x64,0x20,0x8d,
- 0x01,0x04,0x60,0x03,0x35,0xfe,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,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,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,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,0xc4,0x7c,0xb6,0x20,0x8d,
- 0x01,0x04,0x6d,0xc9,0xa8,0x20,0x20,0x8d,
+ 0x01,0x04,0x5f,0xa9,0xc4,0xf7,0x20,0x8d,
+ 0x01,0x04,0x5f,0xd3,0x98,0x64,0x20,0x8d,
+ 0x01,0x04,0x5f,0xd5,0x91,0xda,0x20,0x8d,
+ 0x01,0x04,0x60,0x29,0x85,0x3a,0x20,0x8d,
+ 0x01,0x04,0x60,0x4a,0xb3,0x84,0x20,0x8d,
+ 0x01,0x04,0x61,0x71,0x8c,0xdf,0x20,0x8d,
+ 0x01,0x04,0x62,0x0d,0x4d,0x40,0x20,0x8d,
+ 0x01,0x04,0x62,0x9c,0x6c,0xd3,0x20,0x8d,
+ 0x01,0x04,0x63,0x5f,0x36,0x9f,0x20,0x8d,
+ 0x01,0x04,0x63,0xe5,0x6a,0xe1,0x20,0x8d,
+ 0x01,0x04,0x63,0xf0,0x62,0x24,0x20,0x8d,
+ 0x01,0x04,0x65,0x20,0x7f,0x8f,0x20,0x8d,
+ 0x01,0x04,0x65,0x64,0x8b,0xf9,0x20,0x8d,
+ 0x01,0x04,0x67,0x25,0xcd,0x2f,0x20,0x8d,
+ 0x01,0x04,0x67,0x2d,0xf7,0xca,0x20,0x8d,
+ 0x01,0x04,0x67,0x4c,0xcd,0xd5,0x20,0x8d,
+ 0x01,0x04,0x67,0x63,0xa9,0x6e,0x20,0x8d,
+ 0x01,0x04,0x67,0x65,0xcb,0x2c,0x20,0x8d,
+ 0x01,0x04,0x67,0xe7,0x2a,0x24,0x20,0x8d,
+ 0x01,0x04,0x67,0xe9,0x53,0x1c,0x20,0x8d,
+ 0x01,0x04,0x68,0x80,0x40,0x3a,0x20,0x8d,
+ 0x01,0x04,0x68,0x80,0xc9,0xb7,0x20,0x8d,
+ 0x01,0x04,0x68,0xac,0xeb,0xe3,0x20,0x8d,
+ 0x01,0x04,0x68,0xdb,0xd6,0xd3,0x20,0x8d,
+ 0x01,0x04,0x68,0xdd,0x22,0xe2,0x20,0x8d,
+ 0x01,0x04,0x68,0xe5,0x65,0x4e,0x20,0x8d,
+ 0x01,0x04,0x68,0xee,0xdc,0xc7,0x20,0x8d,
+ 0x01,0x04,0x6b,0x94,0x38,0x51,0x20,0x8d,
+ 0x01,0x04,0x6b,0x94,0x44,0xae,0x20,0x8d,
+ 0x01,0x04,0x6b,0x9b,0x43,0xd2,0x20,0x8d,
+ 0x01,0x04,0x6b,0xbf,0x21,0x52,0x20,0x8d,
+ 0x01,0x04,0x6c,0x1a,0x95,0xa1,0x20,0x8d,
+ 0x01,0x04,0x6c,0xe1,0xc3,0x35,0x20,0x8d,
+ 0x01,0x04,0x6d,0x96,0x81,0xe3,0x20,0x8d,
+ 0x01,0x04,0x6d,0xcf,0x4f,0xf8,0x20,0x8d,
0x01,0x04,0x6d,0xe0,0x54,0x95,0x20,0x8d,
- 0x01,0x04,0x6f,0x5a,0x8c,0x2e,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,0x6d,0xeb,0xf7,0x7a,0x20,0x8d,
+ 0x01,0x04,0x6f,0x5a,0x9e,0x7b,0x20,0x8d,
+ 0x01,0x04,0x6f,0x5a,0x9e,0x89,0x20,0x8d,
+ 0x01,0x04,0x73,0x8c,0x7c,0x63,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,0x75,0x30,0x85,0x43,0x20,0x8d,
+ 0x01,0x04,0x76,0x18,0x25,0xfd,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,0x6e,0x1c,0x20,0x8d,
- 0x01,0x04,0x7d,0xe3,0xb2,0x44,0x20,0x8d,
+ 0x01,0x04,0x79,0x62,0x16,0x93,0x20,0x8d,
+ 0x01,0x04,0x7a,0x28,0x19,0x39,0x20,0x8d,
+ 0x01,0x04,0x80,0x00,0x62,0xd6,0x20,0x8d,
0x01,0x04,0x80,0x00,0xbe,0x1a,0x20,0x8d,
- 0x01,0x04,0x81,0x0d,0xbd,0xd7,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,0x80,0x02,0x0c,0x26,0x20,0x8d,
+ 0x01,0x04,0x81,0x0a,0x55,0x67,0x20,0x8d,
+ 0x01,0x04,0x81,0x50,0xc0,0x14,0x20,0x8d,
+ 0x01,0x04,0x81,0x7e,0xac,0x73,0x20,0x8d,
+ 0x01,0x04,0x82,0xb4,0xd3,0x7b,0x20,0x8d,
+ 0x01,0x04,0x82,0xfa,0x07,0xfc,0x20,0x8d,
+ 0x01,0x04,0x83,0x99,0xcb,0xcd,0x20,0x8d,
+ 0x01,0x04,0x83,0x99,0xe8,0xc7,0x20,0x8d,
+ 0x01,0x04,0x83,0x99,0xee,0x79,0x20,0x8d,
+ 0x01,0x04,0x85,0x03,0xf9,0x9b,0x20,0x8d,
+ 0x01,0x04,0x85,0x05,0xa5,0xc7,0x20,0x8d,
+ 0x01,0x04,0x85,0x7d,0x32,0xb4,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,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,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,0x86,0xc3,0xc4,0x41,0x20,0x8d,
+ 0x01,0x04,0x88,0x31,0x1f,0x58,0x20,0x8d,
+ 0x01,0x04,0x88,0x3e,0x98,0xfb,0x20,0x8d,
+ 0x01,0x04,0x88,0xa9,0x34,0x8b,0x20,0x8d,
+ 0x01,0x04,0x8a,0x02,0x6e,0xd8,0x20,0x8d,
+ 0x01,0x04,0x8a,0x4b,0x83,0x30,0x20,0x8d,
+ 0x01,0x04,0x8c,0xba,0xc7,0x0e,0x20,0x8d,
+ 0x01,0x04,0x8d,0x00,0x9b,0x13,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,0x90,0x89,0x1d,0xb5,0x20,0x8d,
- 0x01,0x04,0x92,0x47,0x45,0x67,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,0x98,0xe6,0xb4,0x73,0x20,0x8d,
- 0x01,0x04,0x9a,0x1a,0x89,0x69,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,0xb3,0x93,0x9b,0x20,0x8d,
- 0x01,0x04,0xa9,0x96,0xce,0xce,0x20,0x8d,
- 0x01,0x04,0xaa,0x11,0x97,0xeb,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,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,0x8e,0xca,0x30,0x7c,0x20,0x8d,
+ 0x01,0x04,0x8f,0x00,0x8e,0x9c,0x20,0x8d,
+ 0x01,0x04,0x90,0x02,0x68,0x23,0x20,0x8d,
+ 0x01,0x04,0x90,0x02,0x68,0xbd,0x20,0x8d,
+ 0x01,0x04,0x90,0x7e,0x93,0xfc,0x20,0x8d,
+ 0x01,0x04,0x93,0x1c,0xd3,0x4b,0x20,0x8d,
+ 0x01,0x04,0x93,0x20,0x5f,0x3e,0x20,0x8d,
+ 0x01,0x04,0x95,0x07,0xd8,0xb2,0x20,0x8d,
+ 0x01,0x04,0x95,0x1c,0x74,0x22,0x20,0x8d,
+ 0x01,0x04,0x95,0x32,0x65,0x0f,0x20,0x8d,
+ 0x01,0x04,0x95,0x32,0x65,0x1c,0x20,0x8d,
+ 0x01,0x04,0x98,0x75,0x58,0x2b,0x20,0x8d,
+ 0x01,0x04,0x98,0xa5,0x26,0xa0,0x20,0x8d,
+ 0x01,0x04,0x99,0x5c,0x5d,0x72,0x20,0x8d,
+ 0x01,0x04,0x9a,0x07,0x01,0x72,0x20,0x8d,
+ 0x01,0x04,0x9a,0x1a,0x82,0x5f,0x20,0x8d,
+ 0x01,0x04,0x9a,0x1a,0x9a,0x49,0x20,0x8d,
+ 0x01,0x04,0x9a,0x26,0xa7,0x98,0x20,0x8d,
+ 0x01,0x04,0x9a,0x41,0x0e,0x13,0x20,0x8d,
+ 0x01,0x04,0x9b,0x04,0x8e,0x21,0x20,0x8d,
+ 0x01,0x04,0x9d,0x8f,0x15,0x66,0x20,0x8d,
+ 0x01,0x04,0x9d,0x93,0x83,0xfb,0x20,0x8d,
+ 0x01,0x04,0x9e,0xf8,0x22,0x8d,0x20,0x8d,
+ 0x01,0x04,0x9f,0x8a,0x57,0x12,0x20,0x8d,
+ 0x01,0x04,0x9f,0xc4,0xe3,0xc4,0x20,0x8d,
+ 0x01,0x04,0x9f,0xf6,0x19,0x35,0x20,0x8d,
+ 0x01,0x04,0xa0,0x10,0x6e,0x06,0x20,0x8d,
+ 0x01,0x04,0xa0,0x50,0x0c,0x10,0x20,0x8d,
+ 0x01,0x04,0xa0,0x50,0x61,0x42,0x20,0x8d,
+ 0x01,0x04,0xa1,0x61,0x97,0x09,0x20,0x8d,
+ 0x01,0x04,0xa2,0x00,0xe2,0x3c,0x20,0x8d,
+ 0x01,0x04,0xa2,0x37,0x7a,0x5d,0x20,0x8d,
+ 0x01,0x04,0xa2,0xdb,0x26,0x5e,0x20,0x8d,
+ 0x01,0x04,0xa2,0xf5,0xc4,0x2d,0x20,0x8d,
+ 0x01,0x04,0xa4,0x98,0xa7,0xd0,0x20,0x8d,
+ 0x01,0x04,0xa5,0x16,0xe5,0x58,0x20,0x8d,
+ 0x01,0x04,0xa6,0x46,0xd3,0x4e,0x20,0x8d,
+ 0x01,0x04,0xa6,0x4e,0xf1,0x14,0x20,0x8d,
+ 0x01,0x04,0xa6,0x4e,0xf1,0x19,0x20,0x8d,
+ 0x01,0x04,0xa7,0x58,0x0b,0xcb,0x20,0x8d,
+ 0x01,0x04,0xa7,0xf8,0xb9,0xc4,0x20,0x8d,
+ 0x01,0x04,0xa9,0x9b,0xaa,0xd3,0x20,0x8d,
+ 0x01,0x04,0xab,0x65,0x49,0x80,0x20,0x8d,
+ 0x01,0x04,0xac,0x51,0xb6,0xf0,0x20,0x8d,
+ 0x01,0x04,0xac,0x5c,0x1f,0x2d,0x20,0x8d,
+ 0x01,0x04,0xac,0x5d,0x6a,0x55,0x20,0x8d,
+ 0x01,0x04,0xac,0xe9,0xd3,0xab,0x20,0x8d,
+ 0x01,0x04,0xac,0xea,0x5f,0x23,0x20,0x8d,
+ 0x01,0x04,0xac,0xf1,0x46,0xec,0x20,0x8d,
+ 0x01,0x04,0xad,0x42,0xc5,0x13,0x20,0x8d,
+ 0x01,0x04,0xad,0x57,0xea,0xdc,0x20,0x8d,
0x01,0x04,0xad,0xb5,0x23,0x32,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,0x25,0x52,0x53,0x20,0x8d,
+ 0x01,0x04,0xad,0xb7,0x82,0x2f,0x20,0x8d,
+ 0x01,0x04,0xad,0xc5,0xf4,0x9d,0x20,0x8d,
+ 0x01,0x04,0xae,0x15,0x4c,0x08,0x20,0x8d,
+ 0x01,0x04,0xae,0x39,0x88,0x48,0x20,0x8d,
+ 0x01,0x04,0xae,0x3f,0xab,0x4c,0x20,0x8d,
+ 0x01,0x04,0xae,0x58,0xf3,0x5e,0x20,0x8d,
+ 0x01,0x04,0xaf,0x6e,0x73,0x78,0x20,0x8d,
0x01,0x04,0xb0,0x4a,0x88,0xed,0x20,0x8d,
+ 0x01,0x04,0xb0,0x63,0x02,0x5a,0x20,0x8d,
+ 0x01,0x04,0xb0,0x72,0xf8,0xe1,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,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,0xc6,0x17,0x78,0x20,0x8d,
- 0x01,0x04,0xb2,0xfa,0xe8,0x6f,0x20,0x8d,
- 0x01,0x04,0xb6,0xe5,0x91,0xa1,0x20,0x8d,
+ 0x01,0x04,0xb0,0x7e,0x74,0x07,0x20,0x8d,
+ 0x01,0x04,0xb0,0x88,0xf3,0x3f,0x20,0x8d,
+ 0x01,0x04,0xb0,0xcd,0x9e,0xc6,0x20,0x8d,
+ 0x01,0x04,0xb2,0x26,0x06,0x34,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,0xb8,0x38,0x7a,0x45,0x20,0x8d,
+ 0x01,0x04,0xb8,0x5f,0x20,0x82,0x20,0x8d,
+ 0x01,0x04,0xb8,0x69,0x83,0xb5,0x20,0x8d,
+ 0x01,0x04,0xb8,0xab,0xd0,0x6d,0x20,0x8d,
+ 0x01,0x04,0xb9,0x08,0x6a,0xb3,0x20,0x8d,
+ 0x01,0x04,0xb9,0x0b,0x3d,0x21,0x20,0x8d,
+ 0x01,0x04,0xb9,0x13,0x1e,0xf2,0x20,0x8d,
0x01,0x04,0xb9,0x1a,0x63,0xab,0x20,0x8d,
+ 0x01,0x04,0xb9,0x1f,0x88,0xa6,0x20,0x8d,
0x01,0x04,0xb9,0x1f,0x88,0xf6,0x20,0x8d,
- 0x01,0x04,0xb9,0x34,0x5d,0x2d,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,0x74,0x5e,0xef,0x20,0x8d,
- 0x01,0x04,0xb9,0x8c,0xd1,0x9f,0x20,0x8d,
+ 0x01,0x04,0xb9,0x3f,0x61,0xd8,0x20,0x8d,
+ 0x01,0x04,0xb9,0x40,0x7d,0x10,0x20,0x8d,
+ 0x01,0x04,0xb9,0x41,0x5d,0x68,0x20,0x8d,
+ 0x01,0x04,0xb9,0x44,0x43,0x2a,0x20,0x8d,
+ 0x01,0x04,0xb9,0x46,0x2b,0xc1,0x20,0x8d,
+ 0x01,0x04,0xb9,0x4e,0xd1,0x1c,0x20,0x8d,
+ 0x01,0x04,0xb9,0x58,0xe5,0xfe,0x20,0x8d,
+ 0x01,0x04,0xb9,0x70,0x90,0x77,0x20,0x8d,
+ 0x01,0x04,0xb9,0x89,0xad,0x7d,0x20,0x8d,
+ 0x01,0x04,0xb9,0x8c,0xf6,0x8c,0x20,0x8d,
+ 0x01,0x04,0xb9,0x90,0x53,0x83,0x20,0x8d,
0x01,0x04,0xb9,0x94,0x03,0xe3,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,0xbe,0x18,0x48,0x20,0x8d,
- 0x01,0x04,0xb9,0xc7,0xd1,0x34,0x20,0x8d,
- 0x01,0x04,0xb9,0xcb,0x29,0x94,0x20,0x8d,
+ 0x01,0x04,0xb9,0x96,0xa2,0x6f,0x20,0x8d,
+ 0x01,0x04,0xb9,0x9c,0xca,0x23,0x20,0x8d,
+ 0x01,0x04,0xb9,0xa3,0x2c,0x24,0x20,0x8d,
+ 0x01,0x04,0xb9,0xc5,0x1e,0x42,0x20,0x8d,
+ 0x01,0x04,0xb9,0xc5,0xa0,0x3d,0x20,0x8d,
0x01,0x04,0xb9,0xd1,0x0c,0x4c,0x20,0x8d,
- 0x01,0x04,0xb9,0xd2,0x7d,0x21,0x20,0x8d,
- 0x01,0x04,0xb9,0xe9,0xbd,0xd2,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,0x77,0x43,0x89,0x20,0x8d,
- 0x01,0x04,0xbc,0x7f,0xf3,0x29,0x20,0x8d,
+ 0x01,0x04,0xb9,0xef,0xdd,0x17,0x20,0x8d,
+ 0x01,0x04,0xb9,0xf3,0xda,0x13,0x20,0x8d,
+ 0x01,0x04,0xb9,0xf3,0xda,0x6a,0x20,0x8d,
+ 0x01,0x04,0xb9,0xf8,0xa0,0xa3,0x20,0x8d,
+ 0x01,0x04,0xbc,0x0c,0x95,0xd8,0x20,0x8d,
+ 0x01,0x04,0xbc,0x3f,0x9e,0xc0,0x20,0x8d,
+ 0x01,0x04,0xbc,0x8a,0x58,0x2f,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,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,0xbc,0xd5,0x5c,0x27,0x20,0x8d,
+ 0x01,0x04,0xbc,0xf3,0x47,0x91,0x20,0x8d,
+ 0x01,0x04,0xbd,0x20,0x88,0x09,0x20,0x8d,
+ 0x01,0x04,0xbe,0x35,0x64,0x22,0x20,0x8d,
+ 0x01,0x04,0xbe,0x40,0x86,0x34,0x20,0x8d,
+ 0x01,0x04,0xbf,0x0d,0x80,0x3a,0x20,0x8d,
+ 0x01,0x04,0xbf,0xfb,0x20,0xa2,0x20,0x8d,
+ 0x01,0x04,0xbf,0xff,0xdd,0x25,0x20,0x8d,
+ 0x01,0x04,0xc0,0x03,0x0b,0x14,0x20,0x8d,
+ 0x01,0x04,0xc0,0x03,0x0b,0x1a,0x20,0x8d,
+ 0x01,0x04,0xc0,0x22,0x57,0x56,0x20,0x8d,
+ 0x01,0x04,0xc0,0xa1,0x30,0x2f,0x20,0x8d,
+ 0x01,0x04,0xc0,0xbb,0x79,0x2e,0x20,0x8d,
+ 0x01,0x04,0xc0,0xe3,0x49,0x09,0x20,0x8d,
+ 0x01,0x04,0xc0,0xf3,0xd7,0x66,0x20,0x8d,
+ 0x01,0x04,0xc1,0x16,0x80,0x17,0x20,0x8d,
+ 0x01,0x04,0xc1,0x48,0x20,0xbb,0x20,0x8d,
+ 0x01,0x04,0xc1,0x54,0x74,0x16,0x20,0x8d,
+ 0x01,0x04,0xc1,0xb0,0x01,0x4a,0x20,0x8d,
+ 0x01,0x04,0xc1,0xc8,0xce,0x0e,0x20,0x8d,
+ 0x01,0x04,0xc1,0xda,0x76,0x0d,0x20,0x8d,
+ 0x01,0x04,0xc1,0xde,0x82,0x0e,0x20,0x8d,
+ 0x01,0x04,0xc2,0x00,0x9d,0x06,0x20,0x8d,
+ 0x01,0x04,0xc2,0x0e,0xf6,0x09,0x20,0x8d,
+ 0x01,0x04,0xc2,0x43,0x40,0xe5,0x20,0x8d,
+ 0x01,0x04,0xc2,0x43,0xd0,0xbf,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,0xc3,0x9a,0xac,0xb1,0x20,0x8d,
+ 0x01,0x04,0xc3,0xb5,0xf5,0x95,0x20,0x8d,
+ 0x01,0x04,0xc3,0xbd,0x61,0x26,0x20,0x8d,
+ 0x01,0x04,0xc5,0x9b,0x06,0x2b,0x20,0x8d,
+ 0x01,0x04,0xc6,0x1b,0xae,0x8c,0x20,0x8d,
+ 0x01,0x04,0xc6,0x62,0x75,0xee,0x20,0x8d,
+ 0x01,0x04,0xc6,0x9a,0x5d,0x6e,0x20,0x8d,
+ 0x01,0x04,0xc7,0x07,0x90,0x97,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,0x62,0xfd,0x58,0x20,0x8d,
- 0x01,0x04,0xcf,0x73,0x54,0x2f,0x20,0x8d,
- 0x01,0x04,0xcf,0xff,0xc1,0x2f,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,0xc8,0x7a,0xb5,0x1a,0x20,0x8d,
+ 0x01,0x04,0xc8,0xb4,0xc5,0xbc,0x20,0x8d,
+ 0x01,0x04,0xca,0x07,0xfe,0xfa,0x20,0x8d,
+ 0x01,0x04,0xca,0xba,0x29,0xdb,0x20,0x8d,
+ 0x01,0x04,0xcb,0x0b,0x48,0x76,0x20,0x8d,
+ 0x01,0x04,0xcb,0x0b,0x48,0xc7,0x20,0x8d,
+ 0x01,0x04,0xcb,0x22,0x3a,0x2b,0x20,0x8d,
+ 0x01,0x04,0xcb,0x33,0x0b,0xa7,0x20,0x8d,
+ 0x01,0x04,0xcc,0x0f,0x0b,0x23,0x20,0x8d,
+ 0x01,0x04,0xcc,0xc2,0xdc,0x27,0x20,0x8d,
+ 0x01,0x04,0xcc,0xc2,0xdc,0x28,0x20,0x8d,
+ 0x01,0x04,0xce,0x7d,0xa9,0xa4,0x20,0x8d,
+ 0x01,0x04,0xce,0xcc,0x6a,0x08,0x20,0x8d,
+ 0x01,0x04,0xcf,0x42,0x47,0x2e,0x20,0x8d,
+ 0x01,0x04,0xcf,0x5a,0xc0,0x36,0x20,0x8d,
+ 0x01,0x04,0xcf,0xb6,0x92,0x82,0x20,0x8d,
+ 0x01,0x04,0xd0,0x5d,0xe7,0xf0,0x20,0x8d,
+ 0x01,0x04,0xd1,0x8d,0x25,0x39,0x20,0x8d,
+ 0x01,0x04,0xd1,0xb1,0x8a,0xf5,0x20,0x8d,
0x01,0x04,0xd1,0xcd,0xcc,0xda,0x20,0x8d,
- 0x01,0x04,0xd1,0xed,0x85,0x36,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,0x0a,0xe5,0xf0,0x20,0x8d,
+ 0x01,0x04,0xd4,0x1d,0x29,0x9e,0x20,0x8d,
+ 0x01,0x04,0xd4,0x33,0x81,0x3c,0x20,0x8d,
+ 0x01,0x04,0xd4,0x44,0xda,0x7c,0x20,0x8d,
0x01,0x04,0xd4,0x56,0x20,0x6a,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,0xc1,0x53,0xfb,0x20,0x8d,
- 0x01,0x04,0xd5,0xc1,0x53,0xfc,0x20,0x8d,
- 0x01,0x04,0xd5,0xca,0xe1,0x7a,0x20,0x8d,
+ 0x01,0x04,0xd4,0x9e,0x85,0xb9,0x20,0x8d,
+ 0x01,0x04,0xd5,0xa5,0x5f,0x8e,0x20,0x8d,
+ 0x01,0x04,0xd5,0xae,0x9c,0x51,0x20,0x8d,
+ 0x01,0x04,0xd5,0xae,0x9c,0x56,0x20,0x8d,
+ 0x01,0x04,0xd5,0xd9,0xd2,0x5a,0x20,0x8d,
+ 0x01,0x04,0xd5,0xe3,0x93,0xf4,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,0xd8,0xe2,0x80,0xbd,0x20,0x8d,
+ 0x01,0x04,0xd9,0x0b,0xf0,0x04,0x20,0x8d,
+ 0x01,0x04,0xd9,0x14,0x83,0x40,0x20,0x8d,
0x01,0x04,0xd9,0x40,0x2f,0x8a,0x20,0x8d,
0x01,0x04,0xd9,0x40,0x2f,0xc8,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,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,
+ 0x01,0x04,0xd9,0xe6,0x2a,0x37,0x20,0x8d,
+ 0x01,0x04,0xdb,0x4f,0xc8,0xe9,0x20,0x8d,
+ 0x01,0x04,0xdc,0x5c,0x8d,0x54,0x20,0x8d,
+ 0x01,0x04,0xde,0xef,0xa6,0x6c,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x13,0xd8,0x1c,0x01,0x00,0x21,0x02,0x15,0x17,0xff,0xfe,0x63,0x2a,0x7e,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x15,0x28,0x01,0x11,0xff,0xff,0x02,0x14,0x00,0x00,0x00,0x00,0x02,0x07,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x16,0x20,0x54,0x2c,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x18,0xb8,0x00,0x00,0x01,0x00,0x00,0x00,0xb0,0x0b,0x04,0x20,0x00,0x69,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x00,0x4f,0x89,0x54,0x00,0x04,0xff,0xfe,0xa0,0x38,0x37,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,0x19,0xf0,0x50,0x00,0x1a,0x80,0x54,0x00,0x04,0xff,0xfe,0x71,0xaa,0xc5,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x2b,0x12,0x54,0x00,0x04,0xff,0xfe,0x6e,0x3a,0xfe,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x5b,0x81,0x5e,0x6f,0x69,0xff,0xfe,0x57,0x94,0xd0,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x68,0x01,0x06,0xec,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0xc8,0x00,0x2c,0xe5,0x54,0x00,0x04,0xff,0xfe,0xd7,0x66,0x3d,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,0x03,0x39,0x11,0xd9,0x00,0x4b,0x0c,0x05,0xf2,0x13,0x8a,0x52,0x12,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x1c,0x04,0x13,0x08,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x85,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,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,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,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,0x09,0x0b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,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,0x75,0xe9,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x10,0x04,0x24,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x52,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0xba,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x03,0x14,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x03,0x0c,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x07,0x00,0x1c,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x07,0x00,0x70,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x0c,0x04,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x28,0x50,0x02,0x06,0x00,0x80,0xbe,0x7b,0xff,0xfe,0xc4,0x9c,0x43,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1a,0x34,0x00,0x02,0xa8,0x04,0x86,0xff,0xfe,0xc2,0x86,0x3a,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x26,0x04,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x7c,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x28,0x0b,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x71,0x03,0x58,0x60,0x83,0xbe,0x0b,0xcb,0xaa,0x0a,0x97,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x07,0x0b,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,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,0x8a,0x71,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,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,0x04,0x70,0xda,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,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,
@@ -545,1245 +1080,1314 @@ static const uint8_t chainparams_seed_main[] = {
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,0x69,0x00,0x90,0x83,0x33,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,0x05,0xa8,0x40,0xc7,0xf5,0x00,0x7a,0x0d,0x0d,0x50,0x25,0x5e,0xdb,0xac,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0x69,0x50,0x79,0xab,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xc7,0xf5,0x00,0x26,0x01,0x7c,0xdc,0x1a,0x2d,0x66,0x1c,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xc7,0xf5,0x01,0xe0,0xaf,0x00,0x1c,0x14,0x68,0xe2,0x72,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xdb,0x20,0x00,0x86,0x68,0xa7,0x02,0x0c,0x89,0xbd,0xd4,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xdb,0x20,0x00,0x86,0x7b,0x8a,0xa6,0x20,0x10,0x87,0x9a,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x60,0xc0,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x40,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,0x38,0xa0,0x00,0xb1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x3d,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x48,0x28,0x00,0x01,0x31,0x4b,0x1f,0xf6,0xfc,0x20,0xf7,0xf9,0x9f,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x78,0x06,0x8c,0xff,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x95,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x78,0x0d,0x78,0x22,0xd0,0x50,0x65,0xc1,0xff,0xfe,0xf2,0x3f,0x65,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x12,0x20,0x08,0x08,0x00,0x00,0x00,0x00,0x93,0xe5,0x08,0x1f,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x12,0x54,0x00,0xd1,0xa7,0xb7,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x12,0x54,0x00,0xd2,0x6b,0x9c,0x00,0x00,0x00,0x00,0x00,0x01,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,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,0x06,0x7c,0x2d,0xb8,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,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,0x0c,0x62,0x2f,0xd0,0xca,0x7f,0x54,0xff,0xfe,0xce,0x06,0xd9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x07,0xd0,0x84,0x10,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x88,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x80,0x03,0xd1,0x17,0x35,0x00,0xbf,0xc5,0x7e,0x90,0x9d,0xa5,0xa8,0xc0,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0x18,0xdf,0x59,0x58,0x00,0xf8,0xa4,0xce,0xff,0xfe,0xfd,0xd6,0x3a,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,0x08,0x71,0x02,0x5f,0xef,0x0d,0x5e,0x55,0xda,0xd6,0xfe,0x43,0x1e,0x63,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,0x08,0xe0,0x14,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0xf8,0x1b,0x69,0x15,0xe5,0xda,0x9e,0xf3,0xff,0xfe,0x75,0xd1,0x0d,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,0xb0,0x11,0x80,0x13,0x3a,0x06,0x0e,0x6a,0x7f,0x23,0x65,0xd3,0xf1,0xdf,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,0xe9,0x5b,0xb0,0xa2,0xd5,0x2d,0xb3,0x8a,0xf4,0x04,0xbf,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x5d,0x26,0x7f,0xb3,0x6a,0xd1,0x35,0x0a,0xb6,0x5e,0x88,0xdd,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,0x6d,0x0c,0xaf,0x3c,0x06,0x69,0x3f,0x73,0xa9,0xe7,0x1b,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x74,0x51,0xd8,0xc2,0x7e,0x42,0x7e,0xfe,0x37,0x63,0x56,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x74,0x51,0xd8,0xf3,0x1f,0x0f,0xdc,0x1c,0x90,0x67,0xac,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0x07,0x0a,0xa7,0xf9,0x3a,0x21,0xb8,0xee,0xe1,0x49,0x73,0xed,0xf9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x07,0x01,0xca,0x1f,0x66,0xff,0xfe,0xc9,0x22,0x1c,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,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,0x20,0x01,0x0b,0xc8,0x3e,0x54,0x6b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x60,0x05,0x00,0x1d,0x02,0x08,0xa2,0xff,0xfe,0x0c,0x6c,0xc2,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x06,0x10,0x00,0x09,0x46,0xa8,0x42,0xff,0xfe,0x0c,0xd3,0x85,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x00,0x23,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x01,0x04,0x09,0xb6,0x83,0x51,0xff,0xfe,0x06,0x75,0xf4,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x01,0x04,0x0d,0xae,0x16,0x2d,0xff,0xfe,0xa6,0xe8,0x68,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0d,0x08,0x00,0xd9,0x7a,0x02,0x9e,0x6b,0x00,0xff,0xfe,0x56,0xe9,0xb3,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0d,0xf0,0xa2,0x80,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0e,0x68,0x54,0x25,0x28,0x34,0x61,0x8e,0x90,0x69,0xa9,0x77,0x5c,0x66,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0e,0xe0,0x4b,0x4f,0xd4,0x80,0x02,0xe0,0x4c,0xff,0xfe,0x08,0x89,0x98,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0f,0x40,0x09,0x5c,0x8d,0x55,0x70,0x38,0xf1,0x46,0xd2,0xd4,0x01,0x18,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0f,0x40,0x09,0x5c,0x8d,0x55,0x72,0x70,0xfc,0xff,0xfe,0x05,0x03,0xcd,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0f,0x40,0x09,0x87,0x11,0x82,0x00,0x6f,0xa4,0x6e,0xec,0x5a,0x48,0xaa,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xd5,0xb7,0x03,0xeb,0x00,0xb2,0x41,0x6f,0xff,0xfe,0x10,0x31,0x2c,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xdc,0x2f,0x4a,0xc2,0x00,0x4e,0xcc,0x6a,0xff,0xfe,0x25,0xc9,0xa3,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xe6,0x7f,0x42,0xa9,0x00,0xe6,0x5f,0x01,0xff,0xfe,0xac,0xcb,0xfc,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xec,0x2f,0x04,0xb1,0x00,0x02,0x11,0x32,0xff,0xfe,0xf7,0xbe,0xef,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xf0,0xdf,0x08,0xec,0x02,0xaa,0xa1,0x59,0xff,0xfe,0x57,0x77,0x79,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x24,0x11,0x3e,0x05,0xcc,0x00,0x04,0x6a,0x17,0x44,0x4d,0x0f,0xd2,0x6b,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x24,0x11,0xa3,0xe1,0x49,0x00,0x85,0xc8,0x62,0xde,0xe8,0xcc,0x68,0x75,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x40,0x53,0x12,0x03,0x3f,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x34,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x01,0x4e,0xb0,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x3e,0xe1,0xd6,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x4e,0x95,0xf3,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x5a,0x68,0x5c,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x05,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xcc,0x14,0x66,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x89,0x07,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xd9,0x96,0x96,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0x25,0x00,0x02,0x04,0x11,0x49,0x01,0x33,0x01,0x25,0x00,0x50,0x01,0x80,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,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,0x01,0xb1,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x10,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x01,0x20,0x20,0x8d,
+ 0x02,0x10,0x24,0x01,0xd0,0x02,0x21,0x03,0x04,0x00,0x02,0x11,0x32,0xff,0xfe,0x9e,0x7a,0xe3,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,0x01,0xd0,0x02,0x06,0x02,0x78,0x00,0x28,0x9b,0x8d,0xab,0xd5,0x0e,0xde,0xa2,0x20,0x8d,
+ 0x02,0x10,0x24,0x02,0xa7,0xc0,0x81,0x00,0xa0,0x15,0x00,0x00,0x00,0x00,0x06,0xf2,0x79,0xa5,0x20,0x8d,
+ 0x02,0x10,0x24,0x02,0xb8,0x01,0x28,0x7c,0x08,0x00,0x12,0x18,0x45,0xcf,0x2d,0x05,0xcb,0xe4,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x58,0x0c,0xc5,0x05,0x00,0x00,0x69,0x55,0x67,0xd3,0x62,0x29,0x88,0xe7,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x58,0x16,0xc8,0xa3,0x00,0x00,0x26,0x77,0x03,0xff,0xfe,0x03,0x94,0x22,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x71,0xc0,0x20,0x00,0xb3,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x71,0xc0,0x20,0x00,0xb3,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x71,0xc0,0x20,0x00,0xb3,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x93,0x20,0x8d,
+ 0x02,0x10,0x24,0x04,0x44,0x08,0x63,0x97,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x50,0x20,0x8d,
+ 0x02,0x10,0x24,0x05,0x65,0x82,0x0d,0xe0,0x44,0x00,0x08,0xce,0x2b,0x80,0x29,0x60,0x7b,0x4e,0x20,0x8d,
+ 0x02,0x10,0x24,0x05,0x65,0x82,0x0d,0xe0,0x44,0x00,0x00,0x0f,0x85,0x4d,0x50,0x57,0x4f,0xc9,0x20,0x8d,
+ 0x02,0x10,0x24,0x05,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0x30,0x03,0x20,0x02,0x3a,0x69,0x38,0x7e,0x3c,0x9a,0x81,0x66,0x10,0x6b,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,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,0x06,0x8c,0x00,0x00,0x00,0x34,0x22,0x01,0x33,0x00,0x18,0x02,0x28,0x01,0x08,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x12,0x0c,0xe1,0xf0,0x00,0xaf,0xcd,0x2e,0x3a,0x11,0xf6,0x67,0xc0,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x12,0x0c,0xe1,0xf0,0x01,0x2f,0x6e,0x08,0x91,0x55,0xf0,0x55,0xe1,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x12,0x0c,0xe1,0xf0,0x01,0x89,0x74,0x8c,0x19,0xba,0xe2,0x52,0x13,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x12,0x0c,0xe1,0xf0,0x01,0xa7,0x91,0xac,0x49,0x22,0xa4,0x0f,0xd2,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1a,0x05,0xb2,0xea,0x00,0xf1,0x7a,0x13,0x19,0xba,0xed,0x15,0x82,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1a,0x05,0xb2,0xea,0x01,0x05,0x8c,0x05,0xfb,0xae,0x7c,0x48,0x4c,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,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,0x07,0xc8,0x00,0x4f,0x12,0x05,0xe7,0x95,0xe3,0x4b,0xf5,0x0b,0x37,0x86,0xf7,0x20,0x8d,
+ 0x02,0x10,0x24,0x08,0x82,0x07,0x54,0x55,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x20,0x8d,
+ 0x02,0x10,0x24,0x09,0x8a,0x28,0x0e,0xc1,0x68,0x40,0xf7,0xa3,0x88,0xc8,0xca,0xcc,0xfe,0x0a,0x20,0x8d,
+ 0x02,0x10,0x24,0x09,0x8a,0x7c,0x1e,0x42,0x2a,0x50,0x45,0xd9,0x11,0xd8,0x0b,0x04,0xcb,0xd7,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,0x24,0x0e,0x03,0x8a,0x3e,0x3a,0xcf,0x00,0xa7,0x71,0x2e,0x91,0x51,0xa7,0x2f,0xb4,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x31,0x01,0xb0,0x0f,0x2c,0x96,0x27,0xa0,0x45,0x2c,0xf1,0x86,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x38,0xd5,0x14,0x0f,0xf6,0x4d,0x30,0xff,0xfe,0x63,0x50,0x4e,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x04,0x88,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x21,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x53,0x9e,0xb0,0x0f,0x50,0x54,0x00,0xff,0xfe,0x1b,0x29,0x13,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x54,0x53,0x06,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x09,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x5a,0xf3,0x2c,0x10,0x46,0xa8,0x42,0xff,0xfe,0x08,0x58,0x35,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x06,0xb0,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x94,0x4c,0xe0,0x0f,0x2a,0x27,0xf6,0x64,0x18,0x01,0x59,0x9f,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0xec,0x7b,0x57,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0xec,0x7b,0x57,0x30,0xf2,0xb6,0x1e,0xff,0xfe,0x70,0x75,0x83,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x20,0x06,0x5f,0x00,0x00,0x00,0x01,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,0x19,0x00,0x40,0xb0,0x3a,0xf2,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0xb0,0x3a,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0xc0,0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0xe0,0x41,0xfa,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x41,0xa0,0xaf,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x00,0x54,0x00,0x06,0xe4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x19,0x01,0x81,0x80,0x05,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x14,0x04,0x0e,0xe3,0x00,0xce,0xa2,0x19,0xef,0xfa,0x3a,0xe1,0x25,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x16,0x0a,0x08,0xb9,0x00,0x23,0x21,0xe0,0x69,0xcd,0xe4,0x67,0xfb,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x64,0xd9,0x16,0x03,0x44,0x36,0x87,0x1e,0x2b,0xfe,0x74,0x03,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x66,0xfc,0xd7,0x00,0x9b,0x71,0x0f,0x45,0xf3,0xc9,0xc4,0x3b,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x66,0xfc,0xd7,0x01,0xd6,0x8d,0xea,0x70,0x77,0xa0,0x40,0x72,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x01,0x77,0x3d,0x13,0x75,0x24,0xfb,0xbf,0x24,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0x27,0x58,0x80,0x42,0x92,0x9f,0xa3,0x84,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0x4c,0x90,0xe1,0xe6,0x2a,0x59,0x82,0xc4,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0xe6,0xc0,0x88,0x78,0x40,0x1c,0x27,0xc2,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0xef,0x0c,0x40,0xab,0x0f,0x8f,0x6d,0x6c,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x18,0x71,0x9a,0xe3,0x02,0xfa,0x9e,0x86,0xad,0xe4,0x63,0xae,0x17,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,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,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,0x94,0xff,0xfe,0xb7,0x4d,0xd7,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xd1,0x1d,0x3d,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,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0x12,0x89,0x38,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,0x01,0x01,0x84,0x03,0x00,0x15,0x6c,0xba,0x4c,0x00,0x30,0x09,0xda,0x6c,0x06,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x6c,0x67,0x21,0x00,0x06,0x70,0xb1,0x79,0xbe,0x4c,0x8c,0xca,0xe8,0xf0,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x6c,0x67,0x8a,0x3f,0xe1,0x91,0x42,0x61,0x86,0xff,0xfe,0x4f,0x0a,0xac,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x70,0xff,0xea,0xad,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x88,0x01,0x2f,0x80,0x00,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x1c,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x88,0x06,0x23,0x00,0x04,0x60,0xa0,0xe6,0x7e,0x10,0xc3,0xa8,0xbb,0x47,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x01,0x52,0x49,0x7f,0x2a,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,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,0x01,0x01,0x8c,0x90,0x02,0x3d,0xe5,0x02,0x19,0xd1,0xff,0xfe,0x75,0xdc,0x2f,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x01,0x9c,0x41,0x7e,0x3a,0x11,0x20,0xe7,0xb3,0xff,0xfe,0xcf,0x0a,0x99,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x02,0x43,0x08,0x20,0x58,0x24,0x42,0x16,0x08,0xde,0xe0,0x4a,0xfb,0x54,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x02,0x80,0x5c,0x00,0x04,0x3d,0x4a,0xba,0x4e,0xff,0xfe,0xf8,0x6e,0x5d,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x06,0x03,0x53,0x00,0x83,0xb7,0x00,0x00,0x00,0xff,0xfe,0x00,0x42,0x09,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,0xfe,0xc3,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x73,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xff,0xb6,0x00,0x04,0x4d,0x3d,0xf8,0x16,0x3e,0xff,0xfe,0xc6,0x0c,0x15,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xff,0xb6,0x00,0x04,0x73,0x9e,0xf8,0x16,0x3e,0xff,0xfe,0x00,0xc2,0xb3,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xff,0xb6,0x00,0x04,0x7b,0x8e,0xf8,0x16,0x3e,0xff,0xfe,0x9d,0x9d,0xc2,0x20,0x8d,
+ 0x02,0x10,0x26,0x02,0xff,0xc5,0x02,0x00,0x1e,0x01,0x24,0x1d,0xe5,0x89,0x96,0x50,0xc7,0x73,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,0x24,0x18,0xee,0x80,0x00,0x02,0x0e,0xc4,0xff,0xfe,0xd1,0xef,0x15,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x03,0x01,0x1b,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x04,0x07,0x17,0x58,0x00,0x48,0x5b,0x39,0xff,0xfe,0xab,0x1d,0x54,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x05,0x15,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0xf2,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x07,0x07,0x01,0x80,0x00,0xb7,0xd9,0x9e,0x1e,0x8e,0x0d,0x52,0xfa,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x0a,0x09,0x12,0x62,0x7a,0xbe,0x24,0x11,0xff,0xfe,0x7b,0x39,0xc3,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x15,0x0e,0x21,0x68,0x00,0x15,0xb3,0xd6,0x92,0xa5,0x36,0x12,0xff,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x24,0x1c,0x07,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x2d,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x30,0x24,0x20,0x05,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x1b,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x60,0x11,0xaf,0x41,0x72,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x60,0x80,0x90,0x03,0x2f,0xbc,0x60,0xb1,0x6a,0x4e,0xe3,0x64,0xc8,0x5d,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x80,0x01,0x33,0x00,0x7d,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x48,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,0x81,0x6c,0x00,0x00,0x77,0x02,0x15,0x5d,0xff,0xfe,0x02,0x15,0x55,0x20,0x8d,
+ 0x02,0x10,0x26,0x03,0x80,0xa0,0x07,0x00,0x18,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,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,0x04,0x45,0x00,0x00,0x06,0x02,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x86,0xc0,0x30,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x73,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x0a,0x00,0x00,0x03,0x20,0x98,0x02,0x16,0x3e,0xff,0xfe,0x28,0xc4,0x47,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x0a,0x00,0x00,0x50,0x00,0x39,0xc5,0x14,0xbe,0xcd,0xbe,0xce,0xad,0x3a,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1c,0x96,0xe0,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1d,0x46,0xc0,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1d,0xef,0x80,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1d,0xfe,0xa0,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x08,0x49,0x60,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x00,0x31,0xe0,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x00,0xc5,0x60,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x10,0x80,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x21,0xc0,0x20,0x00,0x00,0x11,0x02,0x04,0x01,0x94,0x02,0x20,0x00,0x40,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x59,0xc8,0x18,0x00,0x25,0x96,0xc2,0x6c,0xe7,0x80,0x26,0xfd,0xfc,0xf8,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x59,0xc8,0x2a,0x99,0x9d,0x00,0x53,0x77,0x73,0x33,0xef,0xde,0x0d,0x32,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x59,0xc8,0x06,0x1f,0x39,0x00,0x2e,0xfd,0xa1,0xff,0xfe,0xdc,0xf8,0xd4,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,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,0x05,0x64,0x40,0x30,0x01,0x00,0x2f,0x3e,0xec,0xef,0xff,0xfe,0x91,0xf8,0x40,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x40,0x30,0x01,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x40,0x30,0x01,0x00,0x49,0x7e,0xc2,0x55,0xff,0xfe,0xa8,0x31,0xcc,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x40,0x30,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x6f,0x80,0x00,0x00,0x00,0x07,0xfc,0x1b,0xcc,0xff,0xfe,0x8a,0xd8,0x22,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,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,0x53,0x00,0x02,0x03,0x46,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x60,0x31,0x4c,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,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,0x26,0x07,0xf2,0xc0,0xe0,0x45,0xf2,0xe0,0xfe,0x4c,0x0f,0xbb,0x6c,0x99,0x12,0x20,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xf2,0xc0,0xf0,0x0e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xf2,0xf8,0xad,0x40,0xea,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xfd,0xc0,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xca,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0xfe,0xa8,0x60,0x1e,0x7d,0x01,0xbe,0x24,0x11,0xff,0xfe,0x89,0x27,0xf3,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x01,0x1c,0x50,0x01,0x11,0x18,0xd2,0x67,0xe5,0xff,0xfe,0xe9,0xe6,0x73,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x01,0x1c,0x50,0x01,0x21,0x99,0xd2,0x67,0xe5,0xff,0xfe,0xe9,0xe6,0x73,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0x06,0x20,0x03,0x01,0x05,0x06,0x7c,0x16,0xff,0xfe,0x51,0x58,0xbf,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,0x09,0x74,0x2a,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x0d,0x7f,0x1d,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x06,0x49,0xc8,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x0b,0x38,0x8a,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xca,0xa0,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x01,0x50,0x01,0x1d,0x10,0x93,0xc9,0xe3,0x1e,0xf4,0x0b,0xc4,0x25,0x0d,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x17,0x02,0x4f,0x4d,0x95,0xe1,0x30,0x7f,0x97,0x90,0xf2,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x18,0x07,0xd1,0xa2,0x36,0xbc,0xff,0xfe,0x58,0xb6,0xec,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x74,0x4b,0x8b,0xf6,0x73,0xdb,0x63,0x6f,0x6f,0x23,0x10,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,0x03,0x98,0x00,0x94,0x47,0x84,0xbb,0xb8,0x7f,0x1d,0xf2,0xff,0x01,0x1c,0x28,0x20,0x8d,
+ 0x02,0x10,0x28,0x03,0x98,0x00,0xa0,0x07,0x83,0x91,0x1f,0xd7,0xc2,0x63,0xa5,0x5b,0xb9,0xfb,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x01,0x4c,0x65,0xd7,0x8e,0xa5,0x60,0x60,0x21,0x02,0x6b,0xa6,0x56,0x14,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,0x22,0x9c,0x82,0x00,0x18,0xd6,0x01,0x4a,0xd8,0xc8,0xb4,0xdd,0x3f,0x25,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,0x28,0x04,0x0d,0x41,0xe0,0x28,0x59,0x00,0x0a,0xea,0x42,0x36,0x2d,0x76,0x1e,0xb9,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x45,0xcb,0x22,0xef,0x00,0xf8,0x9c,0xd0,0x38,0x2a,0x36,0xa3,0xfa,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x57,0x4b,0x3d,0x7d,0x00,0x75,0x2d,0x1d,0x78,0x6b,0x32,0xf7,0x1c,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x57,0x59,0x49,0x18,0x00,0x02,0xa0,0x98,0xff,0xfe,0x79,0x33,0x9b,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0f,0xec,0xd2,0xd8,0x61,0x00,0xfa,0x63,0x2e,0xcd,0x48,0xa0,0x2f,0x34,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x10,0x3e,0x00,0x1b,0x48,0x35,0xa7,0x87,0x2e,0xa5,0x90,0x25,0xaa,0xa7,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x02,0x67,0x14,0x8a,0x1d,0x10,0xdc,0x4b,0x36,0x94,0x42,0x3b,0xb6,0xb4,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x02,0xf0,0x80,0xe1,0xe1,0x7b,0x35,0x29,0x08,0xaa,0x09,0x0c,0x50,0x9a,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x02,0xf0,0xa4,0x81,0xc5,0x85,0x06,0x03,0x47,0x8e,0x57,0xf9,0x40,0x9e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x11,0x69,0x01,0x14,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x11,0x90,0xc0,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x13,0x37,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x11,0xc0,0x00,0x60,0x02,0x94,0xc4,0x8f,0xbe,0xff,0xfe,0x15,0xa9,0x7f,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,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,0x13,0xa0,0x30,0x15,0x00,0x01,0x00,0x85,0x00,0x14,0x00,0x79,0x00,0x26,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,0x1a,0x08,0xff,0xff,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,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,0x1f,0x40,0x50,0x01,0x03,0x86,0xde,0xad,0xbe,0xef,0xb1,0xac,0xc0,0xfe,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,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,0x8a,0x60,0xe0,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x4d,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x59,0x80,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x35,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0x49,0x14,0x57,0x00,0xdb,0x31,0xca,0x50,0x07,0x97,0xc4,0x68,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0x50,0x9e,0xa4,0x00,0x02,0x11,0x32,0xff,0xfe,0x5c,0x36,0x9c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x06,0x0e,0x00,0x07,0x9e,0x9a,0xd6,0x91,0x81,0xeb,0xb8,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x89,0x20,0x00,0x00,0x42,0xc0,0xff,0xfe,0xa8,0xb2,0x09,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x4e,0xb7,0xc0,0x00,0x00,0x00,0x00,0x20,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x8a,0x60,0xe0,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xa0,0x40,0x01,0x99,0x84,0xfa,0x1a,0xc0,0x4d,0xff,0xfe,0x41,0x3e,0x93,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xbb,0xa0,0x12,0x04,0x37,0x00,0x02,0x1e,0x06,0xff,0xfe,0x4a,0x53,0x78,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,0xfd,0x40,0x00,0x0c,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xd4,0xe0,0x00,0xff,0xfc,0x02,0x9e,0x6b,0x00,0xff,0xfe,0x17,0x61,0x15,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,0x4d,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x0e,0xe2,0x4d,0x00,0x06,0xb0,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x02,0x38,0x42,0x5f,0x46,0x00,0xbb,0xb8,0x16,0xd6,0xe9,0x07,0xcb,0x6f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x02,0x39,0x02,0x65,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x02,0x61,0x02,0x18,0x3f,0x00,0x8d,0x0f,0x21,0x05,0xc6,0x57,0x4a,0xe7,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x4b,0x00,0x80,0x7c,0x31,0x00,0x0a,0x36,0xc9,0xff,0xfe,0x7e,0xde,0x5f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x4b,0x00,0xb9,0x06,0xf1,0x00,0xd8,0x12,0x4f,0x64,0xa9,0x31,0x19,0xb7,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x4b,0x00,0xb9,0x06,0xf1,0x00,0xde,0xa6,0x32,0xff,0xfe,0xd5,0xf1,0x42,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x4b,0x00,0xbf,0x1b,0x72,0x00,0xd8,0x26,0x7d,0x6f,0x0b,0x13,0x27,0x6c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x71,0x16,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,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,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,0x5a,0x44,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x42,0x42,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x52,0x1c,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x71,0x5c,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0xaa,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x4a,0x51,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x5a,0x16,0xcb,0x87,0x6a,0xbc,0xe7,0xb3,0xc8,0x11,0x8a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x5a,0x25,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x01,0xf0,0x85,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x01,0xf0,0x91,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x01,0xf0,0xec,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x00,0xf0,0xcc,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xff,0x00,0xf0,0xe4,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x05,0xa8,0x03,0x03,0x13,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x05,0xa8,0x03,0x08,0x43,0x33,0x40,0x74,0x6a,0xff,0xfe,0x9c,0xf5,0xd2,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,0xac,0x00,0x89,0x50,0x54,0x00,0xff,0xfe,0xb7,0xf5,0xcb,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,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,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,0xcb,0x00,0x13,0x9e,0x0a,0x00,0x14,0x2d,0xfe,0xc1,0xd0,0xdf,0xda,0x18,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x00,0x14,0x28,0xea,0x00,0x8a,0x4c,0x1b,0x72,0xf9,0x59,0x0c,0xa4,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x10,0x02,0x49,0x73,0x00,0x00,0x0b,0x00,0x0c,0x00,0x0b,0x00,0x0c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x01,0xc1,0xa3,0xe0,0x44,0x3b,0xbc,0xab,0x77,0x78,0xb0,0x3b,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x02,0x52,0x6b,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,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,0x05,0x7b,0x00,0xa0,0x70,0x39,0x12,0xe3,0x65,0x47,0x28,0x49,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x08,0x3d,0xdd,0x30,0x24,0x6a,0x4a,0xf7,0x53,0xf4,0x8d,0x65,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,0x0a,0x0b,0xf6,0x8d,0x70,0x02,0x0c,0x29,0xff,0xfe,0x30,0x4f,0xd2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0xb7,0x7d,0xb0,0x02,0x4e,0x01,0xff,0xfe,0xaa,0xe1,0x83,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0d,0xb3,0x66,0xa0,0x92,0xe1,0x04,0xc4,0x8c,0xe9,0x2b,0x5d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0xdf,0xb9,0xa0,0xb6,0x2e,0x99,0xff,0xfe,0xce,0x13,0x95,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0e,0x6e,0x6b,0xb0,0x02,0xe0,0x4c,0xff,0xfe,0x68,0x02,0x32,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,0x1c,0x04,0xd9,0x00,0x86,0xe5,0x21,0x35,0x4f,0x88,0x08,0x2e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x20,0x0a,0x3c,0x00,0xb5,0x59,0x6c,0x65,0x10,0xcb,0x37,0x65,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x3c,0x3a,0x56,0x00,0x61,0xe6,0xa8,0x11,0xef,0x0b,0xf9,0xc2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x48,0x57,0xed,0x00,0x4c,0x86,0x3d,0x1c,0xdb,0x1a,0x46,0x0d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x4a,0xba,0xe8,0x00,0x21,0xec,0x03,0x46,0xa2,0x9f,0x90,0xbe,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x60,0xe0,0x08,0x00,0x8d,0x6e,0x13,0x4d,0xa0,0xca,0xef,0x24,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x78,0x23,0xde,0x00,0x02,0x11,0x32,0xff,0xfe,0xae,0x15,0x2d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x84,0xea,0xf6,0x00,0x50,0x3e,0x6f,0x19,0xc2,0xc1,0x9c,0xa6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x13,0xb8,0xf0,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0x20,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0x42,0x0b,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,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,0x62,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x1c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0x67,0x5e,0x00,0x00,0xe6,0x5f,0x01,0xff,0xfe,0x09,0x35,0x91,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x01,0x68,0xb5,0xcf,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x17,0x48,0xf7,0xdf,0x95,0xb1,0x96,0xc6,0x91,0xff,0xfe,0x1d,0xe0,0xb6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x21,0xb4,0x20,0x89,0x91,0x00,0x10,0x6b,0x0c,0x6b,0xc3,0x28,0xbe,0x4e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x21,0xb4,0xc8,0x20,0xc3,0x00,0x31,0x26,0xc9,0x60,0xf3,0x56,0xaa,0xb5,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,0x24,0x7a,0x02,0x15,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x24,0x7a,0x02,0x2d,0xc0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x24,0x7a,0x02,0x43,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,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,0x29,0xb8,0xdc,0x01,0x37,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x4d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x2f,0x05,0x63,0x07,0x01,0x00,0x00,0xfd,0xac,0x4b,0x7f,0x1a,0x1d,0x95,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,0x31,0x02,0xc3,0x24,0x10,0x49,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,0x6d,0x40,0x30,0x55,0xb2,0x01,0xde,0xa6,0x32,0xff,0xfe,0x44,0x4b,0x25,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x6e,0xa0,0xd1,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x21,0xe2,0x57,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,0xd1,0xe7,0x7e,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,0xb0,0xdf,0x8f,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xb9,0x45,0x35,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xc3,0xb5,0xf5,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xd4,0x18,0x69,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x7b,0x40,0xd4,0x18,0x6d,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,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,0x80,0x71,0x63,0x80,0xc5,0x00,0xd2,0x50,0x99,0xff,0xfe,0x14,0xaf,0xb2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x84,0x20,0x21,0x73,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xe6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x81,0x08,0x28,0xc0,0x5d,0x60,0xda,0x3a,0xdd,0xff,0xfe,0x45,0x4c,0xb5,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x81,0x08,0x8a,0xc0,0x05,0xdb,0xd2,0x50,0x99,0xff,0xfe,0x9e,0x79,0x2a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x81,0x0b,0x18,0x1f,0xfa,0x8e,0x1c,0xc7,0xc5,0x28,0x4a,0x59,0x63,0x34,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,0xa3,0x1a,0xe0,0x3d,0x94,0x00,0x3f,0x18,0x27,0x29,0x0c,0x86,0xd7,0x54,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x09,0x08,0xc2,0x00,0x6d,0x00,0xca,0xad,0x5e,0x32,0x35,0xe7,0x31,0x57,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x57,0x1a,0x1b,0xff,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x33,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,0x65,0x80,0xf4,0x00,0x01,0xf3,0x69,0x4e,0xf5,0xaa,0x12,0x75,0x66,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x66,0x4d,0x4f,0x00,0x01,0x84,0x71,0xfe,0x5d,0x0c,0xff,0xd5,0x24,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x68,0x61,0xf8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x69,0x2d,0x51,0x00,0x01,0x92,0x1b,0x0e,0xff,0xfe,0x8c,0x79,0x75,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x69,0x3e,0xda,0x00,0x01,0x7e,0x83,0x34,0xff,0xfe,0xb6,0x13,0xf3,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,0x06,0x31,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0a,0xb8,0x02,0x01,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x26,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0a,0xb8,0x02,0x01,0x04,0x03,0xb8,0x7a,0x46,0xa1,0xae,0xce,0x21,0xed,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0a,0xf8,0xfa,0xb0,0x08,0x08,0x00,0x85,0x02,0x34,0x01,0x45,0x01,0x32,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0b,0x48,0x02,0x07,0x00,0x02,0x83,0x33,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x0b,0x48,0x02,0x07,0x00,0x02,0x83,0x33,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x31,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x61,0x31,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x70,0x37,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x72,0x28,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x79,0x66,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x81,0x64,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x88,0x93,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x30,0x13,0x36,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x43,0x55,0x42,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,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,0x02,0x01,0xe3,0xc8,0xb7,0xee,0xff,0xfe,0xb0,0xd2,0x6c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x5d,0x0b,0xd4,0xa8,0xbf,0x78,0xff,0xfe,0x98,0x7e,0xa4,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x5d,0x0e,0xa7,0x94,0x4c,0x6b,0xff,0xfe,0xad,0xb1,0xf1,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x5f,0x0c,0xfc,0x14,0xc3,0x0e,0xff,0xfe,0xb5,0x1c,0x1a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x63,0x0d,0xc7,0xd4,0x18,0x2d,0xff,0xfe,0xf3,0x94,0xd9,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x09,0x07,0xd9,0xc8,0x8f,0x1d,0xff,0xfe,0x4e,0x04,0x4d,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,0xb0,0xc0,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x03,0x68,0xd0,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x06,0xaa,0x70,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,0x0f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x14,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,0x1b,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x1c,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,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x9c,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,0x04,0x35,0x43,0x10,0x00,0x23,0x10,0xe8,0x78,0x79,0xff,0xfe,0x3c,0x17,0x29,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x02,0x22,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x02,0x49,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,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,0x52,0xc0,0x01,0x04,0x16,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0x35,0x80,0xd1,0x01,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0x4c,0xc0,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0x6d,0x40,0xb9,0x4e,0xd1,0x00,0x02,0x30,0x48,0xff,0xfe,0xdf,0x14,0x32,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x1e,0x01,0xb1,0x6c,0x03,0x53,0x69,0xfd,0x23,0xe6,0x2f,0xa2,0x57,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xf4,0x80,0x2c,0x00,0x10,0x0c,0x54,0x00,0x04,0xff,0xfe,0xd7,0xde,0xad,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xf4,0x80,0x30,0x00,0x2b,0x4e,0x54,0x00,0x04,0xff,0xfe,0xd7,0x42,0x06,0x20,0x8d,
+ 0x02,0x10,0x2a,0x06,0xdd,0x00,0x00,0x10,0x00,0x00,0x02,0x25,0x90,0xff,0xfe,0x33,0x56,0xe8,0x20,0x8d,
+ 0x02,0x10,0x2a,0x06,0xdd,0x01,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x06,0xe8,0x81,0x34,0x08,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0x30,0x16,0xd5,0xff,0xfe,0x5e,0x11,0x14,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0x60,0xd1,0x0e,0xff,0xfe,0x09,0x38,0x86,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0xb0,0xa5,0x23,0xff,0xfe,0x34,0xd2,0x92,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0xc4,0x3e,0x80,0xff,0xfe,0x3c,0xe0,0xcd,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x72,0x00,0xff,0xff,0x00,0x00,0xf4,0xd3,0x0a,0xff,0xfe,0xbe,0xad,0x99,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0xb2,0x42,0x10,0x00,0x13,0x00,0xf2,0x50,0x8f,0x0a,0xcd,0xba,0x4d,0x76,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,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0x31,0xc0,0x01,0x00,0x00,0x00,0x88,0x8f,0x90,0xff,0xfe,0x2c,0x76,0x1b,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0x45,0x80,0x10,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0x4c,0xc0,0x01,0x00,0x03,0x7b,0xc4,0x4a,0x2f,0xff,0xfe,0x10,0x2d,0x3c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0x4c,0xc0,0x00,0x01,0x03,0x40,0x14,0x60,0xfd,0xff,0xfe,0xb2,0x29,0x94,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0b,0x48,0x80,0x00,0x00,0x00,0x00,0x26,0x6e,0x96,0xff,0xfe,0xdb,0x7c,0xdc,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,0x0b,0xf4,0xc0,0x00,0xc1,0x92,0x0e,0xb2,0x5a,0xda,0xff,0xfe,0x87,0x77,0xb4,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0c,0xb6,0x41,0x06,0xf0,0x01,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xcb,0x00,0x70,0x0b,0x00,0x00,0xcb,0x0f,0x0c,0xba,0x41,0xb2,0x28,0xb3,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0e,0xe7,0x01,0x10,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0f,0xb7,0x80,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0f,0xdf,0x00,0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x62,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0f,0xe5,0x86,0x00,0x0f,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,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,0x37,0x81,0x3a,0x73,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0x37,0x81,0x3a,0x73,0x00,0x25,0xa1,0x77,0xad,0x25,0xb1,0x4a,0x17,0x6a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0x37,0x81,0x3f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0x37,0x81,0x08,0x4b,0x00,0x01,0x80,0x02,0x99,0xd3,0x19,0x1f,0xc7,0x38,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,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,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,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,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,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,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,
+ 0x02,0x10,0x2a,0x11,0xd5,0x40,0x05,0x31,0xb0,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,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,0x10,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,0x16,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,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2c,0x0f,0xfb,0x18,0x04,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x20,0x8d,
+ 0x04,0x20,0xd6,0x9f,0x9d,0x19,0x10,0x32,0xe2,0x90,0x1d,0xa4,0x08,0x48,0x41,0xa7,0x05,0x3b,0x31,0xaf,0x59,0x05,0x87,0xc7,0xeb,0x35,0x0e,0x43,0xa1,0x5d,0xa8,0x22,0x98,0xc7,0x20,0x8d,
+ 0x04,0x20,0xd7,0x38,0x5e,0x38,0x72,0xd2,0x70,0x7b,0xa4,0x39,0x62,0x5c,0xef,0xf0,0xf5,0x19,0xb3,0x75,0x28,0xbc,0xbe,0x24,0xdb,0x2d,0x0d,0xe0,0x7d,0xec,0x80,0x53,0x95,0x49,0x20,0x8d,
+ 0x04,0x20,0xd7,0x57,0xed,0x23,0x12,0x64,0x29,0x98,0xaf,0x57,0x33,0x85,0x54,0x3e,0x41,0xd4,0x0f,0x6b,0xa3,0x20,0x39,0x8a,0xee,0xf6,0x52,0x4e,0x87,0x41,0x00,0xe6,0x3b,0x05,0x20,0x8d,
+ 0x04,0x20,0xd7,0x5b,0x68,0x32,0x61,0x82,0x05,0x08,0xbe,0x32,0x2d,0x7f,0xd9,0x98,0xe6,0xe6,0xf4,0x2e,0x55,0x10,0x5b,0xe5,0xf7,0x57,0xba,0x78,0x75,0x44,0xea,0x9a,0xb7,0x08,0x20,0x8d,
+ 0x04,0x20,0xd7,0x72,0xc2,0x82,0x00,0x52,0x36,0x5d,0xf1,0xf6,0x88,0x35,0xcc,0x2f,0xc4,0x81,0xa5,0x13,0xb0,0x57,0xb0,0x35,0x54,0x84,0xb7,0xc8,0xc6,0x60,0x2c,0x86,0x21,0x3c,0x20,0x8d,
+ 0x04,0x20,0xd7,0x92,0x50,0xde,0x23,0x6c,0x83,0x75,0x81,0x1f,0x83,0x9b,0x10,0x21,0x2f,0xdc,0x81,0xa9,0x60,0x28,0xcb,0x2f,0xfe,0xc7,0x1e,0x1e,0x23,0xb9,0x6c,0x60,0x63,0xd9,0x20,0x8d,
+ 0x04,0x20,0xd7,0xda,0x30,0x73,0x66,0x86,0xe0,0x82,0x71,0x96,0xd1,0xa4,0x29,0x66,0xf6,0xe7,0x44,0xa9,0xad,0x59,0x0e,0x87,0x22,0x1c,0x0d,0xb4,0x23,0x5d,0xa1,0x7c,0xe8,0x45,0x20,0x8d,
+ 0x04,0x20,0xd0,0x7a,0xcc,0x52,0x83,0x8e,0x34,0x51,0x74,0x01,0xb5,0x23,0xef,0xe2,0xe4,0x6c,0x14,0x90,0xbf,0x66,0xb6,0x39,0x75,0x5d,0x78,0xf1,0x17,0x48,0xde,0xcf,0x87,0x99,0x20,0x8d,
+ 0x04,0x20,0xd0,0x69,0xf0,0x08,0x1d,0x1c,0x97,0x7e,0xed,0xca,0x20,0xc9,0x35,0x3a,0xa8,0xac,0x8b,0x93,0x25,0x54,0xea,0xa3,0x76,0xde,0xbe,0x48,0xac,0xf7,0x56,0x30,0x11,0x30,0x20,0x8d,
+ 0x04,0x20,0xd1,0x62,0xdc,0x41,0xd8,0x67,0x4d,0x0b,0x3b,0xef,0xbf,0x82,0xb8,0xa3,0x4f,0xf0,0xa1,0x77,0xc2,0xc9,0xcf,0x8b,0x79,0xc6,0x96,0x0b,0xbc,0x71,0x14,0x34,0x3f,0xe3,0x20,0x8d,
+ 0x04,0x20,0xd1,0xbe,0x5e,0x0e,0x53,0xe1,0x81,0xa6,0x5a,0x60,0xaa,0x77,0x43,0xa2,0xe7,0xb4,0xd5,0x30,0x4b,0xbb,0x8d,0x27,0x93,0x97,0x63,0x5f,0x16,0xa2,0x07,0x77,0xf2,0x3e,0x20,0x8d,
+ 0x04,0x20,0xd1,0xf0,0xed,0x35,0xe7,0x48,0xce,0xaf,0xca,0x2d,0x52,0x7f,0xad,0x3d,0xb8,0x68,0x66,0x3e,0x40,0x54,0xd2,0x81,0x08,0x4a,0x05,0x83,0x78,0x3a,0x6e,0x08,0xe7,0x70,0x20,0x8d,
+ 0x04,0x20,0xd1,0xf1,0x76,0x2c,0x0a,0x44,0x66,0xf3,0x06,0xec,0xc3,0xb0,0xb9,0x2a,0xcc,0xdc,0x36,0xfe,0x76,0x32,0x24,0x33,0xc0,0x93,0x2f,0xb3,0x85,0x7e,0xe5,0x5a,0x8e,0x4c,0x20,0x8d,
+ 0x04,0x20,0xd2,0x5a,0x3a,0x01,0xe6,0x6c,0xb3,0x3b,0xc1,0x76,0xf8,0x1b,0xaf,0x6d,0x89,0x4c,0x47,0xa3,0x9f,0x4e,0x51,0x9e,0x6f,0x4b,0x8f,0xba,0xe6,0xab,0x48,0x16,0xc1,0x62,0x20,0x8d,
+ 0x04,0x20,0xd3,0x42,0x52,0x53,0x19,0xc4,0xa0,0x7b,0x68,0x00,0xb2,0x09,0x5a,0x24,0x62,0xfc,0xb6,0xfa,0xc5,0x1b,0x36,0x0d,0x42,0xba,0xcd,0x17,0xf6,0xf0,0x86,0x1f,0x7d,0x9c,0x20,0x8d,
+ 0x04,0x20,0xd3,0x84,0xa3,0x27,0xd8,0xba,0xb1,0x32,0xa2,0x8f,0xdc,0x57,0x49,0xab,0xe9,0xf6,0xa7,0x36,0xd5,0xa3,0x45,0x63,0x28,0x43,0x9a,0xd9,0x91,0xfd,0x04,0xdd,0x7d,0x21,0x20,0x8d,
+ 0x04,0x20,0xd3,0xb1,0x9f,0xe5,0x4f,0xa2,0x8e,0xb7,0x0f,0x3c,0x38,0x87,0x22,0xa8,0x3f,0x2e,0xe6,0x37,0x3f,0x0a,0xd1,0xfd,0xd6,0xda,0x60,0x45,0x51,0x4b,0x0a,0xbc,0x5a,0xa9,0x20,0x8d,
+ 0x04,0x20,0xd4,0x18,0x53,0xe8,0x18,0xf6,0x6a,0xfa,0xd6,0x42,0xd1,0x4d,0x51,0x02,0x36,0x47,0x9b,0x8f,0xd5,0xc7,0x9e,0xfd,0x4b,0x43,0x27,0xd4,0xb4,0xb1,0x29,0x53,0xb8,0xc9,0x20,0x8d,
+ 0x04,0x20,0xd4,0x5f,0x04,0x6b,0xc9,0x5c,0xdf,0x0b,0x98,0xeb,0x72,0xd2,0xa2,0xd5,0xf8,0xb4,0x30,0x8c,0xcd,0x4b,0xac,0x09,0xa4,0xf8,0xdd,0xdf,0x45,0x3e,0x40,0x5d,0x11,0x51,0x20,0x8d,
+ 0x04,0x20,0xd4,0x5f,0x71,0x44,0xb7,0x8c,0xc6,0x29,0x7c,0xbf,0x50,0xc2,0x0f,0x27,0xf1,0xd9,0x13,0xe5,0x6a,0xe8,0xb0,0xa2,0x10,0xb4,0x55,0xa6,0x1d,0xb1,0xb2,0x5b,0x44,0x24,0x20,0x8d,
+ 0x04,0x20,0xd8,0x73,0x8e,0x55,0x90,0x75,0x4e,0x86,0x51,0xa3,0xdf,0x44,0xb0,0x0b,0x93,0xbe,0xd1,0x2c,0x70,0xb9,0x7b,0x61,0x0f,0x88,0xf9,0x43,0x95,0x38,0xf5,0x0d,0xe0,0x35,0x20,0x8d,
+ 0x04,0x20,0xd8,0xf7,0xf9,0xaa,0x2e,0x0c,0x16,0xcf,0xf0,0x92,0x98,0x5d,0x6a,0xef,0x95,0x21,0x9b,0x37,0x87,0x1c,0x76,0xfa,0x5e,0x09,0xfc,0x00,0xdc,0xf5,0x4a,0x27,0xac,0x1e,0x20,0x8d,
+ 0x04,0x20,0xd8,0xef,0x0e,0xe7,0x71,0x61,0xf2,0x78,0xf5,0x20,0x02,0x2d,0x96,0xef,0x83,0x5d,0xd2,0x09,0x1e,0xc3,0x2e,0x09,0x97,0xed,0xf7,0x46,0x82,0xe5,0x17,0xcb,0x4a,0xe3,0x20,0x8d,
+ 0x04,0x20,0xd9,0x79,0xc1,0x8d,0xf8,0xd0,0xbd,0x6c,0x4e,0x1b,0xf8,0xff,0xb8,0xbb,0xe9,0xd9,0xd7,0xae,0x35,0x26,0x62,0x8e,0xa6,0xdf,0x04,0x50,0xf6,0xd2,0xa3,0xc5,0x47,0xb4,0x20,0x8d,
+ 0x04,0x20,0xd9,0x7d,0x7d,0x80,0x42,0x4e,0x5d,0xfd,0x4c,0x57,0x2e,0xcb,0x6c,0xba,0x76,0x9e,0xac,0x8e,0x17,0xc9,0x82,0x19,0x47,0x0c,0x7d,0x98,0xf7,0x35,0x2c,0x1f,0x9d,0x65,0x20,0x8d,
+ 0x04,0x20,0xda,0xba,0xfb,0x57,0xac,0x82,0x5d,0xc1,0x18,0x8a,0xc6,0x34,0xd1,0x57,0xc8,0x76,0x07,0x48,0x50,0x6a,0xf1,0x92,0xef,0x46,0x1b,0x76,0x47,0x00,0x4c,0xc3,0x60,0x3a,0x20,0x8d,
+ 0x04,0x20,0xda,0xe9,0x14,0x31,0x06,0xef,0x1d,0x97,0xbe,0x95,0x80,0x4f,0xd5,0xba,0x37,0x13,0x39,0x9f,0x75,0x7e,0xc0,0x71,0x19,0x4f,0x6a,0x90,0xd2,0x54,0x3b,0x08,0x17,0x9a,0x20,0x8d,
+ 0x04,0x20,0xdb,0x38,0xef,0x94,0x42,0x72,0x32,0x68,0x13,0x68,0xc0,0x6c,0x49,0x86,0x13,0x66,0xeb,0x20,0xfc,0x6f,0x73,0x86,0x61,0xf4,0xd3,0x03,0x71,0x7c,0xfc,0xdb,0xa4,0x8d,0x20,0x8d,
+ 0x04,0x20,0xdc,0x0c,0x6b,0x85,0xfa,0x09,0x8d,0x52,0x6a,0xfa,0x25,0x45,0x2f,0x37,0x0d,0x70,0x2f,0x1c,0x50,0x96,0xeb,0x05,0x1e,0x2d,0x72,0x53,0x45,0x92,0x59,0x1b,0x70,0x85,0x20,0x8d,
+ 0x04,0x20,0xdc,0x80,0xfe,0x55,0xdd,0xaf,0x35,0x92,0xfa,0x95,0x09,0x1d,0x73,0x27,0x53,0x64,0x2c,0x5b,0xb6,0x4c,0xf2,0xd7,0x38,0x88,0x97,0x39,0x07,0xfc,0x85,0x1e,0xfc,0x6a,0x20,0x8d,
+ 0x04,0x20,0xdc,0xdc,0x53,0x83,0x96,0xf8,0x7f,0x8e,0x81,0x86,0xb1,0xd3,0xb3,0xca,0x49,0x8f,0xf3,0xb8,0xe6,0x2f,0x9a,0xde,0xcf,0x58,0xd9,0x32,0xa3,0x1a,0x42,0xdc,0x4e,0x34,0x20,0x8d,
+ 0x04,0x20,0xdc,0xde,0x12,0x4c,0x84,0x63,0xa9,0xdd,0xe0,0xb9,0x41,0x72,0x10,0xb0,0xe6,0x87,0xc1,0x55,0xc6,0x8c,0x98,0x05,0x29,0xab,0xda,0x3a,0xe8,0xab,0x72,0xa6,0x9f,0xd0,0x20,0x8d,
+ 0x04,0x20,0xdd,0x96,0x36,0x3e,0x5d,0x3b,0xae,0x2f,0xfa,0x05,0x2e,0x9c,0x5d,0x80,0x6f,0xf1,0x60,0x30,0x6e,0xae,0x08,0x88,0xd7,0x0d,0xd0,0xb5,0x9b,0xa3,0x45,0x66,0x93,0x69,0x20,0x8d,
+ 0x04,0x20,0xe6,0xa0,0x53,0xc1,0xd8,0x20,0x54,0xf1,0x8c,0x92,0xba,0x3f,0x90,0xb3,0x74,0x48,0x8b,0x96,0x02,0x73,0x12,0xc0,0xd6,0xd5,0x43,0x7f,0x8d,0xdf,0x99,0x41,0x37,0x57,0x20,0x8d,
+ 0x04,0x20,0xe6,0xa8,0xa1,0xa3,0xd9,0x91,0xa1,0xd3,0x88,0xbd,0x1f,0x03,0xeb,0xdc,0x69,0xff,0xca,0x54,0x49,0x87,0xce,0xa4,0xcf,0x98,0x95,0x40,0x44,0xdb,0x1f,0x25,0x35,0x1a,0x20,0x8d,
+ 0x04,0x20,0xe7,0xe9,0xc5,0x85,0x3f,0x83,0x30,0xb5,0xaa,0xe9,0xda,0x43,0x92,0xa5,0xc0,0x37,0x33,0xdc,0x22,0x8e,0xc3,0xe5,0x87,0xf3,0x7d,0xe0,0x1f,0x17,0x49,0x94,0x6a,0x81,0x20,0x8d,
+ 0x04,0x20,0xe2,0xf4,0xa0,0xd7,0xc3,0xc0,0x0c,0x74,0x42,0x39,0x15,0x30,0xbc,0xd0,0xf6,0x48,0x80,0x6d,0xd4,0x34,0x4c,0x78,0x28,0x93,0x45,0xd1,0x76,0x0e,0x98,0x25,0xfc,0xb5,0x20,0x8d,
+ 0x04,0x20,0xe3,0x65,0xf2,0x53,0x6b,0xb8,0x36,0x1e,0xe6,0x15,0x02,0x6b,0x98,0xa0,0xce,0xd7,0x17,0x30,0xa5,0x84,0x44,0x19,0xa7,0x82,0x27,0x22,0x0e,0x09,0x8f,0x8d,0xf3,0x20,0x20,0x8d,
+ 0x04,0x20,0xe3,0xd9,0xa0,0x94,0x3b,0x01,0x14,0xbd,0xad,0x4f,0x2f,0x22,0x74,0xa4,0x23,0x69,0x44,0xdd,0x5c,0x4d,0x82,0x95,0xc1,0x93,0x6f,0xcf,0x88,0xaa,0x9c,0xbd,0xc3,0x37,0x20,0x8d,
+ 0x04,0x20,0xe4,0x3d,0x75,0x4e,0x71,0xd5,0x6b,0x81,0x37,0xc4,0xe5,0x2d,0xde,0x94,0x85,0x5c,0xa1,0xb7,0x62,0x2c,0x06,0x5b,0xf9,0x97,0x3c,0xee,0x2e,0xd4,0x7f,0x78,0x3a,0x53,0x20,0x8d,
+ 0x04,0x20,0xe4,0x4b,0xbf,0x49,0x3f,0xfe,0xca,0x7b,0x5c,0x30,0xd4,0x99,0x8b,0x3f,0x97,0x53,0xc7,0x7a,0xa3,0x1e,0x06,0x62,0xee,0x11,0xe2,0x5f,0x6b,0x34,0x97,0xe5,0x92,0x5b,0x20,0x8d,
+ 0x04,0x20,0xe5,0x7a,0xcc,0x5a,0x97,0x0b,0xc7,0x0c,0x16,0xd6,0x77,0x03,0x5c,0x18,0x30,0xc5,0x5a,0x4d,0x7c,0x8a,0x35,0x01,0x58,0x6b,0xde,0x03,0xfc,0xef,0xf5,0x21,0x12,0x56,0x20,0x8d,
+ 0x04,0x20,0xe5,0x5f,0xa7,0xc9,0x1f,0xdc,0x0b,0x27,0x8b,0xcd,0x23,0x86,0xfb,0xba,0xe4,0xe1,0xc9,0x77,0x9c,0xb9,0x87,0x56,0xb7,0x4a,0x20,0x3f,0x4c,0xae,0x35,0x36,0x3b,0x7e,0x20,0x8d,
+ 0x04,0x20,0xee,0x98,0x54,0xba,0x87,0xb5,0xcb,0xb7,0xd2,0x9a,0x01,0x78,0x39,0x39,0x52,0x49,0x4e,0xda,0xd0,0xbc,0x61,0x9e,0xa1,0x05,0x76,0xf1,0x86,0xc9,0x24,0xd1,0x0b,0xe3,0x20,0x8d,
+ 0x04,0x20,0xee,0xc2,0xf3,0x48,0xb8,0x5a,0x73,0x7e,0xd3,0x33,0x87,0x73,0x4d,0x60,0x2c,0xd3,0xa0,0x94,0x04,0x1a,0x20,0x98,0xc1,0x59,0x30,0xcf,0x78,0x59,0x2e,0xf1,0xd2,0x7d,0x20,0x8d,
+ 0x04,0x20,0xef,0x8a,0x5f,0xe5,0x67,0x8e,0xe4,0xb3,0x83,0x63,0xd1,0x7d,0xa4,0x12,0xf7,0xf9,0x9b,0xb4,0xde,0x29,0xaa,0x83,0xb2,0x7d,0xb7,0xfd,0x34,0x99,0xb6,0x82,0xd4,0xbf,0x20,0x8d,
+ 0x04,0x20,0xe8,0x6e,0xf7,0x3a,0x31,0x36,0x0f,0x21,0x77,0xfc,0xf4,0x4d,0xc0,0x0e,0xb3,0x4b,0x2e,0xa7,0x96,0xce,0xe5,0x4e,0xe5,0x64,0x9f,0xbd,0x7f,0x51,0x00,0x1b,0x03,0x49,0x20,0x8d,
+ 0x04,0x20,0xe9,0x90,0xa1,0x51,0x46,0xef,0xaf,0xf9,0xe0,0xd6,0x9a,0x5e,0x4b,0xd4,0x7f,0x10,0x36,0xc4,0x1d,0x2f,0x9e,0x4b,0x11,0x5c,0x31,0x59,0xf7,0xaa,0x93,0x16,0x77,0x17,0x20,0x8d,
+ 0x04,0x20,0xea,0x8c,0x60,0x11,0x69,0xa1,0xb3,0x6e,0xee,0x7f,0x62,0x23,0x7d,0x1e,0x0c,0x90,0xa8,0x2e,0x94,0x01,0xd6,0xde,0x53,0x77,0xec,0x45,0x62,0x1b,0x5b,0x6f,0x27,0x44,0x20,0x8d,
+ 0x04,0x20,0xeb,0x4c,0x2b,0xc6,0x2f,0x50,0x84,0x82,0x57,0xd4,0x01,0xa9,0x36,0x7b,0x29,0x72,0x3e,0x3f,0x2f,0x6d,0x59,0xd0,0xa9,0xa1,0x1b,0xce,0xd8,0x7c,0xbc,0x41,0xec,0x14,0x20,0x8d,
+ 0x04,0x20,0xeb,0xd0,0x0e,0x3d,0xdf,0x0c,0x4c,0x20,0x04,0x87,0x4e,0x1e,0x86,0x98,0x94,0x2d,0xec,0x0c,0x39,0x3c,0x62,0x1b,0xe4,0x98,0x1d,0x86,0x32,0x01,0x37,0xab,0x7f,0x05,0x20,0x8d,
+ 0x04,0x20,0xeb,0xd9,0x1d,0x41,0x74,0x00,0x0a,0x46,0x2d,0x05,0x64,0xa2,0x3d,0x8e,0x77,0x39,0xa7,0x95,0x1c,0x5a,0xa7,0xd4,0xf9,0x66,0x15,0x5f,0x4f,0xb5,0xd8,0x3d,0xe2,0x58,0x20,0x8d,
+ 0x04,0x20,0xec,0x97,0xe2,0x95,0x29,0xdb,0x08,0x26,0xc9,0x47,0x97,0x97,0x37,0x9f,0x30,0xfe,0x79,0x5b,0x8c,0xe5,0x93,0x3c,0x5f,0xde,0xbc,0x2b,0x31,0x04,0xce,0x0b,0x0e,0x73,0x20,0x8d,
+ 0x04,0x20,0xec,0xd9,0xea,0x05,0x12,0xd0,0x26,0xf4,0xa0,0x86,0x33,0xe6,0x54,0x4f,0xb9,0x57,0x06,0xd6,0x38,0x96,0x10,0x96,0x9d,0x98,0x29,0x28,0x9e,0xd7,0x4b,0x16,0xa9,0x3e,0x20,0x8d,
+ 0x04,0x20,0xed,0x50,0xa3,0xfe,0xd9,0x66,0x15,0x31,0x85,0x3c,0x74,0xda,0x8c,0xda,0x4e,0x24,0xdf,0x0f,0xcf,0x72,0xb0,0x0d,0xdd,0x79,0x75,0xae,0x33,0x6e,0xd9,0x2c,0x72,0x13,0x20,0x8d,
+ 0x04,0x20,0xed,0x56,0xb6,0xa5,0xcf,0xce,0x0e,0xc5,0x95,0xf2,0x02,0x83,0xea,0xe6,0x11,0xe1,0x5e,0x60,0xc0,0x88,0x58,0xa9,0x1b,0xb1,0x1d,0x54,0xc0,0xc9,0xd5,0x47,0x80,0xe8,0x20,0x8d,
+ 0x04,0x20,0xed,0x5e,0x16,0xd9,0x8a,0x82,0x58,0x47,0x4b,0x90,0x2c,0xc1,0xd7,0x7f,0xcd,0x95,0x11,0xc4,0x22,0x52,0x01,0x4d,0x95,0xee,0x03,0x54,0xd9,0x2c,0xb7,0x21,0x26,0xf6,0x20,0x8d,
+ 0x04,0x20,0xed,0x84,0x64,0x53,0xe4,0x33,0xd5,0x07,0xb7,0xde,0xae,0x3c,0x3c,0xf3,0x7d,0x8f,0xdd,0x58,0x49,0xfa,0xc7,0xc8,0x57,0xa7,0x1e,0x68,0x02,0x1e,0x84,0xf3,0x6a,0x0d,0x20,0x8d,
+ 0x04,0x20,0xee,0x08,0xd0,0x45,0xf9,0x41,0xcf,0x6c,0xff,0xab,0x08,0xa3,0x3d,0x6a,0xc9,0xd4,0x27,0x05,0xf3,0x8a,0xeb,0xf2,0x1d,0x4f,0x04,0xaf,0x8b,0x75,0x85,0xf9,0x63,0xfd,0x20,0x8d,
+ 0x04,0x20,0xee,0x51,0xc1,0x50,0x47,0x66,0x69,0x66,0xa8,0xde,0x5a,0x3e,0x89,0x9f,0x6f,0x24,0x64,0x86,0xe2,0xae,0x60,0xa8,0x23,0xf4,0xac,0xbe,0x29,0x99,0xf8,0x8d,0x2e,0x85,0x20,0x8d,
+ 0x04,0x20,0xf6,0xa7,0x6f,0xc8,0x5d,0xee,0xbd,0xdb,0x6a,0x50,0x39,0xd4,0x16,0x89,0xd4,0x61,0xae,0x14,0x5e,0xf3,0x50,0x14,0x8a,0x38,0xdf,0xc8,0xa1,0x8a,0x1b,0xe8,0x20,0x43,0x20,0x8d,
+ 0x04,0x20,0xf6,0xc5,0x0a,0x43,0x44,0xd9,0x9e,0x23,0x16,0x68,0xeb,0xc9,0x39,0xdf,0x92,0x09,0xbb,0x33,0x7a,0xf2,0x4a,0xfe,0xd2,0x49,0x4b,0xd5,0xbd,0x66,0xc0,0xc8,0x57,0x95,0x20,0x8d,
+ 0x04,0x20,0xf7,0x52,0x80,0x5e,0xe4,0x3b,0x00,0xa6,0xfb,0x8d,0x96,0x08,0x0b,0xea,0xea,0xd8,0xe0,0xa2,0x19,0xc7,0xa6,0xf6,0x54,0x7f,0xe6,0x49,0xe8,0xac,0xdb,0xe3,0x67,0x69,0x20,0x8d,
+ 0x04,0x20,0xf0,0x73,0x3d,0x30,0x64,0x77,0x80,0x53,0x95,0x65,0xbb,0x10,0xb6,0x9d,0xca,0x55,0x6d,0xe2,0x0e,0xf4,0x27,0x16,0x61,0x0e,0xa9,0x40,0x7c,0x56,0xf4,0x6c,0xc7,0xcf,0x20,0x8d,
+ 0x04,0x20,0xf1,0xdc,0x1a,0x12,0x46,0x6e,0xca,0xae,0x07,0xd7,0x52,0x8c,0x94,0xf3,0x00,0x0b,0x79,0x11,0xaa,0x17,0x3b,0xa3,0xac,0x1b,0xb2,0x19,0x56,0xf8,0xb2,0x69,0x4d,0x1d,0x20,0x8d,
+ 0x04,0x20,0xf2,0x22,0x14,0x59,0xde,0x66,0xeb,0x87,0x3a,0xe8,0x07,0x8d,0x2c,0x5e,0xb7,0xe8,0xaf,0x42,0x8d,0xf5,0x68,0x76,0xfa,0xf6,0xd6,0xc7,0x08,0xe5,0xb9,0xdd,0x1b,0x00,0x20,0x8d,
+ 0x04,0x20,0xf2,0x70,0x0f,0xf7,0x6c,0x86,0x62,0xa6,0x19,0x4e,0x7e,0x9b,0x8b,0xfb,0xa2,0xbc,0x0a,0xea,0x3f,0x5a,0x60,0xc0,0xf4,0xf6,0x6a,0x57,0x8d,0x0b,0x1f,0xec,0xf6,0x48,0x20,0x8d,
+ 0x04,0x20,0xf3,0x3b,0xef,0x7d,0x4b,0x85,0x43,0x80,0x7a,0x90,0x6b,0x05,0x09,0x3d,0xdf,0x01,0x1d,0x12,0x3b,0x22,0x43,0xf3,0x90,0xf4,0xba,0xd6,0xaa,0xb8,0xa4,0xe7,0x70,0xe2,0x20,0x8d,
+ 0x04,0x20,0xf3,0xaa,0xbd,0x6c,0x41,0xb1,0xc5,0xa1,0xbd,0x9d,0x89,0xb9,0x19,0x6a,0xf1,0x81,0xbf,0x1f,0x57,0x43,0xe0,0x67,0x2a,0xcb,0xd3,0x21,0xf6,0x9d,0x96,0xc8,0xee,0x3e,0x20,0x8d,
+ 0x04,0x20,0xf4,0x35,0x0b,0x15,0xaf,0x3e,0x1d,0x5f,0x6f,0xb2,0x87,0x13,0xe3,0xa1,0x18,0xef,0x6c,0x8e,0x38,0x64,0xea,0x42,0x21,0xfa,0xce,0x12,0x29,0xc9,0xf4,0x4d,0xfb,0x19,0x20,0x8d,
+ 0x04,0x20,0xf4,0x15,0xe0,0xcc,0x5a,0xdd,0x67,0x45,0x8e,0x6d,0x6b,0x15,0x58,0xc2,0xac,0xc8,0x92,0xf7,0x51,0x6b,0x2d,0x86,0xc6,0xb4,0x53,0xaa,0xea,0x45,0x5c,0xea,0x1a,0x57,0x20,0x8d,
+ 0x04,0x20,0xf5,0x5c,0x4a,0xe0,0x5e,0x2f,0xda,0x6d,0x02,0xef,0x36,0x6d,0xb4,0x45,0x94,0xf7,0xfe,0xe9,0x6c,0x3e,0x5f,0xba,0xb4,0x9e,0x8e,0xc9,0x7e,0x72,0xa8,0x11,0xd1,0x5e,0x20,0x8d,
+ 0x04,0x20,0xf5,0xb1,0x0d,0x23,0x86,0x92,0x6a,0x81,0xd7,0x3f,0xa3,0x24,0x36,0xda,0x26,0xbd,0x55,0x24,0xcb,0xf6,0x85,0x6b,0x42,0xf3,0x23,0x4d,0xe4,0x92,0xa6,0xc6,0xfd,0x90,0x20,0x8d,
+ 0x04,0x20,0xf6,0x5b,0x41,0x3e,0xb7,0xfa,0xbd,0x90,0x48,0xc7,0xc5,0x34,0x38,0x15,0xfd,0x99,0xe5,0x18,0xfc,0x1d,0xf0,0x86,0x70,0xef,0x10,0x70,0x0d,0x12,0x6e,0x95,0xee,0x9c,0x20,0x8d,
+ 0x04,0x20,0xff,0x1c,0x9e,0x48,0x7c,0x27,0x72,0x5f,0xb2,0x81,0xef,0x5e,0x46,0x71,0x49,0x14,0x1d,0xea,0x0e,0x86,0x77,0x77,0xb6,0x2d,0xa0,0x3d,0xd9,0x7f,0x29,0x68,0xb3,0x0f,0x20,0x8d,
+ 0x04,0x20,0xff,0xb0,0x84,0x86,0xa2,0x27,0x24,0x15,0xd8,0xd1,0xde,0xa1,0xa9,0x13,0x47,0x02,0x84,0x1b,0x92,0x42,0x13,0x72,0x96,0x2d,0xee,0x7c,0xd9,0xa1,0xea,0x77,0x64,0x88,0x20,0x8d,
+ 0x04,0x20,0xff,0xef,0x45,0xc2,0x5e,0x33,0x80,0x0b,0x31,0x9e,0xd7,0x54,0xe8,0x69,0x2c,0xdd,0x0e,0xd1,0xf4,0x62,0x14,0x7a,0x29,0x9c,0xc8,0x6c,0xb6,0x97,0xd3,0x16,0x68,0xa1,0x20,0x8d,
+ 0x04,0x20,0xf8,0x41,0x44,0x73,0xc3,0xac,0x0b,0xbf,0xf1,0x4f,0x47,0xc0,0x02,0x94,0x1f,0xbb,0x4f,0xbf,0x5d,0xa3,0x17,0x58,0x96,0x40,0xbc,0x56,0x43,0x71,0x52,0x97,0x07,0x5c,0x20,0x8d,
+ 0x04,0x20,0xf8,0x53,0x61,0xb6,0xfd,0xa3,0x08,0x5d,0x84,0x47,0x9b,0x78,0x27,0x67,0x90,0x05,0xaf,0xa9,0x4f,0x9f,0xee,0x84,0xa8,0xb2,0xd0,0x8e,0xbf,0x42,0x1b,0x9d,0xb7,0x98,0x20,0x8d,
+ 0x04,0x20,0xf8,0xfe,0xa2,0x8b,0x16,0x2f,0x76,0xe0,0xcc,0xd4,0x84,0x8f,0x2d,0xf3,0x8b,0x34,0xce,0x90,0x0b,0x5e,0x3b,0x46,0x34,0x4e,0xae,0x1c,0x16,0x7e,0xc5,0xc2,0xc6,0xc4,0x20,0x8d,
+ 0x04,0x20,0xf8,0xd2,0x4d,0x3d,0x09,0x65,0x80,0xd7,0x27,0xb3,0x3c,0x4d,0xfb,0xb0,0x5e,0x39,0x64,0xb1,0xea,0x66,0x8c,0x54,0xd9,0x50,0x8c,0xd8,0xcb,0x7d,0x2f,0xce,0xe1,0x74,0x20,0x8d,
+ 0x04,0x20,0xf9,0x37,0x1b,0xf1,0xee,0x98,0xb5,0x19,0xef,0x9d,0xc1,0x01,0x33,0x84,0x86,0xbb,0x47,0xd7,0xa9,0xa9,0xa7,0xd1,0x6d,0x2e,0xc8,0xd0,0xb3,0xb0,0x3f,0xae,0x6b,0x55,0x20,0x8d,
+ 0x04,0x20,0xf9,0xbd,0x57,0xe4,0xb0,0x66,0x43,0x7f,0x08,0x30,0xa6,0xbe,0x4a,0x00,0xfa,0xc3,0x45,0xa1,0xef,0xb6,0x29,0x0c,0x0e,0xd0,0x4e,0xfd,0xe1,0xfc,0x5a,0x2a,0x1c,0x93,0x20,0x8d,
+ 0x04,0x20,0xf9,0xc8,0x53,0x1a,0xd6,0x50,0x5f,0x8b,0xca,0x1c,0xd2,0x06,0xe3,0x56,0xef,0x28,0x46,0x0c,0x03,0x05,0xe5,0x4c,0x89,0x91,0xc6,0xe9,0x15,0x33,0x90,0xcc,0xc6,0xc6,0x20,0x8d,
+ 0x04,0x20,0xfb,0x17,0x3f,0x49,0x3b,0x30,0x92,0xe7,0x75,0x2f,0x2e,0x85,0x31,0x75,0xd9,0xaa,0xd2,0x8c,0xd3,0xd5,0xb6,0x85,0x2d,0x0e,0xdb,0x76,0x32,0xe6,0x10,0x0e,0x45,0xb7,0x20,0x8d,
+ 0x04,0x20,0xfb,0x5a,0xfc,0xbf,0x05,0x0c,0x21,0x97,0xb1,0x85,0x23,0x7d,0x6f,0x63,0xe6,0x8e,0xb4,0x32,0x63,0x5d,0xcd,0x62,0x0a,0xed,0x02,0x2b,0x17,0x80,0xe9,0xa5,0xb5,0xe6,0x20,0x8d,
+ 0x04,0x20,0xfb,0xf1,0x17,0xd6,0x03,0x3b,0x01,0x8b,0x98,0xcf,0x16,0x20,0xde,0xaf,0x6c,0xed,0x60,0xab,0x6e,0x14,0x0b,0x58,0x6b,0x2d,0xf8,0x06,0x98,0x37,0x7a,0xff,0x7a,0x0f,0x20,0x8d,
+ 0x04,0x20,0xfc,0x2c,0xaa,0xad,0xe8,0x5a,0xba,0x52,0x2f,0x41,0x42,0x0b,0xc6,0xca,0x6e,0xa0,0x6e,0x32,0x0e,0xe8,0x8d,0x61,0x44,0x8b,0x0f,0x9d,0xcd,0x8f,0x04,0xbe,0x1e,0x64,0x20,0x8d,
+ 0x04,0x20,0xfc,0x77,0xed,0x48,0x93,0x65,0x0d,0x98,0x99,0xf3,0x7a,0x73,0xa1,0x1b,0x2c,0xfc,0x2b,0xc6,0x9e,0xfb,0x8f,0x86,0x70,0x80,0x2a,0x47,0xef,0x2a,0xf2,0x10,0xb5,0x19,0x20,0x8d,
+ 0x04,0x20,0xfc,0x7b,0xa8,0xd7,0xa4,0x7e,0x1d,0x0e,0x35,0x1c,0x81,0xe1,0x79,0x3d,0xa5,0xc0,0x13,0x73,0x95,0x7e,0x8e,0x1b,0x6f,0x0b,0x80,0xd3,0xf5,0xf8,0xf2,0xad,0x87,0xb8,0x20,0x8d,
+ 0x04,0x20,0xfc,0x5f,0x9e,0xfb,0x72,0x34,0xcb,0x90,0x6a,0x0c,0x02,0x7e,0xb9,0x81,0x92,0xb5,0x0a,0xd6,0x0e,0xf5,0xfe,0xaa,0x28,0x2d,0xd7,0x2a,0xa4,0xc2,0xc7,0xe5,0xa0,0xd3,0x20,0x8d,
+ 0x04,0x20,0xfc,0x99,0xcd,0x29,0x50,0x95,0xac,0xff,0x02,0xe3,0x7e,0x7b,0xb9,0x48,0x85,0x0b,0x0d,0x10,0x1b,0xe4,0xbd,0x90,0x89,0x69,0x05,0x19,0xbf,0x62,0xa1,0xde,0x0d,0xdb,0x20,0x8d,
+ 0x04,0x20,0xfc,0xed,0x9c,0x1f,0x7a,0xdb,0xa7,0x3f,0xb1,0xe1,0x77,0xb1,0xd8,0x2b,0x0a,0xd9,0x28,0x6b,0x22,0x6d,0x91,0xac,0xab,0x90,0xd0,0x29,0xb9,0xda,0x6c,0x51,0xbb,0x81,0x20,0x8d,
+ 0x04,0x20,0xfd,0x80,0xa7,0xf2,0xe9,0xba,0xa4,0x68,0x90,0x8a,0xb2,0x48,0xe6,0xd1,0x7a,0x32,0x78,0xe6,0x09,0xbe,0xf9,0xb5,0x05,0x20,0x19,0x2c,0x39,0xc3,0x9a,0x08,0x9f,0x33,0x20,0x8d,
+ 0x04,0x20,0xfe,0x4c,0x57,0x10,0xc4,0x20,0xfc,0x97,0x4c,0xcc,0xa1,0x75,0x65,0x3a,0x61,0x0e,0x87,0x11,0xaa,0x8a,0xd6,0xb7,0x5d,0xb1,0xce,0x60,0xb8,0x05,0x22,0x98,0xde,0x10,0x20,0x8d,
+ 0x04,0x20,0xfe,0x56,0xa6,0xe1,0xd7,0x06,0x37,0x10,0x8c,0x3c,0x0a,0x75,0x91,0xc9,0xa0,0x32,0xc6,0xfc,0xa5,0x79,0xca,0xe2,0xcb,0x20,0xef,0x0f,0xb1,0x49,0xa9,0x79,0x82,0x8e,0x20,0x8d,
+ 0x04,0x20,0x07,0x06,0xac,0xf7,0xa7,0x90,0x48,0x5d,0x79,0x20,0xf8,0x73,0xa9,0x96,0x55,0x59,0x92,0x83,0x1b,0xbd,0x70,0x9a,0x7c,0x0a,0xf0,0xdf,0x08,0x5b,0x3e,0x99,0x34,0xcc,0x20,0x8d,
+ 0x04,0x20,0x01,0x05,0xc2,0x89,0x38,0x2c,0x7a,0x6e,0x12,0x12,0x22,0x59,0x51,0x7e,0x7b,0x22,0x27,0xe6,0x85,0xb5,0xe5,0x5d,0x76,0xe1,0x4c,0xb6,0x9d,0x16,0xea,0x4c,0x3a,0x2e,0x20,0x8d,
+ 0x04,0x20,0x01,0x77,0x4a,0xf1,0x91,0xbc,0x60,0x46,0xd3,0xc0,0xda,0x82,0x52,0x3a,0xa0,0x7b,0xfc,0xae,0x57,0x4f,0xd6,0x19,0x7a,0xf3,0x89,0xb6,0xd1,0xf9,0x64,0x06,0x13,0x2e,0x20,0x8d,
+ 0x04,0x20,0x01,0x5b,0xa8,0xaf,0x56,0x1b,0xe2,0x89,0x12,0xb8,0x3d,0xc8,0x0e,0xb6,0x21,0x2a,0xe7,0xba,0xd8,0x67,0xe8,0xa2,0x6e,0x1e,0x01,0xd0,0xb8,0x8a,0x28,0x17,0x1d,0xb7,0x20,0x8d,
+ 0x04,0x20,0x01,0x64,0x48,0x16,0x7c,0x4d,0xde,0xac,0x11,0x19,0xe0,0xbd,0x5e,0xfd,0xb7,0xb4,0xe7,0x69,0x93,0xf1,0xe5,0xc1,0x2e,0x2d,0xaa,0xa5,0xc4,0xa2,0xb7,0x8e,0x3b,0xf0,0x20,0x8d,
+ 0x04,0x20,0x01,0xec,0xa0,0x5a,0x97,0xc3,0xad,0x82,0x49,0xd5,0x9d,0x62,0x80,0x18,0xf0,0x1d,0x68,0x3f,0xaa,0x58,0xda,0xa7,0xe8,0xa4,0xea,0x10,0x07,0x22,0x97,0xb1,0x5a,0xde,0x20,0x8d,
+ 0x04,0x20,0x02,0x6d,0x2d,0xdf,0xf7,0x20,0xb8,0xa1,0xb9,0xf1,0x8a,0xd3,0x21,0xc9,0xb5,0xd1,0xa3,0x98,0x34,0xdf,0xc0,0x74,0xfd,0x31,0xfc,0x33,0x3f,0xbe,0x9d,0x78,0xd4,0x46,0x20,0x8d,
+ 0x04,0x20,0x02,0xb5,0xaf,0x5b,0x78,0xac,0xcf,0xc9,0x70,0xb2,0xe2,0x01,0xc8,0x88,0x6a,0x3a,0xb2,0xec,0x45,0x49,0x56,0xba,0xa5,0x6f,0x90,0x35,0xc8,0xe3,0x2e,0xb4,0x3b,0xbe,0x20,0x8d,
+ 0x04,0x20,0x02,0xcf,0x62,0xf4,0xf4,0x97,0x4c,0x55,0x12,0x1e,0x6c,0xa1,0x73,0xc6,0xeb,0x86,0xdb,0x73,0x92,0x34,0x2e,0x04,0x06,0x00,0xbf,0xbb,0x53,0x67,0xb4,0x97,0xa1,0x74,0x20,0x8d,
+ 0x04,0x20,0x02,0xe4,0xdc,0x08,0x18,0x82,0x0d,0x33,0xec,0x3d,0xac,0x53,0x32,0xcd,0x6e,0xb5,0xc6,0xd5,0x34,0x9c,0x83,0x1b,0x00,0x59,0x36,0xdc,0x18,0x71,0xb9,0x06,0xe4,0x9f,0x20,0x8d,
+ 0x04,0x20,0x04,0xf0,0x66,0xf9,0x74,0x12,0xc1,0xf9,0xf8,0x4e,0xc1,0x82,0x51,0xfb,0x4d,0xee,0xf6,0xa0,0x48,0xe7,0xb0,0x2b,0x40,0xa9,0x16,0xcf,0x60,0x64,0xb2,0x7d,0x6a,0x95,0x20,0x8d,
+ 0x04,0x20,0x05,0xb2,0xd0,0xac,0x42,0xe6,0x2a,0x57,0x08,0x47,0x67,0xf6,0x6b,0x1a,0x68,0x37,0xdc,0x7b,0xde,0x59,0x65,0xaf,0xd2,0xcf,0xb1,0x78,0x48,0xd7,0x69,0x1e,0x2d,0x96,0x20,0x8d,
+ 0x04,0x20,0x06,0x4b,0xbc,0xc7,0x8b,0x1c,0x7f,0xc6,0x91,0x93,0xee,0x77,0xcd,0x30,0x8b,0x8d,0x62,0x52,0xb3,0xb0,0xb7,0x21,0x7e,0x3f,0x9f,0xc9,0x5c,0xab,0x42,0x8f,0xb6,0xcd,0x20,0x8d,
+ 0x04,0x20,0x06,0x6a,0x84,0xf6,0x9e,0x01,0x88,0x4d,0x0d,0x7a,0x57,0xc8,0x7d,0x11,0x68,0x85,0x36,0x5d,0x8f,0xa6,0x58,0xf3,0x77,0x0d,0xce,0xfc,0x26,0x92,0xa1,0x58,0xf1,0x2d,0x20,0x8d,
+ 0x04,0x20,0x0e,0xd2,0x68,0x95,0xe8,0x14,0x1f,0x86,0x3b,0xda,0x90,0xcc,0x56,0x54,0xca,0xf7,0x4d,0x6e,0x7e,0x27,0x8e,0x91,0x8b,0x46,0x92,0x4e,0xa2,0x59,0x6d,0xe8,0xb5,0x8f,0x20,0x8d,
+ 0x04,0x20,0x0f,0x8a,0xb4,0x90,0x9c,0x4c,0x41,0x18,0x6b,0x77,0xe3,0xde,0xdb,0x51,0x6b,0x1c,0xe5,0x89,0x42,0xa8,0x53,0x5e,0x69,0x8e,0x9d,0x02,0x32,0xf5,0x5d,0xcc,0x51,0xab,0x20,0x8d,
+ 0x04,0x20,0x08,0x05,0x62,0x54,0xf9,0x34,0xf2,0x6b,0xd4,0x6a,0x55,0xb1,0x55,0x02,0xf2,0xbd,0x8e,0xa3,0xc2,0xc0,0xf1,0xc3,0xb1,0x56,0x88,0xca,0x64,0x83,0xd9,0x4b,0x81,0xe4,0x20,0x8d,
+ 0x04,0x20,0x08,0x06,0x92,0x85,0x28,0x18,0xd2,0xf6,0xc6,0x9f,0x69,0x18,0xc9,0x09,0x93,0x91,0xf0,0x81,0x0e,0xcc,0x62,0x79,0x31,0x13,0x5b,0xae,0xd0,0x83,0xa4,0xfd,0x9c,0xa9,0x20,0x8d,
+ 0x04,0x20,0x08,0x1f,0xd4,0x73,0x94,0xb8,0x9c,0xe6,0x01,0x4c,0xb0,0x92,0xb9,0x72,0x4f,0xb1,0xf7,0x44,0x3d,0x68,0x44,0xcb,0x2f,0x30,0xaa,0x88,0xb2,0x36,0xcb,0x02,0xd7,0xcd,0x20,0x8d,
+ 0x04,0x20,0x08,0x78,0xdd,0xdf,0x74,0x00,0x8a,0x31,0xf1,0xdf,0x6f,0xae,0xb3,0x39,0x8d,0x74,0xe7,0xdd,0xed,0x49,0x48,0xe2,0x96,0xbd,0xde,0x7c,0xc2,0x83,0x3c,0x9d,0x3e,0xbc,0x20,0x8d,
+ 0x04,0x20,0x08,0x4b,0xf9,0xc2,0x01,0x33,0x55,0xd5,0x02,0x7e,0x5c,0xee,0x95,0x82,0xe4,0x8d,0x20,0x4c,0x61,0xd5,0x0d,0xe4,0x2d,0x84,0x14,0x12,0x41,0x1f,0x80,0x91,0x5c,0x3c,0x20,0x8d,
+ 0x04,0x20,0x08,0xe2,0xce,0xc2,0xf4,0x75,0xfe,0xa9,0x50,0x2d,0x65,0x88,0xe7,0x4e,0x97,0x38,0x79,0x5d,0xc1,0xf5,0x7f,0xca,0xa5,0x58,0x03,0x05,0x73,0x0a,0x9b,0x0f,0xa4,0xf0,0x20,0x8d,
+ 0x04,0x20,0x09,0x90,0xcc,0xf3,0xf1,0x84,0x3c,0xd8,0xff,0x19,0x48,0x28,0x28,0xdf,0x8b,0x59,0x43,0x38,0xe2,0x6e,0x75,0xd4,0xfc,0x77,0xee,0x52,0x4f,0x40,0xe7,0xca,0x15,0xd6,0x20,0x8d,
+ 0x04,0x20,0x0a,0x1f,0x23,0xba,0xdc,0x6e,0xa8,0x73,0x14,0x3f,0x66,0x3a,0x31,0xb0,0x90,0x6e,0xf1,0x2b,0x9a,0x72,0x2d,0x97,0x97,0xeb,0x07,0x81,0xbc,0x4b,0xff,0x3f,0x35,0x32,0x20,0x8d,
+ 0x04,0x20,0x0a,0xca,0xf8,0x55,0x82,0x41,0x15,0x39,0x43,0x38,0xe7,0x83,0x22,0x71,0x99,0xc5,0xdf,0x20,0xec,0x79,0xe6,0x7f,0x67,0xba,0x85,0x4c,0x78,0x3d,0xce,0xb9,0x41,0xa6,0x20,0x8d,
+ 0x04,0x20,0x0b,0xa7,0x72,0x57,0xd5,0x27,0xe9,0x23,0x8e,0xc3,0x50,0x4d,0x24,0x64,0x3d,0x57,0x68,0x67,0x64,0xb2,0x9f,0x2f,0xd7,0xce,0x40,0x9e,0xd9,0x46,0xc7,0xa4,0xc4,0x2f,0x20,0x8d,
+ 0x04,0x20,0x0c,0x56,0x04,0xd0,0x44,0xf9,0x48,0x73,0x03,0x78,0xd1,0x61,0xfe,0xc6,0xcc,0xf6,0xc8,0x2a,0xb7,0x07,0xd9,0x2b,0x2c,0x0f,0x00,0x3f,0xb4,0x3e,0xdf,0xec,0xce,0x59,0x20,0x8d,
+ 0x04,0x20,0x0c,0xb3,0x86,0xc8,0xc4,0xc9,0x3e,0xce,0xad,0x4d,0x40,0x4c,0x46,0xe7,0xb1,0x5f,0x32,0x22,0x91,0x7f,0x5b,0x93,0x72,0x79,0x3c,0xc7,0x80,0x41,0x16,0x73,0x2c,0xdd,0x20,0x8d,
+ 0x04,0x20,0x0d,0x34,0x17,0x93,0x74,0x16,0x2d,0x2f,0x14,0x39,0x22,0x80,0x36,0x84,0xa3,0xba,0x61,0xcc,0xee,0x70,0xbc,0x8c,0xf6,0xd5,0x9b,0xf3,0x4b,0xd9,0x92,0x5b,0xa6,0xfe,0x20,0x8d,
+ 0x04,0x20,0x0d,0x37,0x73,0x31,0x21,0x9a,0x8a,0xa5,0x75,0x30,0xc6,0xc4,0xa1,0xa2,0xb6,0x29,0xa8,0x52,0x15,0xe2,0xe6,0xf0,0x2c,0xcb,0x2f,0x8a,0x0c,0x66,0xaa,0x41,0x20,0x1f,0x20,0x8d,
+ 0x04,0x20,0x0d,0xfd,0x9f,0x1d,0x4a,0xa7,0x55,0x28,0x43,0xde,0x2d,0x21,0x13,0x1c,0x20,0xcf,0x02,0xab,0x6a,0x14,0xe5,0x11,0x5e,0x42,0xe0,0x49,0x59,0x06,0xc4,0xa4,0x4c,0xd8,0x20,0x8d,
+ 0x04,0x20,0x0e,0x43,0xfe,0x51,0xb2,0x35,0xe9,0x5d,0xda,0x2a,0x4e,0x48,0x4e,0x36,0xe4,0xfa,0x9a,0xc2,0xf3,0x80,0xdc,0xc3,0x69,0x17,0xab,0x4d,0x4a,0x24,0x7c,0xe9,0x40,0xd8,0x20,0x8d,
+ 0x04,0x20,0x0e,0x5b,0x60,0x33,0x7f,0xa1,0xde,0x4a,0x38,0x62,0x9e,0x9e,0xfb,0xa9,0xc4,0xe1,0xfd,0x79,0x6f,0xf5,0x48,0x7d,0xc1,0x3c,0x3a,0xd0,0x10,0x02,0x9f,0xfd,0xa8,0x03,0x20,0x8d,
+ 0x04,0x20,0x17,0xb9,0x71,0x0a,0x62,0xbf,0xc0,0x45,0xa7,0xb8,0xc6,0xa5,0x70,0x7d,0x28,0x6b,0xd1,0xfb,0x64,0xf9,0xcd,0x47,0x81,0xc7,0xa0,0x82,0xd7,0x9a,0x68,0xb9,0x35,0x0a,0x20,0x8d,
+ 0x04,0x20,0x17,0x8a,0xe5,0x69,0xa6,0xee,0x76,0x9a,0xab,0x61,0x0d,0x12,0xd7,0xc6,0x5a,0x12,0xf4,0x79,0xac,0xaf,0x3c,0xfa,0x71,0x92,0x67,0x6a,0x94,0x5c,0x14,0xe6,0xf5,0x91,0x20,0x8d,
+ 0x04,0x20,0x17,0x95,0xb4,0x73,0x5c,0xee,0x3c,0x77,0x36,0x32,0xb9,0x44,0xcd,0x2f,0xa6,0x13,0x5b,0xd8,0xac,0x40,0x9d,0xf3,0x8c,0x50,0x25,0xda,0xa8,0x13,0xe4,0x75,0x35,0xdc,0x20,0x8d,
+ 0x04,0x20,0x10,0x4c,0xf1,0xdd,0xd1,0x21,0x34,0x43,0x73,0x77,0x60,0xf9,0x2c,0xb8,0x00,0xb4,0xa6,0x1b,0xc2,0xae,0xea,0x83,0xad,0xab,0x1d,0x09,0x33,0xa7,0xc3,0xfd,0x57,0xea,0x20,0x8d,
+ 0x04,0x20,0x10,0x5b,0x4b,0xd1,0xf0,0x82,0xf9,0xab,0x10,0xb9,0x93,0xd2,0x4e,0xda,0x0a,0x00,0x28,0xad,0x31,0x5e,0x7c,0xe0,0x1f,0x28,0xeb,0x27,0x39,0xb0,0x4e,0x72,0x03,0x5b,0x20,0x8d,
+ 0x04,0x20,0x10,0xac,0x79,0x2d,0x92,0x34,0x96,0x09,0x8f,0x1b,0xfc,0xe5,0x06,0xff,0xae,0x4d,0xe7,0x62,0x1b,0x60,0xf7,0x9e,0x75,0xdd,0x9c,0x77,0xe5,0xb3,0x78,0x38,0x4f,0x2f,0x20,0x8d,
+ 0x04,0x20,0x10,0xad,0x47,0xb2,0x8f,0xff,0xa1,0x04,0xb2,0x79,0xa2,0x2b,0xb3,0xbd,0x1b,0xa7,0xc0,0xa8,0x4c,0x9b,0x1f,0xad,0x9a,0x54,0x84,0xec,0x9e,0x4e,0x2c,0x43,0xc9,0x16,0x20,0x8d,
+ 0x04,0x20,0x11,0x4c,0xe2,0x7b,0x43,0xff,0x9a,0xde,0x78,0xfa,0x1b,0xff,0x49,0xf1,0xc8,0x30,0x77,0xd5,0x29,0xe7,0x47,0x4c,0x7c,0xb7,0xe7,0x64,0xae,0xbc,0x76,0x05,0x42,0x56,0x20,0x8d,
+ 0x04,0x20,0x14,0x43,0x0a,0x6d,0xb2,0xa0,0x0d,0xfc,0x6c,0xb3,0xc6,0xa5,0xa7,0x79,0x47,0x35,0xd7,0xc5,0x76,0xc5,0x0b,0x7c,0xc3,0x53,0x1a,0x55,0x46,0x1c,0x06,0xb3,0x0c,0x32,0x20,0x8d,
+ 0x04,0x20,0x14,0x60,0x4e,0x8d,0x1d,0x7d,0x15,0xa2,0x1d,0x28,0xb6,0xa3,0x4a,0x40,0x10,0x61,0x0a,0x2f,0x1e,0xd1,0xc3,0xba,0x27,0xa0,0x58,0xc0,0xd5,0x72,0x28,0x61,0xcb,0x5d,0x20,0x8d,
+ 0x04,0x20,0x14,0xf4,0x89,0x7f,0xe6,0xc4,0x08,0x25,0x3e,0x14,0xda,0x8e,0x3a,0xe6,0xb0,0xe8,0x59,0xb1,0x3a,0xc8,0xba,0x2e,0x35,0x98,0x03,0x01,0x55,0x51,0xe4,0x95,0x45,0xb1,0x20,0x8d,
+ 0x04,0x20,0x14,0xe6,0xef,0xed,0x0e,0x15,0x4c,0x95,0x46,0x9e,0x45,0xbd,0xa0,0x78,0xf1,0x27,0x17,0x40,0xc3,0x4a,0x5d,0x28,0xfc,0x13,0x43,0x6b,0xf9,0x10,0x5e,0x3a,0xa4,0x4d,0x20,0x8d,
+ 0x04,0x20,0x16,0x39,0x49,0xe0,0x6c,0x0d,0x64,0xfc,0x94,0x39,0xd5,0x46,0xbc,0xd2,0x97,0x56,0x31,0x93,0xa6,0x94,0x64,0x41,0xf5,0x2d,0x5e,0x72,0x50,0xf9,0xd7,0xf8,0xf0,0xa8,0x20,0x8d,
+ 0x04,0x20,0x1e,0x98,0xb3,0xb9,0x89,0x0c,0x13,0x7a,0xf9,0x8d,0xf5,0xef,0xbb,0xa2,0x3d,0xbf,0x7a,0x98,0xb2,0xfb,0xfb,0xf3,0xa9,0x59,0x9d,0x66,0xc1,0x11,0x4d,0xf3,0xfb,0x75,0x20,0x8d,
+ 0x04,0x20,0x1f,0x00,0x23,0x5d,0xd2,0xce,0x19,0x64,0xc5,0x29,0x16,0x04,0xb3,0xcf,0x59,0xcc,0x39,0xf7,0xb9,0x87,0x05,0x64,0x02,0xdd,0x04,0x8d,0x48,0x98,0x63,0x28,0x78,0xfb,0x20,0x8d,
+ 0x04,0x20,0x1f,0x04,0xb1,0x3f,0x2b,0xf7,0x9d,0x66,0x7e,0x7b,0x7b,0x3e,0x2c,0x87,0xf9,0xc9,0xa5,0x02,0x15,0xe3,0x3f,0x5e,0xb8,0xb4,0xb8,0x78,0x41,0xf2,0xe9,0x88,0x51,0x6b,0x20,0x8d,
+ 0x04,0x20,0x1f,0x12,0xd4,0x33,0xce,0x97,0xc3,0x23,0xc5,0x26,0x79,0x48,0x29,0x1b,0x88,0xd1,0xb7,0x59,0xf0,0x19,0xc0,0xa5,0x2a,0x40,0x07,0x45,0x1f,0x21,0xfc,0xf6,0x9a,0x5e,0x20,0x8d,
+ 0x04,0x20,0x1f,0x64,0x3f,0x61,0x14,0xb4,0xfb,0x19,0xcb,0xd7,0x31,0xf1,0x64,0x1c,0xd7,0x78,0x4a,0x83,0xfe,0x22,0x8d,0x75,0x40,0xcf,0xa6,0x3f,0x9a,0x5f,0x7c,0x65,0xbc,0x3a,0x20,0x8d,
+ 0x04,0x20,0x1f,0xdb,0x25,0xc0,0x99,0xd2,0xb9,0x13,0xd6,0xe1,0x36,0x95,0x72,0x0d,0x79,0xc3,0xb1,0x3d,0x1b,0x6d,0xa9,0x16,0x26,0xa3,0x06,0xfd,0xe8,0x2d,0x15,0x03,0x99,0xa5,0x20,0x8d,
+ 0x04,0x20,0x18,0x18,0x43,0x64,0x4e,0x30,0xdf,0xd5,0xd7,0x0f,0x46,0x3a,0xfe,0x95,0xde,0x59,0x5c,0xce,0xcb,0x85,0xad,0x2c,0x0d,0x59,0x2b,0x66,0x84,0xc9,0x34,0xe7,0x78,0x80,0x20,0x8d,
+ 0x04,0x20,0x18,0x7a,0x09,0xcb,0x17,0xdb,0x7d,0xb1,0xe0,0x5d,0xa3,0xe8,0x9a,0x32,0x4f,0xd0,0x7a,0x94,0x1c,0x05,0xbb,0xed,0xc9,0xbf,0x8a,0xe3,0xda,0xb6,0x04,0x07,0x42,0xd0,0x20,0x8d,
+ 0x04,0x20,0x19,0x89,0x98,0x9f,0x6a,0x28,0x9a,0x69,0x56,0x85,0xbf,0x57,0x17,0xf9,0xae,0x18,0xa4,0x7c,0x68,0xb2,0xdd,0xb8,0xb9,0x81,0x76,0x9e,0x89,0x38,0xf2,0x15,0xae,0x17,0x20,0x8d,
+ 0x04,0x20,0x19,0xd0,0xf5,0x70,0xfd,0xbc,0x80,0xdd,0x25,0x29,0x28,0x91,0xa7,0xad,0x2d,0xc6,0x36,0x87,0xef,0x93,0x65,0x33,0x89,0xea,0x27,0xfe,0x56,0xc2,0x67,0x23,0x14,0x09,0x20,0x8d,
+ 0x04,0x20,0x1a,0x49,0xb6,0xba,0xab,0x76,0x59,0xd1,0x11,0x58,0xf3,0x5e,0x19,0xfe,0x09,0x69,0x78,0x46,0x51,0x1e,0x2f,0x30,0x6b,0x14,0xe7,0xc7,0x7e,0x31,0xa8,0x12,0xae,0x3f,0x20,0x8d,
+ 0x04,0x20,0x1b,0x51,0xa8,0xa6,0xb0,0x27,0x76,0x67,0xb0,0x71,0xde,0x14,0x76,0xca,0x88,0x90,0x93,0x8f,0x77,0xa9,0xf2,0x23,0xde,0xd0,0x86,0x19,0x90,0xe3,0x2a,0xd9,0xf8,0x86,0x20,0x8d,
+ 0x04,0x20,0x1b,0x71,0x5c,0x1a,0x1a,0x1b,0x2a,0x4a,0xe7,0xc0,0x48,0x8b,0xb0,0x48,0x7b,0x1f,0x45,0x06,0x3c,0x95,0x77,0x39,0x0c,0x4f,0x6a,0x67,0x7e,0xdc,0x4b,0x13,0xff,0x62,0x20,0x8d,
+ 0x04,0x20,0x1c,0x00,0x4c,0x1c,0xbd,0xaf,0x39,0xfd,0x0f,0x06,0x00,0x62,0x01,0x2f,0x2d,0x29,0xe7,0x8c,0x4e,0xd8,0xe1,0xc7,0x58,0xa6,0x00,0x8d,0x90,0x9f,0xc2,0x9b,0xff,0x64,0x20,0x8d,
+ 0x04,0x20,0x1d,0x12,0x22,0x94,0x19,0x1c,0xe6,0x4b,0x4b,0xe1,0x24,0x5b,0x4a,0xfe,0xc4,0x75,0xf6,0x09,0x29,0x6d,0xb5,0x33,0x09,0x0d,0xd8,0xcc,0x2f,0x8d,0xad,0xc6,0x2d,0x1f,0x20,0x8d,
+ 0x04,0x20,0x1d,0x78,0x39,0xe7,0xb9,0xa6,0xe6,0x4d,0x9b,0x42,0x14,0x73,0xb6,0xc4,0xc2,0x2e,0x5d,0x98,0x12,0x46,0x61,0xa6,0x1e,0x81,0xd9,0x3a,0x8c,0xe6,0xc2,0xc6,0xd8,0xd0,0x20,0x8d,
+ 0x04,0x20,0x1d,0x73,0x6c,0x06,0x2a,0x16,0x1b,0x92,0xa4,0xdc,0x4b,0xc4,0xa9,0xf5,0x54,0x69,0x87,0xc6,0xca,0x01,0xb6,0x17,0x23,0x85,0x64,0x95,0x2d,0x92,0xae,0xae,0x13,0x39,0x20,0x8d,
+ 0x04,0x20,0x1d,0xd4,0xac,0x4e,0x01,0xaa,0xf8,0x73,0xd8,0xfd,0x47,0xa9,0xff,0xc6,0xfa,0x8a,0x90,0x20,0x53,0xc3,0xc6,0x0d,0x3f,0x5c,0x96,0x36,0x36,0x07,0x85,0xcb,0xb7,0xad,0x20,0x8d,
+ 0x04,0x20,0x1e,0x4e,0x78,0x3c,0x93,0xae,0x21,0xd3,0x7a,0xe7,0x36,0x3e,0x65,0x52,0xc4,0xc6,0xb6,0x39,0x3b,0xd2,0x17,0xd2,0x1e,0xa2,0x2b,0x11,0x65,0xf1,0x04,0xa0,0x20,0xb6,0x20,0x8d,
+ 0x04,0x20,0x26,0xbc,0x0e,0x05,0xf7,0x42,0x68,0x7e,0x35,0x84,0x83,0x3a,0x6f,0x0f,0x48,0x8f,0x8f,0xa1,0x5b,0x16,0xfa,0x3e,0xd8,0xba,0xf8,0xfc,0xb9,0x87,0x68,0x8e,0x37,0x2b,0x20,0x8d,
+ 0x04,0x20,0x27,0x0e,0x30,0x39,0x8c,0x63,0x39,0x8f,0x43,0xda,0x37,0x53,0x53,0xf9,0x93,0x13,0xa7,0xba,0x9e,0x09,0xe6,0xac,0xc7,0x3d,0x9b,0xd0,0x69,0xb2,0x4e,0x23,0x77,0x6a,0x20,0x8d,
+ 0x04,0x20,0x27,0x59,0x90,0xe4,0x75,0x7b,0x4d,0x74,0xa8,0x25,0x87,0xfc,0x71,0xbc,0xb3,0x46,0xec,0x88,0xda,0x04,0xcd,0x0d,0x00,0x2a,0x4f,0x88,0xc5,0x30,0xed,0xfb,0xa3,0x6d,0x20,0x8d,
+ 0x04,0x20,0x20,0x21,0x7c,0x51,0x38,0x64,0x33,0x60,0x33,0x05,0xec,0x26,0x10,0xb6,0xb2,0x9d,0x39,0x23,0x6c,0x35,0xed,0x18,0xf5,0x66,0xe9,0x0c,0x81,0x70,0x33,0x25,0xa7,0xae,0x20,0x8d,
+ 0x04,0x20,0x20,0xaf,0xc7,0x97,0xe6,0xb0,0xde,0xb5,0x80,0xbb,0x96,0x7c,0xd9,0x10,0x3c,0xd3,0x92,0x67,0xec,0x53,0x77,0x6e,0xee,0xa7,0xd5,0x6f,0xc0,0x5a,0x72,0x4f,0x10,0xa8,0x20,0x8d,
+ 0x04,0x20,0x20,0xf8,0x86,0x43,0x9c,0xe2,0x17,0xd7,0xbf,0xa6,0x54,0xb7,0x84,0x30,0xc7,0xda,0x7f,0x5d,0xd4,0xff,0x86,0x07,0x9c,0x65,0x52,0xad,0x75,0xad,0x10,0x34,0x1b,0xb1,0x20,0x8d,
+ 0x04,0x20,0x21,0xc9,0x06,0x3a,0x42,0xce,0x93,0x00,0x7b,0x61,0xe7,0xf5,0xde,0xbd,0x4a,0x6a,0xfd,0xde,0xdd,0x49,0x09,0xac,0x77,0x92,0x88,0x8e,0x0b,0x14,0xf8,0xea,0x2f,0x2b,0x20,0x8d,
+ 0x04,0x20,0x22,0x31,0x6a,0x5c,0xfa,0x3d,0x8e,0xad,0x40,0x0b,0x2d,0x61,0x32,0xd5,0x3c,0x5a,0x68,0x4c,0xed,0xda,0x1f,0x06,0x48,0x31,0xd6,0x00,0x44,0x8e,0x3b,0x64,0xab,0x0c,0x20,0x8d,
+ 0x04,0x20,0x22,0x4c,0x42,0x2d,0x8c,0xf6,0xb0,0x64,0x7a,0x34,0xc3,0x55,0x99,0xf6,0x71,0x3f,0xf1,0x2d,0x0a,0x46,0xaa,0xaf,0x91,0x4f,0x90,0x7c,0xd7,0x68,0x08,0x6d,0x7c,0x11,0x20,0x8d,
+ 0x04,0x20,0x22,0x63,0x85,0x60,0x89,0x55,0x3a,0x35,0xb2,0x99,0xf3,0x9b,0xa7,0xa3,0xf8,0x92,0x4d,0xe1,0x75,0xf4,0xa3,0xac,0xd0,0xe2,0x76,0x64,0x3e,0xca,0xdb,0xd7,0xc4,0x03,0x20,0x8d,
+ 0x04,0x20,0x23,0x45,0xc8,0x5d,0xd8,0x70,0x1f,0xd6,0x8e,0x3f,0x1d,0x09,0x56,0x24,0xf5,0xd6,0x44,0xf7,0x47,0x62,0xdf,0x3f,0xdd,0x6f,0x00,0x2b,0xbc,0x29,0xf2,0x79,0x4f,0x3b,0x20,0x8d,
+ 0x04,0x20,0x24,0xf4,0x92,0xf9,0xa4,0x51,0x19,0xbb,0xf7,0x73,0xc6,0x44,0x72,0x41,0xdf,0x04,0x7f,0xbb,0x1b,0x81,0xc6,0xe8,0x2a,0xe7,0x09,0x2a,0xd1,0x45,0xff,0x7d,0xf8,0x88,0x20,0x8d,
+ 0x04,0x20,0x24,0xc1,0xdf,0x81,0x6a,0x9b,0x39,0x93,0xd4,0xfb,0x05,0x5d,0x1d,0x27,0xa7,0x09,0xc6,0x02,0x2c,0x3b,0x8f,0xd3,0x8d,0x1d,0x0f,0x88,0x0a,0x59,0x61,0xfe,0x0e,0x5d,0x20,0x8d,
+ 0x04,0x20,0x24,0xc4,0x00,0xe1,0x96,0xa3,0x54,0xaa,0xb6,0xfc,0x2d,0x8c,0x71,0x73,0xf0,0x2e,0xa0,0x5e,0x22,0xfb,0x4c,0xf2,0x53,0xbf,0x86,0x71,0xf0,0x71,0x0d,0x01,0x37,0xa4,0x20,0x8d,
+ 0x04,0x20,0x24,0xd3,0xab,0x6f,0x21,0xc7,0xce,0x50,0x2c,0x78,0xdf,0x07,0x2a,0x4e,0x75,0x4c,0xd0,0xcc,0x58,0xf5,0x82,0x51,0x35,0x6e,0xdf,0xed,0x0a,0xf8,0xca,0x04,0xe7,0xeb,0x20,0x8d,
+ 0x04,0x20,0x28,0x69,0x50,0xb3,0x8a,0x22,0x83,0xbb,0x64,0x9e,0xbb,0x84,0x80,0xa5,0x57,0x6a,0xb0,0x9d,0x77,0xee,0x9f,0x87,0xdd,0x6f,0x9a,0x0e,0x6b,0x59,0x72,0x99,0x56,0xb0,0x20,0x8d,
+ 0x04,0x20,0x2a,0x0d,0xf9,0xdd,0xcb,0x2e,0xe6,0x78,0xb8,0x93,0x54,0x65,0xac,0x84,0xe4,0xaf,0x3d,0x18,0x6a,0x03,0xff,0x73,0x1f,0xbc,0x6d,0x61,0x2c,0x66,0x99,0x82,0x91,0x29,0x20,0x8d,
+ 0x04,0x20,0x2a,0xcc,0x41,0xe0,0xec,0x74,0x58,0x3c,0x46,0xf0,0x98,0x31,0x9f,0x75,0x4f,0x61,0xad,0xc0,0xb0,0xcf,0x8f,0xa5,0x32,0x1b,0x91,0xf9,0xd2,0x8b,0xb5,0x2e,0xb0,0xc0,0x20,0x8d,
+ 0x04,0x20,0x2a,0xd0,0xe7,0x67,0xea,0x87,0x96,0x9f,0x12,0x5c,0xea,0x4d,0xbd,0x37,0xde,0x4c,0x3c,0xcc,0x2d,0x10,0x0b,0x72,0x6d,0x23,0x14,0x95,0x1b,0xd1,0xcf,0xb3,0xc5,0xcd,0x20,0x8d,
+ 0x04,0x20,0x2d,0xb0,0xa1,0x7d,0xd6,0xf2,0x38,0xed,0x33,0xf5,0xc1,0x98,0x62,0x8d,0x44,0xae,0x21,0x5b,0x68,0xd2,0x78,0xcb,0xe5,0xde,0x25,0x38,0xc8,0xc0,0x2c,0x3b,0xe0,0xc2,0x20,0x8d,
+ 0x04,0x20,0x36,0xe3,0x9a,0x1a,0x7c,0x0f,0x23,0x5d,0x62,0x1a,0xf7,0x92,0x40,0x61,0x55,0x0d,0x7f,0xe6,0xb6,0x08,0xf7,0xf7,0xd6,0x98,0xee,0xa8,0xa4,0xda,0xe2,0x16,0x61,0x5d,0x20,0x8d,
+ 0x04,0x20,0x37,0x1c,0x98,0x83,0x68,0x6b,0x38,0xbd,0x75,0xff,0xca,0xf5,0xed,0xd7,0x3a,0x5e,0x75,0x0a,0x16,0xd3,0x4d,0x96,0x43,0xdb,0x25,0x2a,0x37,0x52,0xc6,0x84,0x2e,0x94,0x20,0x8d,
+ 0x04,0x20,0x37,0x43,0x20,0x60,0x5b,0xbe,0xb6,0x55,0x2a,0x52,0x7c,0xd8,0xb5,0xd3,0x50,0x6f,0x14,0x6f,0xa5,0x4f,0x12,0xf8,0x5b,0xf4,0x83,0x48,0x48,0x27,0x27,0x0c,0x45,0x14,0x20,0x8d,
+ 0x04,0x20,0x37,0x63,0xaa,0x0c,0x1e,0xb1,0xe4,0x69,0x7b,0xb8,0x2f,0xeb,0xfc,0x3a,0x0c,0x83,0x94,0x15,0x41,0x16,0xa9,0xac,0x94,0x18,0x89,0xf7,0x31,0x25,0x2b,0x72,0x52,0xc9,0x20,0x8d,
+ 0x04,0x20,0x37,0x69,0x4a,0xa0,0x66,0x55,0x46,0x5d,0x09,0x8e,0x22,0x8c,0x6c,0x85,0x05,0xc8,0x5c,0x93,0xfc,0x6d,0xff,0x49,0xfe,0xe3,0xf5,0xd2,0x0d,0xd4,0x95,0x6a,0xc2,0x99,0x20,0x8d,
+ 0x04,0x20,0x37,0xec,0xd7,0x65,0xa3,0x8a,0x24,0x1a,0x53,0xde,0xe5,0xf2,0x1b,0x5b,0x34,0xa2,0x3e,0x1e,0xdd,0x54,0xc9,0x49,0x6d,0xdd,0x85,0x62,0xc7,0xdc,0x5b,0xd8,0x7c,0xad,0x20,0x8d,
+ 0x04,0x20,0x31,0x7d,0x5c,0x40,0x99,0x74,0xb5,0x2e,0xe9,0x57,0xb6,0x76,0x89,0xbd,0x80,0xed,0x9a,0x1f,0x6d,0xcb,0xfc,0x0d,0xb5,0x52,0xd7,0x37,0x77,0xf9,0x11,0x33,0xa7,0x52,0x20,0x8d,
+ 0x04,0x20,0x31,0x5d,0x02,0xb7,0x95,0x5b,0x72,0xae,0x38,0x51,0xb1,0x0d,0x08,0x99,0x99,0x61,0x62,0x8b,0x47,0x26,0x6d,0xfe,0x91,0xbd,0x0d,0x82,0xb0,0x14,0x0e,0x78,0x9f,0xd4,0x20,0x8d,
+ 0x04,0x20,0x32,0x8d,0x41,0xec,0x0b,0x85,0xbf,0x58,0x62,0xd3,0x05,0xa5,0x29,0x3a,0xac,0xaa,0x8f,0x25,0xc2,0x3c,0xb9,0x1b,0x16,0x44,0xde,0x73,0x3c,0x85,0xa6,0x81,0xeb,0xb4,0x20,0x8d,
+ 0x04,0x20,0x32,0xaa,0x63,0x18,0xbd,0x35,0x20,0x2c,0x1b,0x16,0x59,0x1a,0xc2,0x75,0x8b,0xf8,0xcd,0x35,0x3d,0x2c,0x0c,0xc8,0xc9,0x05,0x76,0x19,0x2f,0xe4,0xd7,0xaa,0xab,0xc5,0x20,0x8d,
+ 0x04,0x20,0x32,0xdf,0xdc,0xef,0xc9,0xa6,0x79,0x92,0x9f,0xf3,0x75,0x13,0xd9,0x84,0x47,0x7c,0x44,0x50,0x8d,0xf3,0x19,0xc4,0x8f,0xc8,0xf8,0xc2,0x18,0x3f,0x04,0x29,0x58,0x90,0x20,0x8d,
+ 0x04,0x20,0x33,0xa6,0x95,0x65,0x35,0xa3,0x78,0xfd,0x92,0x60,0x2e,0xf6,0xfd,0x7a,0xab,0xb4,0xd8,0xb1,0x13,0x13,0xc6,0x1b,0x20,0x99,0x0a,0x68,0x79,0x38,0x83,0x72,0x6a,0xf5,0x20,0x8d,
+ 0x04,0x20,0x33,0xe6,0x2c,0x65,0x2a,0x86,0x67,0xdf,0x47,0x80,0xe6,0xc9,0x13,0x22,0xe8,0x5a,0x4e,0x40,0xe3,0xbb,0x9f,0x6f,0x30,0xfc,0x62,0x85,0xfc,0x72,0xa9,0xf3,0xe9,0x7d,0x20,0x8d,
+ 0x04,0x20,0x33,0xf3,0x67,0xe5,0x06,0x2c,0x4e,0xac,0x1c,0x5b,0x5f,0x64,0xb5,0xbb,0x5c,0x1d,0x2e,0x0f,0x3a,0x92,0x6a,0xba,0xe8,0xf3,0x89,0x94,0x66,0x34,0xeb,0x83,0x94,0xdc,0x20,0x8d,
+ 0x04,0x20,0x34,0x05,0x09,0x3f,0xca,0x98,0x18,0xad,0x58,0x03,0xfc,0xb1,0xa8,0x53,0x12,0xba,0x2a,0x6a,0x6c,0xc9,0xba,0x27,0x7f,0xaa,0x2f,0xb1,0xa4,0x7d,0xfc,0x52,0x5a,0xef,0x20,0x8d,
+ 0x04,0x20,0x34,0x55,0x1a,0x64,0x20,0xe7,0x22,0xce,0xb3,0x86,0x56,0x08,0x94,0xb7,0x7d,0xb5,0xc2,0xbb,0xba,0x5c,0x08,0x35,0x59,0x23,0xe3,0x1e,0x53,0x40,0xf3,0x78,0x1b,0x62,0x20,0x8d,
+ 0x04,0x20,0x35,0xf6,0x79,0x62,0xe5,0xd2,0x72,0xd4,0x1c,0xcf,0x8c,0xd4,0x03,0x41,0x2d,0x7d,0x84,0xfe,0x1d,0x7c,0x57,0x54,0x32,0x77,0xa6,0x76,0xab,0x32,0x8b,0x27,0xd4,0xf5,0x20,0x8d,
+ 0x04,0x20,0x36,0x66,0x4d,0x9f,0xf7,0xec,0x13,0x91,0x87,0x08,0x0c,0x5f,0x12,0x97,0x25,0xd3,0x32,0xc3,0xb1,0x47,0xce,0x19,0x0f,0xe6,0x5c,0x54,0x8d,0x69,0x4c,0x77,0x98,0xdf,0x20,0x8d,
+ 0x04,0x20,0x3f,0xd4,0x58,0x1b,0xcb,0x2f,0xeb,0xd1,0xe2,0xd2,0xb0,0xf2,0xa0,0x68,0x84,0x78,0xf0,0x88,0x22,0x20,0xf3,0x00,0xc4,0xf9,0x7f,0x88,0x33,0x4b,0x91,0x2b,0x93,0xdc,0x20,0x8d,
+ 0x04,0x20,0x3f,0xe2,0xe8,0xcb,0xb9,0x41,0xce,0x63,0x8b,0x13,0x8f,0x96,0x7f,0xd8,0xcc,0x43,0x80,0x79,0xe8,0x34,0x0c,0x97,0x25,0x23,0x8e,0xdb,0x41,0x2e,0x2d,0xb0,0xb4,0x38,0x20,0x8d,
+ 0x04,0x20,0x38,0x0c,0xa1,0xe8,0xd0,0xdd,0x7c,0x0e,0x69,0x71,0x02,0xc2,0xf6,0x1d,0xe2,0x4a,0x56,0x62,0xc3,0xcb,0x20,0xc8,0x62,0x6c,0x01,0x2b,0xed,0x54,0xf5,0x6d,0xfe,0x07,0x20,0x8d,
+ 0x04,0x20,0x38,0x15,0x46,0x7f,0x14,0xc7,0x20,0xf4,0xe6,0x9f,0x16,0x70,0xbe,0xa7,0x4d,0x6a,0xd1,0xd6,0x5b,0x65,0xbe,0x8b,0x74,0x8a,0xc5,0x4c,0xb6,0x68,0xf6,0xaa,0x32,0xe2,0x20,0x8d,
+ 0x04,0x20,0x38,0x94,0x67,0xfc,0x12,0xd2,0x88,0xf3,0xb9,0xd2,0x74,0x09,0xcd,0x57,0x48,0x0c,0xfa,0xed,0xa8,0xc9,0x26,0x22,0x61,0x05,0x0f,0x42,0xee,0xda,0x1e,0x11,0x3d,0xd8,0x20,0x8d,
+ 0x04,0x20,0x39,0xbd,0x2c,0x5f,0x8e,0xc5,0x62,0x28,0x82,0xf8,0x9c,0x30,0xc4,0xe8,0x2b,0x69,0x9f,0x64,0xa3,0xb1,0x39,0x42,0x96,0x99,0x6e,0xfc,0xeb,0x92,0xbd,0x82,0xec,0x9c,0x20,0x8d,
+ 0x04,0x20,0x39,0xfa,0x3f,0x19,0x20,0xd6,0xce,0xbb,0x32,0x71,0x7b,0x2c,0x11,0xff,0x2d,0xd7,0xbd,0x98,0xbb,0x9b,0x3e,0x6e,0x97,0xd8,0x1a,0xdb,0xf9,0x76,0xc3,0xdc,0xb2,0x02,0x20,0x8d,
+ 0x04,0x20,0x3a,0x02,0x60,0xcf,0xde,0x38,0x79,0x3a,0xb0,0xea,0x66,0x33,0x65,0xdd,0x11,0x1b,0x1e,0xa3,0x68,0x00,0xe7,0xaf,0x96,0xb6,0x56,0xb4,0xa9,0x8d,0xdb,0x85,0x72,0x27,0x20,0x8d,
+ 0x04,0x20,0x3a,0xf4,0x57,0x45,0xb6,0x84,0x88,0x25,0x19,0x4a,0x83,0xef,0xa8,0xea,0x3a,0xd3,0x65,0x31,0x9b,0x9d,0x03,0x31,0x35,0x15,0x45,0x28,0x8c,0xd5,0x9b,0x00,0xc6,0x1c,0x20,0x8d,
+ 0x04,0x20,0x3a,0xfb,0x9e,0xf9,0x77,0xfe,0x71,0x0e,0xe6,0xd0,0xc7,0xcf,0x3b,0x7a,0xdf,0x92,0x82,0x1d,0xac,0xd1,0x4e,0xc6,0x65,0xa7,0x9e,0x1e,0x1b,0x2c,0x19,0xa2,0x97,0xf6,0x20,0x8d,
+ 0x04,0x20,0x3a,0xd0,0xd6,0xb5,0x34,0x93,0xa1,0x91,0x76,0x60,0xa4,0x62,0x5f,0xb8,0x9a,0x56,0xd9,0xbd,0xc4,0x9e,0xf0,0x96,0xd0,0xbd,0x8c,0x27,0x50,0xb1,0xec,0x44,0x08,0xa6,0x20,0x8d,
+ 0x04,0x20,0x3a,0xe4,0x83,0x96,0x98,0x01,0x5e,0xeb,0x88,0xf2,0x89,0xd6,0x7e,0x58,0x6a,0x18,0x3f,0xf4,0x57,0x96,0x63,0xdb,0x9d,0x48,0xce,0x2b,0x9b,0x2b,0x43,0x8a,0x6f,0x9b,0x20,0x8d,
+ 0x04,0x20,0x3b,0x1b,0x5c,0xa7,0xdf,0x84,0xf0,0x68,0x04,0x9c,0xa5,0x17,0x36,0x78,0xd9,0x3b,0xec,0x6f,0x84,0x7d,0x05,0x2d,0x6e,0x3d,0x11,0x01,0x1a,0xc0,0xc1,0xfd,0xe3,0xd7,0x20,0x8d,
+ 0x04,0x20,0x3b,0xd0,0x45,0x49,0x25,0x13,0x42,0x0e,0x26,0x5a,0x88,0xa8,0x5d,0x8d,0x7b,0x41,0xa7,0xa6,0xa6,0x4c,0xef,0x33,0x32,0xf1,0x14,0xbf,0xd2,0x78,0xc7,0x99,0x61,0xa0,0x20,0x8d,
+ 0x04,0x20,0x3c,0x2a,0x3b,0xf9,0xb8,0xe3,0xfc,0xb8,0xd0,0x20,0xfd,0x96,0x00,0x60,0x4d,0x1b,0x08,0xdc,0xe0,0xc2,0xdb,0x5a,0x9b,0x24,0x7f,0x59,0xca,0xd6,0xaa,0x99,0x6c,0x51,0x20,0x8d,
+ 0x04,0x20,0x3c,0x59,0x5b,0x47,0xf7,0xed,0x46,0x77,0x94,0x94,0x77,0x3c,0x0d,0x47,0x1b,0x34,0x59,0x3d,0x32,0x8b,0xf8,0x3f,0x13,0xa5,0xe0,0x04,0x3c,0x44,0x36,0x4c,0x8d,0x1b,0x20,0x8d,
+ 0x04,0x20,0x3c,0x93,0x31,0xb5,0x73,0xf7,0xfd,0x42,0xa8,0xc0,0x97,0x9d,0x95,0x46,0xc2,0x4c,0x40,0x6d,0x78,0x16,0x3a,0x99,0xfb,0x91,0x2e,0xaf,0x1b,0x4f,0xff,0xcb,0x56,0x96,0x20,0x8d,
+ 0x04,0x20,0x3d,0x57,0xd1,0xf4,0xc4,0x96,0x7f,0x58,0x7a,0x98,0x54,0xc0,0xb4,0x33,0x78,0x7d,0xa0,0x51,0xe2,0x71,0x39,0xb4,0xd5,0xc2,0xfb,0xe6,0x21,0xaa,0x7b,0xa7,0x35,0x43,0x20,0x8d,
+ 0x04,0x20,0x3d,0x5f,0xd8,0x93,0x06,0x5e,0x72,0x1c,0x64,0xa4,0x99,0xb5,0x64,0x05,0xf9,0xdc,0x95,0xb1,0x99,0xe8,0x47,0x38,0x17,0xc0,0xd9,0xa2,0xd5,0xb4,0x7f,0xbb,0x54,0x13,0x20,0x8d,
+ 0x04,0x20,0x3e,0x18,0x77,0xda,0x16,0x72,0x38,0x09,0xdb,0x4f,0x4e,0x95,0x05,0xab,0x2f,0xce,0x31,0xc7,0x90,0xc9,0xf9,0x3b,0x34,0x4f,0x03,0x8a,0xc8,0xd7,0x9b,0xf2,0x3e,0xdc,0x20,0x8d,
+ 0x04,0x20,0x3e,0x30,0x63,0x69,0x74,0xc0,0x7b,0xde,0x53,0xa3,0x94,0xe9,0xbc,0x5d,0x3b,0x02,0x94,0xe7,0x03,0x19,0x1d,0x34,0x8b,0x5f,0x7e,0xc6,0x87,0xbb,0x23,0x11,0x05,0x8a,0x20,0x8d,
+ 0x04,0x20,0x3e,0x4e,0xca,0xb2,0x8f,0xa9,0x84,0x0b,0x04,0x52,0xee,0x20,0x42,0x26,0x68,0xd2,0x17,0xdb,0xfb,0xd1,0xb4,0xd6,0x5f,0x01,0xeb,0x8d,0x8f,0x7d,0x04,0x86,0xb1,0x4e,0x20,0x8d,
+ 0x04,0x20,0x46,0x89,0xce,0x47,0xbd,0xa7,0x1c,0x10,0xce,0xa9,0x87,0xdf,0xd2,0x0c,0xf1,0x69,0xed,0x57,0x7a,0xf7,0xa0,0xcf,0x0e,0x41,0x57,0xf0,0xef,0x47,0x88,0x6a,0xab,0x9b,0x20,0x8d,
+ 0x04,0x20,0x47,0x39,0x55,0xea,0x71,0x08,0x1f,0x1e,0xf1,0xc2,0x0c,0x7b,0x90,0x40,0xe2,0x9d,0x00,0x15,0x2d,0xb4,0x34,0x9c,0xe2,0xb2,0xef,0xb6,0xa6,0xee,0x1a,0x3d,0x26,0xa7,0x20,0x8d,
+ 0x04,0x20,0x47,0x41,0x44,0x18,0x23,0x4f,0x8b,0x6b,0xf0,0x5f,0x8f,0xad,0x70,0x71,0x14,0xb2,0x92,0xec,0x81,0xf9,0x24,0xf1,0xa6,0x8d,0x9f,0xc3,0x7f,0x01,0xde,0x1e,0x2c,0x58,0x20,0x8d,
+ 0x04,0x20,0x47,0xec,0x81,0x10,0x2c,0xa1,0x07,0xcb,0xae,0xd0,0x22,0x6a,0xe2,0x5d,0x1d,0xa1,0xed,0xb9,0xcf,0x37,0x52,0x6d,0x88,0x2c,0x6e,0x6a,0xb4,0x11,0x09,0xe3,0xdb,0xf9,0x20,0x8d,
+ 0x04,0x20,0x47,0xf3,0xb0,0xf0,0x56,0x74,0xad,0x9f,0xc9,0x4d,0x16,0x54,0x36,0xd9,0x87,0x0a,0x9b,0xfc,0x2b,0xb4,0xad,0xd3,0x69,0xc6,0x64,0xcb,0x49,0x1e,0xcf,0x8c,0x0a,0x35,0x20,0x8d,
+ 0x04,0x20,0x40,0x48,0xb1,0xa8,0x26,0x20,0xab,0x50,0x3e,0x0c,0x5c,0xdc,0x3c,0xb6,0x8d,0xd9,0xdc,0x26,0xcf,0x54,0xf2,0xde,0xe1,0x32,0x76,0x2a,0x96,0xff,0xfa,0xef,0xf1,0x07,0x20,0x8d,
+ 0x04,0x20,0x40,0xb1,0x9a,0x24,0xbc,0x4b,0x9f,0x96,0xc4,0xcf,0x90,0x0c,0xc2,0xd0,0x55,0xe7,0xed,0x60,0xf3,0xb3,0x94,0x69,0x61,0xa6,0x84,0x7b,0xfe,0x73,0x83,0x47,0xc6,0x8f,0x20,0x8d,
+ 0x04,0x20,0x40,0xf8,0xfa,0x78,0xfc,0xfc,0xca,0xd6,0x3d,0x87,0xa4,0x61,0xdb,0x39,0x98,0x7c,0x19,0x7b,0x76,0x28,0xe2,0x6e,0x17,0xe9,0xf0,0x9f,0x7d,0x98,0x71,0x68,0x98,0xc3,0x20,0x8d,
+ 0x04,0x20,0x40,0xfe,0x20,0x70,0xbc,0xc0,0x7b,0x88,0x97,0xa8,0x9b,0xa0,0x2c,0xc1,0xfa,0x0c,0xb0,0x86,0xc1,0x2a,0xb5,0x1d,0xd6,0x57,0x37,0xf6,0xb9,0xd2,0x17,0x6d,0x62,0x75,0x20,0x8d,
+ 0x04,0x20,0x41,0x0e,0xb5,0xfa,0x48,0xbe,0x25,0x88,0x4c,0xb1,0x43,0xc3,0x31,0x79,0xc1,0xee,0x40,0x0d,0x46,0x0b,0x6a,0xe6,0x7a,0x5d,0x58,0x33,0x00,0xc7,0x68,0xe9,0xd9,0x59,0x20,0x8d,
+ 0x04,0x20,0x41,0x46,0xb6,0xb7,0x42,0xb9,0x22,0x9a,0x8b,0x84,0x31,0x1e,0x40,0xca,0xbd,0x33,0x54,0x68,0x4d,0xd5,0xb5,0x26,0x54,0x83,0x7f,0x74,0xa1,0xa3,0x6b,0x86,0x75,0xa5,0x20,0x8d,
+ 0x04,0x20,0x41,0x9b,0x2e,0xcf,0xc2,0x8b,0x71,0x0b,0xad,0xd2,0xfa,0xdb,0x53,0x89,0xeb,0x9a,0x1c,0x2a,0x4b,0x8e,0xbf,0x16,0x1b,0x73,0xfd,0xa1,0x97,0xfc,0x0a,0x79,0x4e,0xf1,0x20,0x8d,
+ 0x04,0x20,0x42,0x1c,0x80,0x21,0x48,0x8d,0x4f,0x1b,0x39,0x17,0x34,0x17,0xc9,0x85,0xaa,0x03,0x03,0xcf,0xe0,0x0c,0x94,0x72,0x83,0xfd,0xaf,0x44,0xfe,0x1a,0x31,0xa2,0xf8,0x49,0x20,0x8d,
+ 0x04,0x20,0x42,0x53,0xf6,0xf7,0x66,0x68,0x58,0x82,0x39,0x2a,0x24,0x3c,0xf9,0xe7,0x45,0x2d,0xe6,0x0a,0x1a,0x90,0x84,0x97,0x4a,0x63,0x51,0x8a,0x5c,0x8d,0x34,0x09,0x56,0xf0,0x20,0x8d,
+ 0x04,0x20,0x42,0xe6,0xce,0x85,0xed,0x28,0x1d,0x03,0x58,0x39,0x2e,0x32,0xed,0x6a,0xb0,0x39,0x9e,0x58,0x26,0x6a,0x1f,0xef,0x6f,0x09,0xf9,0x4c,0xe2,0xc0,0x34,0x04,0x99,0xae,0x20,0x8d,
+ 0x04,0x20,0x44,0xe7,0xbc,0xb5,0x52,0x8d,0x7a,0x30,0xb8,0x78,0xac,0x8f,0x56,0x2e,0x72,0x6d,0xb8,0x83,0xe4,0x6b,0x28,0x88,0xf3,0x04,0x51,0xdb,0xf3,0x14,0xdd,0x9e,0x1b,0xf3,0x20,0x8d,
+ 0x04,0x20,0x45,0x2a,0x39,0x4b,0x37,0x3f,0x88,0x2e,0xea,0xa5,0xcf,0x2d,0xab,0x48,0x12,0xb6,0x34,0xd3,0xd5,0xf3,0xab,0xa0,0xfe,0x6a,0x68,0xe2,0xa9,0x5d,0x69,0x91,0xc1,0xf2,0x20,0x8d,
+ 0x04,0x20,0x4e,0xae,0xe6,0x85,0xcf,0x49,0x1e,0x14,0xb6,0x87,0x87,0xe5,0x4e,0x1d,0xf6,0x08,0xb0,0xab,0xfe,0x50,0x8b,0x17,0xd6,0xe9,0xbf,0x5d,0x60,0x03,0xe2,0xff,0x97,0x02,0x20,0x8d,
+ 0x04,0x20,0x4e,0xe7,0xe7,0xdc,0xa9,0x58,0x54,0xb9,0xfa,0xb5,0x94,0x6e,0x07,0xab,0x42,0x9d,0xaf,0x28,0x59,0x57,0x3d,0x5c,0xdf,0xa3,0x82,0xe6,0x34,0xcd,0xd3,0x88,0x0e,0x4f,0x20,0x8d,
+ 0x04,0x20,0x4e,0xe6,0x38,0x25,0x11,0xba,0xf1,0xc2,0x8e,0xda,0x6d,0x08,0x08,0xa9,0x28,0x6b,0x19,0x68,0x7a,0xd4,0x7e,0xe9,0x0d,0x5d,0xaa,0x45,0xf1,0xcb,0xd6,0x4f,0xcf,0xd2,0x20,0x8d,
+ 0x04,0x20,0x4f,0xbf,0x52,0x77,0xf5,0x17,0x46,0xde,0xdc,0x4e,0x8d,0x0a,0x1e,0xa8,0xdf,0xc5,0xf1,0x9a,0x07,0x5f,0x91,0xb2,0x09,0x37,0x55,0xb1,0xdf,0x89,0x56,0x22,0x2a,0x8a,0x20,0x8d,
+ 0x04,0x20,0x4f,0x8f,0xc5,0x71,0x78,0x65,0xb7,0x96,0x4d,0x0d,0xeb,0x7f,0x56,0x6a,0xaf,0xf0,0x5a,0x98,0xf3,0x55,0x5a,0xb4,0xa3,0x57,0xe3,0x0d,0x1c,0x03,0x3f,0x28,0x3e,0xc6,0x20,0x8d,
+ 0x04,0x20,0x48,0x0c,0x10,0x5d,0x09,0x66,0x06,0xc0,0x5d,0x35,0xd4,0xe1,0xad,0xe0,0x2c,0x9c,0x07,0x04,0x60,0x6c,0xd4,0x00,0x15,0x0d,0xb4,0x90,0x9c,0x79,0x33,0xac,0x73,0xac,0x20,0x8d,
+ 0x04,0x20,0x48,0x96,0x9d,0xe8,0xd5,0xa3,0xf9,0x15,0x6d,0x50,0xf9,0x8f,0xdc,0x1c,0x78,0xc9,0x3e,0x1d,0x22,0x45,0x21,0xae,0x02,0x86,0x77,0x37,0x15,0xa1,0x66,0x5a,0x56,0x6a,0x20,0x8d,
+ 0x04,0x20,0x49,0x20,0x9e,0x7b,0x52,0x8e,0xbf,0xc3,0x34,0xed,0x37,0xc7,0xd4,0xbe,0xa4,0xa5,0x13,0xd0,0xfc,0xc2,0x7f,0x8f,0x26,0x7e,0x4a,0xa3,0x36,0x64,0x3b,0xa0,0x09,0xc5,0x20,0x8d,
+ 0x04,0x20,0x49,0xa9,0x76,0xa8,0x45,0x6f,0x23,0xc7,0x9b,0x0e,0x4f,0xc5,0x54,0x4b,0x05,0xb4,0x01,0x07,0xa8,0x7f,0x76,0xac,0x38,0x66,0x72,0x2a,0xfd,0x23,0xf0,0x22,0x17,0xb6,0x20,0x8d,
+ 0x04,0x20,0x49,0xf3,0x31,0x25,0x4c,0x7e,0xb6,0x01,0x97,0x3c,0x1a,0x19,0x8a,0x63,0x29,0x52,0x8a,0x16,0xbb,0x6d,0x29,0x89,0x0e,0x34,0x6f,0xe7,0x00,0xc1,0x34,0xb7,0x88,0xbf,0x20,0x8d,
+ 0x04,0x20,0x4a,0x7c,0x52,0x1d,0x70,0x42,0xc9,0xad,0x33,0x85,0x59,0xf9,0x44,0x89,0xba,0x2f,0x3f,0xd1,0x29,0x9d,0xcc,0x8a,0xda,0x78,0xbc,0x86,0x0a,0x13,0x47,0xfd,0x7c,0x28,0x20,0x8d,
+ 0x04,0x20,0x4a,0xd1,0xe8,0x2a,0xbf,0xe7,0x65,0xcb,0x5c,0xae,0x0f,0xa3,0x4b,0xd0,0x1a,0xf6,0x98,0x63,0xcd,0x3f,0x15,0x3f,0x03,0x1c,0x65,0x77,0xad,0x83,0x47,0x0a,0xf4,0x11,0x20,0x8d,
+ 0x04,0x20,0x4a,0xd5,0x55,0x60,0x0b,0x16,0x44,0x81,0xc7,0x1e,0x24,0x38,0x9b,0xe2,0xd5,0xf4,0xb3,0xb1,0x07,0x9e,0x07,0xb0,0xd8,0x55,0x7c,0x2a,0x01,0xe0,0x1f,0xb5,0x9e,0x4f,0x20,0x8d,
+ 0x04,0x20,0x4b,0x00,0x70,0x4e,0x57,0x49,0x8a,0x6d,0xa3,0x3f,0x3a,0x88,0xbe,0xad,0x45,0xfe,0xd5,0xa9,0x59,0x13,0x0a,0xc9,0x31,0x00,0xe7,0x02,0x72,0x78,0xcd,0xa3,0x4e,0xad,0x20,0x8d,
+ 0x04,0x20,0x4b,0x49,0x37,0x3e,0x20,0x1c,0x9c,0x3d,0xef,0x7a,0x04,0xad,0x6c,0x0a,0xf6,0x9d,0x86,0xad,0x70,0x2e,0xe9,0xa1,0x5d,0xf0,0x6a,0xd9,0xf3,0x7d,0x8a,0x25,0x12,0xdd,0x20,0x8d,
+ 0x04,0x20,0x4b,0xad,0xe2,0x4c,0x9d,0xa7,0x45,0x2d,0x67,0x6d,0x99,0x82,0x6c,0x1a,0x12,0x92,0x22,0x4b,0x81,0xc4,0x9f,0x45,0xc3,0xca,0x9b,0x9f,0x34,0xdd,0xd2,0xb3,0x10,0xa7,0x20,0x8d,
+ 0x04,0x20,0x4c,0xc6,0x19,0xf7,0x8d,0xf4,0xc4,0x20,0xd9,0xe1,0xac,0x01,0x8d,0xb7,0x6f,0x2b,0x62,0xca,0x71,0x40,0x34,0x33,0x33,0x1c,0xa0,0x5f,0xb5,0xeb,0x21,0x94,0xa7,0xb0,0x20,0x8d,
+ 0x04,0x20,0x4d,0xd4,0x65,0xfe,0x97,0x36,0x15,0xf2,0xe3,0xe1,0x1f,0x8e,0x95,0xab,0x02,0x17,0x86,0x19,0xc1,0x18,0x7d,0x41,0x36,0x72,0x3b,0xc7,0x08,0xb1,0xa7,0xe0,0x94,0x0e,0x20,0x8d,
+ 0x04,0x20,0x4d,0xd6,0x75,0x40,0x33,0x55,0x18,0x78,0x83,0xdd,0xd5,0x34,0x1f,0x75,0xa1,0x62,0x1b,0x57,0xc2,0xb9,0x4f,0x7f,0x9f,0xa0,0xf6,0x68,0xff,0x70,0xc2,0x3f,0x73,0x84,0x20,0x8d,
+ 0x04,0x20,0x57,0x26,0xb6,0x0f,0xa8,0x29,0xc3,0x7b,0x7d,0x3b,0x36,0x88,0x48,0x41,0x85,0xa0,0xc0,0x4d,0xa7,0x48,0xb2,0x7f,0x89,0xdc,0xd5,0xe0,0x21,0xdf,0x65,0x88,0xb5,0xda,0x20,0x8d,
+ 0x04,0x20,0x57,0x68,0xab,0xf3,0xdf,0x17,0x94,0x62,0xfe,0x55,0xab,0x8e,0xb2,0x09,0xa3,0x27,0xea,0x4a,0x7f,0x3b,0x9b,0xd5,0xf7,0x5b,0x9e,0x8e,0x1d,0xa2,0xeb,0xb7,0x30,0xf2,0x20,0x8d,
+ 0x04,0x20,0x57,0x83,0x2c,0x42,0xca,0x60,0xfb,0x46,0x5a,0x40,0xe3,0x94,0xe1,0x0f,0xb0,0x82,0x86,0x86,0x93,0xfe,0x23,0x5b,0x61,0xfb,0xc9,0x5e,0x50,0xff,0x70,0xe5,0x43,0x46,0x20,0x8d,
+ 0x04,0x20,0x50,0x18,0x09,0xe0,0xda,0x94,0x0e,0x11,0x1a,0xed,0x58,0x50,0x7d,0xd4,0xda,0x7c,0x6d,0x35,0x73,0x10,0x3b,0x42,0x42,0xa9,0x7e,0x10,0xd9,0x13,0x9c,0x34,0x36,0xce,0x20,0x8d,
+ 0x04,0x20,0x50,0xb1,0xc8,0x64,0xbb,0xce,0x5b,0x09,0x11,0x38,0xe5,0xbf,0x32,0x9e,0xfe,0xa8,0xe3,0x85,0x72,0x9b,0xb0,0x9c,0x30,0xef,0xff,0x3a,0x6f,0x91,0x39,0x61,0x2b,0x70,0x20,0x8d,
+ 0x04,0x20,0x52,0x5a,0xe5,0x0d,0x3b,0xf8,0x90,0xc3,0x48,0x98,0x1a,0xc6,0xc2,0x1f,0x10,0xa5,0x4c,0xee,0x8f,0xd4,0x80,0x89,0xf7,0xac,0x14,0xb4,0xc6,0xfb,0x65,0xec,0x2a,0x8d,0x20,0x8d,
+ 0x04,0x20,0x53,0xbe,0x83,0x63,0x0a,0xe0,0xe3,0xe7,0x16,0x47,0x97,0xfa,0xc0,0x9d,0x16,0x32,0x19,0xe2,0x3d,0xf8,0x93,0xc6,0x0f,0xf7,0xb8,0xf1,0x2e,0xb8,0x0d,0x58,0x63,0x6d,0x20,0x8d,
+ 0x04,0x20,0x53,0xab,0x26,0x50,0x6e,0x71,0x9a,0xa9,0xe1,0x27,0xa0,0xa5,0x65,0x33,0x4f,0x74,0x8e,0xbf,0xd6,0x48,0x5b,0xe4,0x17,0xce,0xf4,0x36,0x7f,0xa0,0x6b,0xe7,0x72,0x9c,0x20,0x8d,
+ 0x04,0x20,0x54,0x24,0xd7,0xcb,0x4e,0x7b,0xb6,0x40,0x24,0x14,0x10,0xf1,0x2f,0xb8,0xb2,0x97,0xb6,0xfd,0xb9,0x11,0x19,0x24,0x88,0x54,0x10,0x1a,0x20,0xcc,0xa7,0xc2,0x99,0x51,0x20,0x8d,
+ 0x04,0x20,0x54,0x7a,0x6a,0x2d,0xdb,0xa9,0xef,0x05,0x6b,0x4f,0x14,0xd6,0x17,0x8a,0x8a,0x5e,0x82,0xf5,0xb2,0x84,0x32,0xfa,0x3b,0x20,0xc2,0xf3,0xa6,0x8d,0x66,0x00,0x7b,0x29,0x20,0x8d,
+ 0x04,0x20,0x56,0x19,0x3b,0x83,0x15,0xa5,0x40,0x31,0xcc,0x07,0xc5,0xf6,0xa7,0xdd,0xb3,0x02,0x91,0xb3,0x31,0x6c,0x59,0x2f,0x45,0x1a,0xf6,0xfa,0x03,0xa8,0x4e,0xd4,0x80,0x41,0x20,0x8d,
+ 0x04,0x20,0x5e,0xa8,0x74,0x47,0x93,0xdb,0x21,0xe1,0x27,0x4b,0x1e,0x2f,0x94,0x60,0x72,0x56,0x0f,0xf5,0x69,0xb7,0xeb,0xae,0x78,0x6b,0x5b,0x0c,0x70,0x46,0xd7,0x06,0x97,0x91,0x20,0x8d,
+ 0x04,0x20,0x5f,0x06,0x9c,0x97,0xf1,0x52,0x74,0xd5,0x28,0xa6,0x24,0xf6,0xfd,0x47,0x52,0x3f,0x3d,0xea,0x0c,0x76,0x83,0xc3,0xf5,0x35,0xa3,0x0f,0xc3,0x05,0x82,0xc5,0xd8,0x5d,0x20,0x8d,
+ 0x04,0x20,0x58,0x04,0x52,0x5d,0x1e,0x63,0xad,0x37,0xb0,0xb1,0x68,0xc7,0x59,0x9e,0x42,0xca,0x2b,0x00,0x71,0xb8,0xad,0x7c,0xd3,0x6b,0x67,0x9a,0x9b,0xc9,0x16,0xe5,0x84,0x82,0x20,0x8d,
+ 0x04,0x20,0x58,0x79,0xdc,0x92,0xe6,0x9b,0x43,0xfd,0x57,0xfd,0xd4,0xba,0xbd,0x4f,0xbe,0x22,0x21,0xc1,0xd0,0xf0,0xac,0x72,0xaf,0x22,0x32,0xab,0xdf,0xc3,0xfa,0xf7,0x33,0x85,0x20,0x8d,
+ 0x04,0x20,0x59,0x38,0xaf,0xf9,0x3b,0xc4,0x83,0x8c,0x6d,0x13,0x3c,0x36,0xec,0x1c,0xe0,0x24,0x84,0x7f,0xb0,0x36,0x2c,0x20,0x51,0x64,0x9e,0xcf,0xe7,0x74,0x8f,0x0c,0xcb,0x5e,0x20,0x8d,
+ 0x04,0x20,0x59,0x90,0xb2,0x2f,0x38,0x3b,0x3a,0x46,0x7c,0xcd,0x64,0x19,0xcf,0x07,0xd4,0xd9,0xb4,0x80,0x33,0x43,0xb8,0x45,0xbc,0x59,0x53,0x58,0x61,0xe3,0x3d,0x01,0x79,0xf1,0x20,0x8d,
+ 0x04,0x20,0x59,0xf6,0xcc,0x22,0x5c,0x69,0x31,0x07,0x67,0xc4,0x8f,0x81,0x5e,0x0a,0xc5,0x2b,0xb1,0xd3,0x8c,0xc8,0x8b,0x2a,0xdc,0xf3,0x16,0xc7,0x59,0x54,0x68,0xc6,0x35,0x75,0x20,0x8d,
+ 0x04,0x20,0x5a,0x32,0xc2,0x14,0x9b,0x6a,0x63,0x12,0x2d,0x83,0xce,0x1b,0x83,0x9e,0x78,0x26,0x92,0x82,0x94,0xfc,0xd5,0xf5,0xff,0xdf,0x12,0x87,0xf3,0x00,0x92,0xa2,0x2a,0xb0,0x20,0x8d,
+ 0x04,0x20,0x5a,0x75,0x48,0xfe,0xe9,0x6d,0x97,0xc8,0x11,0x09,0x88,0x93,0xaf,0x73,0x8a,0x3a,0x57,0x91,0x64,0x5e,0xb2,0x1e,0x51,0x48,0xe4,0xad,0x30,0xda,0xac,0x26,0x28,0xa8,0x20,0x8d,
+ 0x04,0x20,0x5a,0x8e,0x83,0x61,0x7f,0x56,0x3f,0x9a,0x99,0x3b,0x02,0x11,0x30,0xb5,0x72,0x85,0xe7,0xac,0x9d,0x5c,0x6e,0x0d,0x2d,0xb1,0x1a,0x2b,0x95,0x10,0xbf,0x52,0x05,0xb4,0x20,0x8d,
+ 0x04,0x20,0x5a,0xee,0x3e,0x00,0x86,0x37,0x02,0x5e,0x69,0x41,0x88,0xe4,0x69,0xf3,0x60,0xca,0xc1,0x9a,0x69,0x5c,0x94,0x8d,0x93,0x5a,0x66,0x18,0x13,0x5d,0xbe,0xd7,0x98,0xe7,0x20,0x8d,
+ 0x04,0x20,0x5c,0x53,0x05,0x8c,0x65,0x32,0xea,0x2b,0x70,0x07,0xc8,0x9d,0x23,0x7d,0x90,0x9e,0x71,0xe0,0x80,0xf8,0x64,0x2e,0x2f,0x2b,0x7b,0x84,0x32,0xaf,0x77,0x3c,0x4e,0x35,0x20,0x8d,
+ 0x04,0x20,0x5c,0x71,0x2c,0x3d,0x97,0x55,0xee,0x73,0x03,0x1f,0xe1,0x94,0x6a,0x09,0xa5,0x37,0xde,0xfa,0x3c,0xb7,0x32,0x1d,0xca,0xec,0x6f,0xc8,0x4e,0xe2,0x63,0x19,0xc1,0xac,0x20,0x8d,
+ 0x04,0x20,0x5d,0x6c,0x2a,0x5f,0xc8,0xec,0x08,0xa0,0xbf,0x3e,0x6a,0x57,0x3f,0x98,0xea,0xf5,0x7a,0x3a,0xaf,0x65,0xd8,0x22,0x2e,0x4d,0xf1,0x0a,0xa9,0x76,0x4d,0x5c,0x4b,0xb7,0x20,0x8d,
+ 0x04,0x20,0x5d,0xb6,0x58,0xee,0x58,0x6a,0x73,0x98,0x3e,0x6e,0x73,0x6c,0x59,0xa1,0x9f,0xb3,0xc2,0x77,0xa0,0x9a,0xc1,0x7e,0xfc,0x27,0xdf,0xa8,0xda,0xea,0x67,0x4e,0xa8,0x47,0x20,0x8d,
+ 0x04,0x20,0x5d,0xa5,0xf5,0x4f,0x49,0x32,0x71,0xb5,0x52,0x37,0xbe,0x61,0x7b,0x5b,0xd1,0xfb,0x22,0x2e,0x1a,0x29,0x62,0x88,0xa3,0x98,0x4f,0x2d,0xb9,0x30,0x98,0x4d,0xe2,0xa7,0x20,0x8d,
+ 0x04,0x20,0x5d,0xe2,0x09,0x67,0xe3,0xac,0x41,0xe2,0x7e,0x6d,0xa2,0xf1,0x6e,0xda,0xa7,0xf1,0xfc,0xe4,0x11,0xbc,0x04,0x50,0x70,0x38,0xe9,0x20,0x15,0xc0,0xc9,0x77,0xeb,0x90,0x20,0x8d,
+ 0x04,0x20,0x5e,0x14,0x5e,0xc4,0xc2,0x03,0x84,0x1c,0x15,0x97,0x39,0xc5,0x0d,0x02,0x08,0xf9,0x34,0x9a,0xf6,0x28,0xbb,0x19,0x74,0x4b,0x11,0x2d,0x02,0x1f,0xbc,0xe0,0xa2,0x50,0x20,0x8d,
+ 0x04,0x20,0x5e,0x1f,0x3e,0x58,0x80,0xcb,0x21,0x16,0x7f,0x1c,0xe3,0x8e,0x31,0x6c,0x98,0xd6,0xdb,0xbb,0x90,0x88,0xf6,0x09,0x17,0x15,0x4d,0x09,0xbe,0x4d,0x15,0x65,0x50,0x14,0x20,0x8d,
+ 0x04,0x20,0x66,0x96,0xfb,0x81,0x01,0xef,0x69,0x39,0xda,0xbd,0xf9,0xb8,0xc4,0x95,0x31,0x8f,0xc7,0x09,0xfc,0x43,0xb7,0x01,0x0f,0xcb,0x8f,0x36,0xf3,0x7c,0x62,0xd4,0x74,0x63,0x20,0x8d,
+ 0x04,0x20,0x66,0xce,0x02,0x20,0xd6,0x01,0x5c,0x28,0xd0,0xde,0x2a,0x36,0x31,0x65,0xe0,0xbb,0x1d,0x6b,0x1b,0x63,0x93,0xc6,0x16,0xcf,0xa5,0x58,0x39,0x00,0x6c,0xf5,0x93,0x4e,0x20,0x8d,
+ 0x04,0x20,0x67,0xf2,0x94,0xc8,0x6e,0x37,0x20,0x47,0x7f,0xb7,0xea,0x75,0x28,0x23,0xe4,0x24,0xf6,0xa2,0x3d,0x10,0x8f,0xe8,0x24,0x21,0x4d,0xb3,0x6e,0x49,0xbf,0x2a,0x93,0x92,0x20,0x8d,
+ 0x04,0x20,0x60,0xe8,0xce,0x4a,0x70,0x80,0x53,0x2e,0x51,0xf2,0xe7,0x63,0x03,0x1e,0xef,0xb9,0x09,0xa8,0x58,0xea,0x80,0x78,0xa4,0x67,0x18,0xcb,0xc1,0xa4,0xc2,0x38,0xbc,0xd8,0x20,0x8d,
+ 0x04,0x20,0x61,0x56,0x0d,0x6e,0x3b,0x0b,0x87,0x25,0xd6,0x23,0xa5,0x49,0x33,0xd3,0x88,0x9d,0x08,0x9e,0xab,0xbe,0xaa,0xc6,0xf7,0xfd,0x9d,0x7d,0x3a,0x12,0xe1,0x55,0x86,0x9d,0x20,0x8d,
+ 0x04,0x20,0x61,0xfc,0xe5,0x0b,0x80,0xbc,0xee,0xf6,0x83,0x55,0x95,0x7c,0xc0,0x0c,0x97,0x23,0xcd,0xa8,0x9f,0x04,0x44,0x1b,0x08,0x96,0xda,0x7a,0xa6,0x6c,0x24,0x2c,0x6b,0x7f,0x20,0x8d,
+ 0x04,0x20,0x61,0xe0,0x5e,0x2d,0xa3,0x1e,0x28,0x9b,0x11,0x09,0x5e,0x8e,0xba,0xe2,0x05,0x21,0x0e,0xdd,0x58,0xf3,0x6a,0xc1,0x71,0xa7,0xec,0xe4,0x54,0x9b,0x94,0xb5,0xce,0x51,0x20,0x8d,
+ 0x04,0x20,0x62,0x84,0x77,0x4f,0x98,0x73,0xc6,0xad,0x86,0x93,0x98,0x09,0xa1,0x1e,0x34,0x23,0x69,0xad,0xdc,0xdd,0x94,0x47,0xb8,0xfc,0xc1,0xee,0x8c,0xa3,0x70,0x99,0x6b,0xc1,0x20,0x8d,
+ 0x04,0x20,0x63,0xa3,0x3b,0xd7,0x99,0xca,0xf1,0x47,0xc5,0x1f,0xa9,0xea,0xc4,0x68,0x43,0xe5,0x30,0x75,0x92,0x6b,0x4e,0xa9,0x33,0xf2,0x58,0xe4,0x6f,0x36,0x6b,0xcc,0xe7,0xc7,0x20,0x8d,
+ 0x04,0x20,0x63,0xc3,0x20,0x7c,0xcc,0xdc,0xde,0xfe,0xb4,0x12,0x5f,0x3b,0xb3,0x18,0xfc,0x5f,0x67,0x21,0x77,0x1d,0x56,0x36,0xf7,0xb1,0x66,0x2e,0x84,0x60,0xcf,0x32,0xd8,0xc2,0x20,0x8d,
+ 0x04,0x20,0x64,0x6a,0x0c,0x40,0x1e,0xb7,0xbb,0xc3,0x69,0xfe,0x51,0xa5,0x1e,0xae,0x32,0x3b,0x78,0x10,0x1d,0x80,0x16,0x9d,0xaf,0x4b,0xd8,0x24,0xea,0xcb,0xc2,0xcb,0x5b,0xbe,0x20,0x8d,
+ 0x04,0x20,0x64,0xce,0x81,0x44,0xd4,0xae,0x32,0x6c,0x16,0xe5,0x6f,0xa6,0xc1,0xca,0xcd,0x62,0xc6,0xfa,0xde,0xc2,0x40,0x75,0xdb,0x9b,0x66,0x38,0xda,0x0e,0xc2,0x73,0x70,0xfa,0x20,0x8d,
+ 0x04,0x20,0x65,0x52,0xe9,0xc2,0x53,0x24,0x9b,0x14,0x56,0x69,0x9b,0x26,0xf5,0xea,0x14,0x8d,0x55,0x82,0xec,0xd2,0x29,0x8b,0x36,0x25,0x9a,0xa3,0xd5,0x87,0x0e,0xea,0xb1,0xd9,0x20,0x8d,
+ 0x04,0x20,0x65,0x89,0x0f,0x62,0x84,0x8a,0xd2,0xf6,0xd6,0xcb,0x55,0x5a,0x7f,0x8e,0x8e,0x29,0x87,0xc8,0x7f,0x09,0x98,0x57,0x2f,0x9b,0x6c,0xa6,0x7f,0xcf,0xbc,0x6d,0x18,0xe7,0x20,0x8d,
+ 0x04,0x20,0x65,0xeb,0xb8,0xa1,0x37,0x07,0x0d,0xa6,0x18,0x05,0x3d,0xb0,0x0b,0xfd,0x62,0x2e,0x22,0x73,0xa1,0x60,0xe9,0xb9,0x16,0xb3,0x9e,0x15,0x88,0xc4,0x2c,0x8e,0xfb,0x94,0x20,0x8d,
+ 0x04,0x20,0x6e,0x83,0x44,0x23,0x82,0x5a,0xa6,0xdc,0x35,0x65,0x7e,0xc4,0x26,0x52,0xf2,0x35,0xaa,0xd3,0x50,0xd9,0x3b,0xcc,0x13,0x19,0x2c,0x8d,0xeb,0xfc,0x41,0x1f,0x31,0x12,0x20,0x8d,
+ 0x04,0x20,0x6e,0xd3,0x96,0x36,0xbf,0x7c,0xa5,0xce,0xae,0x21,0x88,0xbb,0xf9,0xcb,0x1b,0x36,0x5a,0xd8,0xf8,0x12,0xc3,0xa4,0x35,0x0d,0x6f,0x8a,0x16,0x2f,0x42,0x84,0xa1,0xbc,0x20,0x8d,
+ 0x04,0x20,0x6f,0x73,0x78,0x6b,0xc8,0x66,0xba,0x9e,0x40,0xd8,0x66,0x1c,0x70,0x03,0xa8,0xec,0xc4,0xf4,0x1e,0xe5,0x79,0x6c,0xab,0x15,0xce,0x57,0x66,0x8a,0xa1,0xee,0x06,0xb9,0x20,0x8d,
+ 0x04,0x20,0x6f,0xb9,0xee,0x8b,0x40,0x2f,0xa5,0xa2,0xe7,0x3a,0xea,0xd2,0xfa,0xfe,0xe9,0xa8,0x53,0xa3,0x4c,0xf0,0x02,0x17,0xf6,0xcb,0xd6,0x1f,0xab,0xe9,0x99,0x4a,0x71,0x4c,0x20,0x8d,
+ 0x04,0x20,0x6f,0xba,0xc2,0xb9,0x5a,0xa9,0x51,0x1f,0x71,0xcf,0xcd,0x2f,0x08,0x3d,0x97,0x69,0xe8,0x11,0x55,0xf8,0x44,0xc9,0xc5,0x5c,0xe5,0xd9,0xa3,0x2f,0xf8,0xf9,0x0a,0x70,0x20,0x8d,
+ 0x04,0x20,0x6f,0xad,0x89,0x9e,0x48,0x0b,0x96,0x1c,0xf8,0xe3,0xae,0xd4,0x3b,0x85,0xdb,0x08,0xce,0x5e,0xda,0x64,0x29,0x87,0xc9,0xaa,0x41,0xd6,0xb9,0x95,0x77,0xff,0x65,0xf1,0x20,0x8d,
+ 0x04,0x20,0x68,0x9c,0xb3,0xf4,0x02,0x5b,0x53,0x24,0xce,0x67,0x93,0x1b,0xf8,0x48,0x55,0xb5,0xf4,0xc2,0xf9,0x30,0xd6,0x7f,0xd1,0x5f,0x92,0x68,0x49,0x09,0xfd,0x8f,0x0a,0x72,0x20,0x8d,
+ 0x04,0x20,0x68,0xd8,0x4d,0x12,0x96,0xf6,0x2a,0x4f,0x85,0x3d,0xc0,0x36,0x0b,0x28,0xf5,0x06,0x5a,0x1d,0x98,0x14,0x02,0x07,0x6e,0xba,0xbe,0x83,0x0b,0xc5,0x40,0xc7,0x90,0x35,0x20,0x8d,
+ 0x04,0x20,0x69,0xa8,0xf1,0xf0,0x9f,0x3f,0x88,0xb1,0x8f,0xd3,0x6e,0xc1,0xfc,0x54,0x11,0xa2,0x5c,0xe6,0x4e,0xa9,0xd7,0xc6,0x22,0xd8,0xd9,0xf5,0x18,0x29,0x83,0xba,0x0e,0x0c,0x20,0x8d,
+ 0x04,0x20,0x69,0xdc,0xd1,0xad,0xd1,0xfb,0x25,0x67,0x49,0x52,0x25,0xdf,0x8d,0x6a,0x15,0x8b,0x07,0xa3,0x32,0x4a,0xbb,0x8e,0x3c,0xcf,0x72,0xcd,0x7f,0xbc,0xd5,0x4c,0x5d,0xbb,0x20,0x8d,
+ 0x04,0x20,0x69,0xe0,0x3b,0x71,0xef,0x8d,0xcd,0x5b,0xde,0x17,0x9a,0x07,0xb2,0xc6,0xfd,0x9f,0xf7,0x31,0x31,0x83,0x57,0x64,0x0b,0xfc,0x1c,0xd8,0xbb,0x51,0xf9,0xb0,0xb7,0x8b,0x20,0x8d,
+ 0x04,0x20,0x6a,0x39,0x4e,0xe9,0x2f,0x09,0x53,0x2f,0xd5,0x56,0x68,0xd6,0xe8,0xb4,0xfb,0xa7,0x49,0x92,0xaf,0xe4,0xf2,0x39,0x54,0x88,0x4f,0x70,0xb2,0xcb,0xf2,0xd0,0xb9,0x09,0x20,0x8d,
+ 0x04,0x20,0x6a,0x3e,0x67,0xe7,0xa0,0xdb,0x54,0xdf,0x1a,0xee,0xe5,0xcc,0x29,0x48,0x93,0xf5,0xa5,0xbf,0xa6,0x9f,0xe9,0x35,0x9e,0x8b,0xc0,0xcb,0x01,0x51,0x56,0x5d,0xb5,0xe2,0x20,0x8d,
+ 0x04,0x20,0x6a,0x23,0xb4,0xd7,0xf6,0xd9,0xd6,0x4a,0x44,0x79,0xfe,0x0b,0x68,0xec,0xbc,0x0b,0x31,0x6f,0x88,0x9f,0xa6,0xe2,0xd5,0x97,0xd9,0xfc,0xc3,0x77,0x23,0xfe,0x4d,0x9a,0x20,0x8d,
+ 0x04,0x20,0x6a,0x48,0x24,0x7b,0xf0,0x16,0x09,0xce,0x89,0x7d,0x7b,0xf9,0x67,0xcd,0x8b,0xf9,0x95,0xfb,0x2e,0x10,0x4b,0x49,0x9f,0x38,0x3f,0x7c,0xbf,0xcb,0x29,0xe5,0x1a,0x4f,0x20,0x8d,
+ 0x04,0x20,0x6a,0x96,0xd3,0x87,0xcb,0x7a,0x2d,0x37,0xdd,0x37,0x50,0xcb,0x33,0xb4,0x4a,0x78,0x81,0x23,0x92,0xc3,0xa0,0x69,0x35,0xf7,0xdb,0x65,0x5e,0x7d,0x5d,0x23,0x08,0x2e,0x20,0x8d,
+ 0x04,0x20,0x6a,0xe4,0xaf,0x69,0x5a,0xbe,0x2a,0x48,0xb2,0x3f,0x0f,0xcb,0xf1,0x5a,0x77,0x1c,0x4c,0xae,0x35,0xed,0x25,0x99,0x1d,0xb9,0x8a,0xfd,0x00,0x63,0x3a,0x47,0x10,0xf3,0x20,0x8d,
+ 0x04,0x20,0x6b,0x89,0x4a,0xa2,0x97,0x15,0xac,0xb5,0x3d,0x72,0x68,0x99,0xb7,0x96,0x9d,0x84,0xef,0xf0,0xed,0x4d,0x11,0x6e,0x4e,0xcc,0xb0,0xe5,0x7e,0x8a,0xef,0xda,0x92,0x9d,0x20,0x8d,
+ 0x04,0x20,0x6c,0x34,0x5b,0x0e,0x13,0xdc,0x0b,0xb2,0xa8,0xa7,0x5b,0x62,0xb6,0xc8,0x4c,0x8d,0x04,0xd4,0x46,0x54,0x6c,0x89,0x98,0xed,0x45,0x90,0xbe,0x98,0xa7,0x8d,0x0e,0x64,0x20,0x8d,
+ 0x04,0x20,0x6c,0xba,0xfd,0x14,0x1b,0x01,0x62,0x04,0x36,0x38,0x6a,0xb8,0x3c,0xa4,0xa1,0x95,0x54,0xdb,0x79,0x20,0x77,0x64,0x69,0x56,0xb5,0xd1,0x24,0x0b,0x74,0x3c,0xd8,0x90,0x20,0x8d,
+ 0x04,0x20,0x6d,0x98,0x9b,0xa0,0xde,0x06,0x64,0xf7,0x17,0x40,0x3b,0x2a,0x02,0x2a,0xe4,0x0f,0x95,0x8b,0x0c,0x35,0x2e,0xc7,0xd8,0xdd,0x63,0xc3,0xa2,0xc8,0xb2,0xa7,0xd4,0x4b,0x20,0x8d,
+ 0x04,0x20,0x6e,0x62,0xff,0xdb,0x57,0x8f,0xc4,0x70,0x25,0xb6,0x45,0x7f,0xa7,0x10,0x1e,0x50,0xf8,0xfa,0xac,0x9d,0x60,0x61,0x03,0xb6,0xa7,0x51,0xf8,0x43,0x35,0xf8,0x9e,0x1a,0x20,0x8d,
+ 0x04,0x20,0x77,0xe2,0xca,0x61,0xde,0xa7,0x8c,0xda,0xb6,0x18,0xea,0xd9,0x7a,0xd6,0x0c,0x0e,0xc7,0xf4,0x7e,0x77,0x88,0xe3,0x3d,0x36,0x5c,0xaa,0x62,0xe9,0x4c,0x55,0x08,0xe3,0x20,0x8d,
+ 0x04,0x20,0x71,0x34,0x87,0x8b,0x20,0x31,0x9d,0x2c,0x81,0x84,0x55,0x41,0xd0,0x37,0xa8,0x1c,0x84,0xc0,0xd8,0xab,0x19,0x3d,0x88,0x61,0x98,0xc5,0x49,0x7b,0xe2,0x36,0xcd,0xf0,0x20,0x8d,
+ 0x04,0x20,0x71,0x4a,0x11,0xcf,0x3b,0xa8,0x47,0x8a,0xa4,0xa3,0x1b,0xf9,0xf7,0x72,0xaa,0x70,0x97,0xd0,0xa4,0x42,0xfa,0xce,0xeb,0x82,0x53,0xff,0x22,0x00,0x28,0xc3,0xdf,0xd3,0x20,0x8d,
+ 0x04,0x20,0x71,0x91,0x9d,0x1a,0xb7,0xae,0xcc,0x98,0xee,0x6d,0xd3,0xa5,0xac,0x6d,0xf2,0x15,0x61,0xbf,0x94,0x26,0x54,0x4a,0x93,0x70,0x5d,0x87,0xef,0xe6,0x30,0x86,0xee,0x87,0x20,0x8d,
+ 0x04,0x20,0x71,0x9a,0xd9,0x6a,0x9d,0x08,0xd9,0x6a,0x7b,0xce,0x54,0xe2,0xba,0x60,0x51,0x73,0x61,0xc4,0xca,0x17,0x84,0xbe,0x38,0x37,0x39,0x4b,0xa4,0xa7,0x04,0xaf,0x36,0x7c,0x20,0x8d,
+ 0x04,0x20,0x71,0xc4,0xfe,0x0c,0xc1,0x70,0x42,0x4d,0xe3,0x7a,0xfd,0xaf,0x89,0x78,0xc3,0x72,0xd7,0x43,0x93,0x37,0xa8,0x5c,0x93,0xdb,0xa8,0xb9,0xc3,0x4a,0x37,0x51,0x66,0x5c,0x20,0x8d,
+ 0x04,0x20,0x71,0xcb,0xdc,0x4e,0x40,0x7c,0xea,0x92,0xb2,0x26,0x99,0x89,0x2c,0x3c,0x3b,0x74,0x81,0xec,0xeb,0xec,0x4f,0x7b,0x16,0xae,0xf2,0x64,0x51,0x2b,0xc4,0x2d,0xbf,0xab,0x20,0x8d,
+ 0x04,0x20,0x72,0xb4,0xeb,0x41,0x49,0x3c,0xa4,0xbc,0x5a,0xae,0xfb,0xf1,0x37,0x89,0x25,0xf7,0x39,0xb9,0x8e,0xa6,0x97,0x64,0x7e,0xd7,0x35,0x7c,0x1c,0x05,0x15,0x8e,0xe7,0x01,0x20,0x8d,
+ 0x04,0x20,0x72,0xdf,0xe7,0x72,0xa7,0xcb,0x40,0x59,0xad,0x8d,0x59,0xd0,0x14,0xdd,0xee,0xc0,0x1c,0xf1,0xd2,0x39,0x92,0x21,0x51,0x1c,0xfd,0xea,0x8f,0xb1,0x12,0x08,0x02,0x2c,0x20,0x8d,
+ 0x04,0x20,0x73,0x57,0x80,0x92,0x53,0x92,0x23,0xb9,0xa4,0x81,0xba,0x4f,0xa3,0xf7,0x50,0xd4,0x39,0x73,0x4f,0x51,0x7d,0xf7,0x9e,0xf8,0x03,0xca,0x73,0x87,0x7a,0x2a,0xf2,0x5d,0x20,0x8d,
+ 0x04,0x20,0x74,0x8a,0x0c,0xd6,0x3e,0xef,0xd3,0x45,0x1c,0x78,0x4f,0xe2,0xe9,0x4c,0xa6,0xef,0xd7,0x9c,0x78,0x5f,0x35,0x41,0x70,0x9f,0xf4,0x5e,0xd2,0x05,0x3d,0xea,0x9a,0x24,0x20,0x8d,
+ 0x04,0x20,0x74,0xd7,0x0e,0x8d,0xf4,0x71,0x2f,0x5a,0x6a,0x85,0xa6,0xb7,0x9d,0x45,0xb7,0xdd,0x42,0x49,0xb9,0x1b,0x56,0x27,0x75,0x82,0x6c,0x3f,0xd6,0xea,0x2a,0xce,0x5c,0x4e,0x20,0x8d,
+ 0x04,0x20,0x75,0xab,0x5b,0x79,0x2e,0xcd,0x4f,0x99,0x18,0xdd,0x0d,0x85,0x45,0x66,0xad,0x79,0x64,0xeb,0x02,0xdc,0x7b,0x33,0xb0,0xcf,0x24,0x9c,0x27,0x69,0x8e,0x7d,0x68,0x51,0x20,0x8d,
+ 0x04,0x20,0x75,0xf7,0xe4,0x5f,0x40,0x12,0xe0,0xb4,0x2e,0x0d,0x8f,0x53,0xeb,0xa7,0x64,0x88,0xc8,0xd8,0x87,0x1f,0xef,0x01,0xa8,0xf3,0x95,0xb7,0x6e,0xb4,0x06,0x0b,0xb0,0x48,0x20,0x8d,
+ 0x04,0x20,0x75,0xcb,0x04,0xb9,0x7e,0xde,0xfa,0x49,0x7b,0x20,0x0a,0x24,0x53,0xa5,0x69,0x06,0x14,0x3f,0xc9,0x1b,0x93,0x51,0xc6,0xa9,0x36,0x73,0x4d,0xd1,0xd3,0x36,0xfc,0xed,0x20,0x8d,
+ 0x04,0x20,0x76,0x70,0xda,0x9e,0xd4,0x27,0x5b,0xf5,0x41,0x48,0xad,0xff,0x8f,0x3b,0x49,0x81,0x3c,0x09,0xd2,0x51,0xa4,0xdf,0x4e,0x8b,0x94,0xd0,0xe9,0x81,0xe7,0x16,0x25,0x92,0x20,0x8d,
+ 0x04,0x20,0x7e,0xc4,0x76,0x1b,0x58,0x2c,0x41,0x8d,0xaa,0x87,0x1b,0x89,0xf6,0x9f,0x99,0x55,0xd9,0x0d,0x39,0xef,0xde,0x69,0xf8,0xe5,0xa1,0xfd,0x76,0x6c,0x40,0x11,0xc4,0x6e,0x20,0x8d,
+ 0x04,0x20,0x7e,0xef,0xe1,0x40,0x48,0x56,0xcf,0x61,0x9c,0x95,0x64,0x1b,0x68,0xd0,0xf2,0x40,0xcc,0x39,0x42,0xb7,0xb0,0x44,0xcc,0x2c,0x0e,0xa3,0xf9,0xfd,0x45,0xe2,0x74,0x5f,0x20,0x8d,
+ 0x04,0x20,0x7f,0x84,0x36,0x20,0xe6,0x4b,0xf1,0x4e,0x8e,0x5d,0x90,0x5e,0x5b,0x26,0x42,0x2e,0xad,0xd5,0xcf,0x10,0x34,0xec,0xe0,0x92,0x83,0xff,0x09,0xc8,0xdc,0x0c,0x98,0xd6,0x20,0x8d,
+ 0x04,0x20,0x78,0xae,0xba,0xa8,0xc0,0x0c,0x9d,0x66,0x46,0xfd,0xe0,0x7a,0x13,0x40,0xcb,0x24,0x64,0x73,0x14,0x47,0x8f,0xae,0x0a,0xc4,0xe1,0x2b,0x4d,0x14,0x0d,0xeb,0xc9,0xcb,0x20,0x8d,
+ 0x04,0x20,0x79,0x2b,0xc3,0x40,0x24,0x92,0x5a,0xc0,0x6b,0x46,0x69,0xcc,0x27,0xfb,0x87,0x48,0xc8,0xd9,0xb7,0xe2,0x2e,0xb3,0x4b,0x30,0x4b,0x29,0x39,0x6e,0xd4,0x67,0xa2,0x43,0x20,0x8d,
+ 0x04,0x20,0x79,0x61,0x1f,0xa8,0x0b,0xd9,0x0b,0x99,0xdd,0x06,0x88,0x62,0x30,0xf6,0x15,0x3b,0xb2,0xfc,0xde,0x10,0x05,0xa7,0xd1,0xe1,0x81,0x5b,0x90,0x20,0xc4,0x9a,0x63,0xfe,0x20,0x8d,
+ 0x04,0x20,0x7a,0xbb,0x69,0xc4,0xee,0x9f,0x60,0x0e,0x15,0x22,0x90,0xf9,0xbd,0xd3,0xc9,0xf5,0x59,0xf6,0xda,0x5a,0x52,0x0b,0xeb,0xd8,0x38,0xf8,0x1b,0x34,0x9f,0x3b,0x49,0xf6,0x20,0x8d,
+ 0x04,0x20,0x7b,0x50,0xc3,0x37,0x7d,0xc0,0x51,0x84,0x93,0x7f,0xfc,0x96,0xce,0xd9,0x1f,0x07,0x18,0x45,0x66,0x25,0x4a,0x1d,0x00,0xb9,0xcb,0x4f,0xca,0x77,0x03,0xc1,0x44,0xde,0x20,0x8d,
+ 0x04,0x20,0x7b,0xe8,0x9c,0x1b,0x85,0xf7,0xac,0xfc,0x6a,0x36,0x98,0xd1,0x4d,0x8d,0xd2,0x87,0x7d,0xb6,0x57,0xa7,0x12,0x18,0xc0,0x38,0x04,0xc3,0x7b,0x14,0x02,0x9c,0x54,0x39,0x20,0x8d,
+ 0x04,0x20,0x7b,0xeb,0x51,0x99,0xa7,0x44,0x53,0x31,0xc5,0x64,0x36,0xdb,0x89,0xe2,0x49,0x1f,0xfa,0x64,0xc9,0x52,0x1e,0xe5,0xc0,0xbe,0x16,0xaf,0xf9,0x08,0xb8,0x39,0x5f,0x41,0x20,0x8d,
+ 0x04,0x20,0x7c,0x6c,0xf5,0x11,0x69,0xbf,0xc8,0xc0,0xc8,0xe0,0x2b,0xcd,0x0e,0x42,0x25,0x50,0x1b,0x55,0xc0,0xa6,0xb6,0x6c,0xc3,0xe4,0xb2,0x1c,0x6b,0xbb,0xd6,0x56,0xd8,0x79,0x20,0x8d,
+ 0x04,0x20,0x7d,0xb4,0xe8,0x7e,0x95,0x2e,0xee,0x6d,0x08,0xdc,0xe7,0x38,0xea,0x43,0xc0,0x84,0x54,0xc2,0xea,0x60,0x85,0xba,0xe4,0x65,0xa6,0x39,0x02,0x88,0x50,0xf7,0xae,0x2d,0x20,0x8d,
+ 0x04,0x20,0x7e,0x29,0x06,0x05,0x28,0x59,0x42,0x9a,0x77,0xb5,0x08,0x21,0x73,0x88,0xc6,0xac,0xb5,0x16,0x5a,0x46,0x37,0x50,0xcd,0x18,0x41,0xb4,0x98,0xd0,0xd5,0x51,0x40,0xc9,0x20,0x8d,
+ 0x04,0x20,0x7e,0x57,0x37,0x18,0xa4,0x2b,0x39,0x91,0xc9,0x3f,0x64,0xee,0x38,0x74,0x4f,0xfc,0x6d,0xc7,0x7d,0xa8,0xce,0x1d,0x32,0x4c,0x1d,0xc8,0xc2,0x9f,0xbb,0x1f,0xd4,0x55,0x20,0x8d,
+ 0x04,0x20,0x87,0x2c,0x02,0x2d,0x34,0x0b,0x6c,0x29,0xfe,0x9c,0x72,0xed,0xcb,0x47,0xef,0x9d,0x07,0x4a,0x3e,0x39,0xb7,0x07,0x3a,0xdc,0x08,0x75,0xf0,0x74,0x9e,0x83,0x7b,0xfa,0x20,0x8d,
+ 0x04,0x20,0x87,0x51,0x10,0x09,0xff,0x9b,0x7b,0xf2,0xa8,0xe7,0x11,0x2c,0x03,0xd2,0xfc,0xab,0x8a,0xdc,0xaa,0x0c,0x2a,0x56,0x39,0xb8,0x12,0x87,0x8f,0xce,0xd6,0xf5,0xee,0xbc,0x20,0x8d,
+ 0x04,0x20,0x80,0x1a,0xd7,0x5b,0x43,0x0a,0xa4,0x41,0xd7,0xf6,0x32,0x38,0x9e,0x99,0xe6,0x79,0x75,0x02,0x98,0x09,0x4e,0x56,0x46,0xb0,0x5f,0xab,0x22,0x5c,0x7e,0xea,0xa6,0xba,0x20,0x8d,
+ 0x04,0x20,0x80,0xd1,0xd0,0xd7,0x2a,0x66,0x25,0x72,0x68,0x1f,0xa6,0xdb,0x6c,0x4e,0xd0,0x84,0x42,0xea,0x26,0xe6,0xf8,0xe4,0xca,0x2a,0x8a,0x29,0x74,0xc4,0x9c,0x50,0x92,0x59,0x20,0x8d,
+ 0x04,0x20,0x81,0xc1,0x1f,0x3f,0x74,0xf3,0xb0,0x47,0x85,0xa6,0x28,0x6e,0x29,0x5c,0x78,0xca,0xbe,0xd6,0x32,0xf6,0xfd,0xdb,0x85,0x72,0x49,0x45,0x26,0x96,0x36,0xff,0xcd,0x5b,0x20,0x8d,
+ 0x04,0x20,0x82,0x37,0xf9,0xfc,0x41,0x86,0x82,0xa2,0xb8,0xb0,0xab,0x10,0xc7,0x0c,0x2b,0x86,0xa0,0xc7,0x71,0x2c,0x6f,0xdb,0x44,0x57,0xa4,0xc1,0xe7,0x78,0x85,0x3a,0xda,0xf6,0x20,0x8d,
+ 0x04,0x20,0x82,0x16,0x72,0x68,0x80,0x31,0xf5,0x64,0xf1,0x13,0x72,0x4b,0xcb,0xfd,0x94,0x70,0x14,0x5d,0xcc,0x3f,0x6f,0x23,0x50,0xf6,0x77,0xe8,0x90,0x78,0x1e,0x3e,0x3a,0x8d,0x20,0x8d,
+ 0x04,0x20,0x83,0x59,0x75,0xc9,0x71,0x3b,0xa0,0xe9,0x36,0x85,0xd5,0x79,0xd8,0xc9,0x05,0x35,0x9b,0x21,0xa7,0x84,0xfe,0x6c,0xaa,0xad,0xc8,0xf4,0xe8,0x1a,0xa9,0xa3,0x37,0xc0,0x20,0x8d,
+ 0x04,0x20,0x83,0xaf,0xa3,0x57,0x29,0x66,0x82,0x7c,0xe5,0x7f,0xdf,0x95,0x53,0xaa,0x0e,0xe8,0xdb,0x1c,0x80,0x71,0xa6,0x0b,0x90,0x2c,0x59,0x3e,0xaf,0xc3,0x6c,0xb4,0xee,0x9d,0x20,0x8d,
+ 0x04,0x20,0x85,0x18,0x7c,0xc7,0x10,0xd3,0x8c,0x7b,0x86,0x34,0x90,0x17,0x31,0xbb,0x9e,0xf5,0xff,0x27,0xca,0x1e,0x39,0x86,0x4a,0xb0,0x79,0x82,0x0f,0x07,0x3c,0x44,0x82,0xa4,0x20,0x8d,
+ 0x04,0x20,0x85,0x4a,0x42,0xd1,0x75,0x04,0xf5,0xec,0x8d,0xaa,0x74,0xfb,0x7c,0x29,0x23,0x67,0xdb,0x27,0x50,0x2c,0x5c,0x4d,0xbb,0xc6,0x76,0xcc,0x19,0x2e,0xb6,0x5b,0xa1,0xb4,0x20,0x8d,
+ 0x04,0x20,0x85,0x4a,0x72,0x58,0xe4,0xc9,0x82,0x82,0x3c,0x22,0xf8,0x69,0xf7,0x2e,0x4c,0x70,0x5c,0x86,0xcf,0x6f,0x54,0x71,0xef,0xda,0x8c,0x3c,0x8f,0x88,0x3a,0x4d,0x78,0x66,0x20,0x8d,
+ 0x04,0x20,0x85,0xcd,0x65,0x5a,0xcc,0xa2,0xf6,0xbb,0x94,0x66,0x24,0xe5,0x5a,0xac,0x84,0x46,0x74,0x11,0x9d,0x10,0xe9,0xf9,0xdd,0x6e,0x30,0xfd,0xcb,0xe1,0x68,0x45,0xbd,0xc5,0x20,0x8d,
+ 0x04,0x20,0x86,0x75,0xea,0xd8,0xc4,0x81,0x2e,0x1c,0x91,0xe8,0xac,0xad,0x0f,0x87,0x02,0x7d,0x12,0x36,0x9e,0x63,0xe6,0xdf,0x19,0x33,0x9a,0xfc,0x4b,0x4f,0x13,0x60,0xad,0x8d,0x20,0x8d,
+ 0x04,0x20,0x8e,0xab,0x0f,0xe6,0x33,0x03,0xe5,0x2e,0x0e,0xfa,0x28,0x6f,0xf2,0xb3,0x77,0xc1,0xbe,0x6b,0x0c,0xd0,0xf3,0x23,0xbd,0x14,0x45,0xf5,0x1d,0x54,0x6c,0xb3,0xf1,0x46,0x20,0x8d,
+ 0x04,0x20,0x8f,0x1a,0xc8,0xcb,0x44,0xb5,0x74,0x12,0xcb,0xd9,0xe6,0x7e,0x0f,0x61,0xe2,0x26,0x3c,0xd1,0xb3,0x16,0x25,0x2d,0xd7,0xd1,0x53,0x6a,0xde,0x22,0x49,0x7b,0x26,0xba,0x20,0x8d,
+ 0x04,0x20,0x8f,0xf2,0x1b,0x6a,0x57,0xec,0x87,0xb3,0x29,0x4e,0x7e,0x9e,0xed,0x14,0x7d,0xde,0x3d,0x79,0x67,0xeb,0x68,0x9f,0x6c,0x88,0xd8,0xaf,0xbc,0x69,0xca,0x30,0xfe,0x00,0x20,0x8d,
+ 0x04,0x20,0x88,0xb7,0xdd,0x54,0x50,0xc3,0x99,0xd1,0xbf,0x4a,0xf2,0x61,0x0b,0x16,0xc1,0x27,0x89,0xaf,0xa6,0xc0,0xca,0xb6,0x89,0xb9,0x30,0xbc,0x73,0x41,0x0a,0x29,0x14,0x23,0x20,0x8d,
+ 0x04,0x20,0x88,0xb7,0xf5,0xf8,0x12,0xd3,0x33,0x5a,0x7a,0x32,0x91,0x9f,0x49,0x63,0x5b,0xa1,0xe6,0x3c,0x92,0x23,0xe8,0x87,0xb6,0xb8,0x04,0xac,0xd0,0xa9,0xd7,0xad,0x19,0xd3,0x20,0x8d,
+ 0x04,0x20,0x88,0x81,0x5e,0x13,0xd4,0xcf,0xfe,0xed,0xbb,0xd0,0xf4,0x6e,0x4b,0xc9,0x10,0x6a,0xeb,0x5f,0xcc,0xb9,0x90,0xb7,0x27,0x6a,0xc2,0xb7,0x2d,0x08,0xc9,0x0f,0x77,0xfc,0x20,0x8d,
+ 0x04,0x20,0x88,0xe9,0x14,0x02,0x7d,0x3f,0x24,0xa1,0x66,0x1f,0xc1,0x29,0x8f,0x8a,0xba,0x20,0xa1,0x1c,0x4b,0x3b,0x08,0x56,0x5a,0x3b,0xb9,0xfd,0x38,0xfd,0xfc,0xc0,0xfd,0x40,0x20,0x8d,
+ 0x04,0x20,0x89,0x14,0xf2,0x8c,0xe1,0x35,0x28,0x34,0x0b,0xd6,0x97,0x64,0x26,0xbd,0x04,0x45,0xd3,0x9f,0x61,0x1a,0x39,0x0d,0xf4,0x90,0xfb,0x5a,0x77,0x85,0x68,0x57,0x66,0xbe,0x20,0x8d,
+ 0x04,0x20,0x89,0x1f,0xbc,0xcc,0x1c,0xd9,0xa9,0x09,0x5e,0x80,0x23,0x3b,0xc4,0xa9,0x38,0xf6,0x22,0x69,0x21,0xf7,0x45,0xf7,0x03,0x9e,0xad,0x9e,0x94,0x82,0x2b,0xe5,0x71,0xd2,0x20,0x8d,
+ 0x04,0x20,0x89,0x7d,0x5f,0x12,0xdf,0x32,0x76,0x19,0xad,0x7a,0x39,0xc3,0x12,0xd7,0x25,0x0c,0x15,0xb0,0x46,0xa4,0xea,0x2c,0x3d,0xe1,0x2c,0x16,0x18,0xcb,0xe2,0xc4,0x46,0x7c,0x20,0x8d,
+ 0x04,0x20,0x89,0x8a,0x59,0xb2,0x6e,0x02,0x31,0x1a,0x07,0x7d,0x1d,0x28,0x0e,0x61,0xd5,0xca,0x54,0x5a,0x32,0x96,0xa2,0x8a,0x69,0x80,0xd8,0x57,0xf7,0x87,0x42,0x44,0x59,0x32,0x20,0x8d,
+ 0x04,0x20,0x8a,0x65,0x55,0xdb,0x7c,0x38,0x17,0xff,0x71,0x50,0xac,0xb4,0xc2,0x78,0x03,0xbf,0x68,0x2b,0x17,0x84,0xed,0x3f,0xf4,0x2e,0x1d,0x06,0x60,0xbd,0x54,0x24,0x98,0x90,0x20,0x8d,
+ 0x04,0x20,0x8b,0x7f,0x0b,0xa8,0x27,0xe3,0xe8,0xaf,0x7a,0x2d,0x0d,0xce,0x7b,0xec,0xbe,0x6c,0xca,0x2f,0x55,0x39,0x5f,0x40,0xd5,0x37,0x28,0x11,0xec,0xf3,0x43,0x74,0x5e,0x7c,0x20,0x8d,
+ 0x04,0x20,0x8b,0xb4,0xb4,0x40,0xa6,0x0a,0x5f,0x80,0x8b,0xdd,0x05,0x30,0xf8,0x89,0x87,0xb1,0x4a,0x8f,0x59,0x1f,0x50,0x98,0x34,0x08,0x79,0xae,0xf1,0xea,0x12,0x91,0x56,0x39,0x20,0x8d,
+ 0x04,0x20,0x8c,0x38,0xca,0xb7,0x97,0xab,0x66,0xd6,0x5b,0xf2,0x73,0x23,0xa0,0xa2,0x92,0xb4,0xd0,0xad,0xf6,0xb7,0x71,0x9a,0x40,0xea,0x36,0x87,0xa4,0xf7,0x53,0xa5,0xc6,0xdb,0x20,0x8d,
+ 0x04,0x20,0x8c,0x3a,0x05,0xa8,0x77,0xa0,0xd2,0x41,0xc9,0x6e,0x22,0x3b,0x4e,0xdf,0x7f,0xe1,0x01,0x29,0x82,0x0e,0xbd,0x87,0xc7,0xf6,0x43,0x4e,0xc9,0x69,0x13,0xbc,0x89,0x94,0x20,0x8d,
+ 0x04,0x20,0x8c,0x6e,0x97,0xbe,0x70,0xbd,0x71,0x72,0x43,0xd0,0xf9,0x11,0xf2,0x7a,0x1e,0x7f,0x03,0x03,0xff,0xb5,0x99,0xdc,0xb1,0x4c,0x9b,0x97,0x3a,0xb3,0x68,0xf1,0xb3,0xa1,0x20,0x8d,
+ 0x04,0x20,0x8d,0x5f,0x62,0x56,0x46,0x78,0xd0,0xfc,0xe8,0x96,0x33,0x28,0x92,0x15,0x6d,0x46,0xce,0xbf,0x94,0x37,0x5f,0x16,0xa5,0xcd,0x22,0xba,0x65,0x92,0xc4,0x59,0x1d,0xf1,0x20,0x8d,
+ 0x04,0x20,0x8d,0xc8,0x9a,0x06,0xd6,0xf7,0xc8,0x61,0x5b,0xd2,0x79,0x29,0xc4,0xd5,0xbb,0xa1,0xf8,0x7e,0x8c,0x51,0x72,0x87,0xb0,0x90,0x6e,0xb8,0x35,0x00,0xf2,0xda,0xb6,0xbe,0x20,0x8d,
+ 0x04,0x20,0x96,0x8f,0xa3,0x0d,0x59,0xeb,0x15,0xc8,0x44,0xa2,0x32,0x08,0x27,0x08,0x2a,0x53,0x80,0xf9,0x1e,0x99,0x91,0x7a,0xcb,0xb7,0xa2,0x5f,0xbe,0xf9,0xe4,0xd3,0x8c,0x2b,0x20,0x8d,
+ 0x04,0x20,0x96,0xd4,0x2a,0xb8,0x45,0x35,0x4e,0x55,0x83,0x3c,0x73,0x95,0xbc,0xdf,0x07,0x82,0xe7,0xb5,0x0b,0x3d,0xcd,0x9a,0x49,0x5e,0x9b,0x85,0x35,0xab,0xb1,0x4c,0xba,0x80,0x20,0x8d,
+ 0x04,0x20,0x97,0x24,0x0c,0xbd,0xa4,0x97,0xbf,0x18,0x1a,0xea,0x59,0x7a,0xbf,0x42,0x26,0xca,0x32,0x0c,0x53,0x0c,0x80,0xf4,0x22,0x1e,0x3d,0xce,0xc6,0xdb,0x41,0x3a,0x9b,0x9a,0x20,0x8d,
+ 0x04,0x20,0x97,0x27,0xe2,0x3a,0x34,0xf0,0x79,0x79,0x7e,0x98,0x4f,0x1f,0xf0,0x9e,0x0e,0x0e,0xff,0xb0,0x6a,0x54,0x3c,0xfe,0x63,0x04,0x80,0x11,0x2a,0x85,0xd9,0x3f,0xee,0x97,0x20,0x8d,
+ 0x04,0x20,0x97,0xe8,0xe3,0x19,0x4c,0x95,0x68,0x72,0x97,0x8a,0xd4,0x7a,0x96,0xcc,0x42,0x47,0x53,0x68,0xd9,0xa9,0x31,0x83,0xa5,0x6b,0x36,0x36,0xe5,0xc2,0x33,0xf7,0x3f,0x51,0x20,0x8d,
+ 0x04,0x20,0x90,0x13,0x63,0xb6,0xb1,0x06,0x9f,0x80,0xee,0x5e,0xdb,0xd0,0xda,0x19,0x60,0x5a,0x28,0xdf,0xfa,0xc2,0xbd,0xcf,0x92,0xd0,0x1d,0x4f,0x7e,0x8c,0x37,0x77,0xfd,0x85,0x20,0x8d,
+ 0x04,0x20,0x90,0x30,0x0a,0x03,0xdd,0x3a,0x00,0x24,0xa6,0xd5,0xbd,0xd4,0x9b,0x35,0xe3,0xf1,0x04,0x9b,0x3a,0xda,0x9d,0x7c,0xaf,0xa2,0x8f,0xdd,0x77,0x28,0x92,0x00,0xe8,0xa1,0x20,0x8d,
+ 0x04,0x20,0x93,0x38,0xc2,0x74,0x27,0xa6,0xad,0x8f,0x06,0x9c,0xb7,0x76,0x4d,0x58,0xa5,0x52,0x00,0xb0,0x48,0x27,0xf1,0x5a,0x94,0x54,0xbb,0xd0,0x60,0x93,0xa5,0xa9,0x58,0x7d,0x20,0x8d,
+ 0x04,0x20,0x93,0xf3,0x65,0x80,0x66,0x54,0xcd,0xe9,0xc0,0x3c,0x65,0x1f,0x3c,0x2c,0xb4,0x1b,0xa0,0x0b,0xcb,0x26,0xcf,0x0e,0xe5,0xaa,0x45,0x9c,0x71,0x86,0x35,0x93,0x74,0x3d,0x20,0x8d,
+ 0x04,0x20,0x94,0x58,0x2a,0xc3,0x0c,0x25,0x8a,0x4c,0x35,0x63,0x33,0x8e,0xaa,0x71,0xf1,0xf5,0xa3,0x77,0x4e,0x83,0x2e,0x37,0xc5,0x96,0x29,0x93,0x9c,0x49,0xea,0x75,0x94,0x68,0x20,0x8d,
+ 0x04,0x20,0x94,0xfc,0x29,0xc9,0x1d,0xa6,0x6a,0xe0,0x96,0x10,0xfc,0x41,0x01,0x6a,0xc1,0xca,0xbf,0x37,0xb4,0x86,0x95,0x56,0x41,0xd9,0xcf,0x60,0x48,0x6c,0x16,0xe7,0x7a,0xb4,0x20,0x8d,
+ 0x04,0x20,0x95,0x2c,0x3a,0xf4,0x20,0x3f,0x68,0x36,0x4e,0x68,0x8e,0xfb,0x76,0x62,0xd2,0xd7,0x80,0x63,0x94,0xb8,0xf3,0x87,0xc2,0x25,0xd2,0xb9,0x4f,0xd5,0xfc,0xc6,0x81,0x03,0x20,0x8d,
+ 0x04,0x20,0x95,0x5d,0xcb,0x45,0x86,0x7f,0x99,0x61,0x7b,0x89,0x58,0xb3,0xb6,0x38,0x17,0x39,0xc5,0x9b,0x04,0x7c,0xc5,0x2c,0xc8,0xa1,0x5c,0x94,0x82,0x09,0x06,0x4b,0x7f,0xba,0x20,0x8d,
+ 0x04,0x20,0x96,0x2d,0x61,0x8b,0xf8,0x6f,0x35,0x07,0x1d,0xf0,0xa2,0x82,0x71,0xb6,0xed,0xd3,0xe6,0xca,0xfb,0x9b,0xe2,0xe9,0xd2,0xdd,0x04,0xa3,0xa1,0x0d,0xfc,0x55,0x87,0xe6,0x20,0x8d,
+ 0x04,0x20,0x96,0x47,0xa6,0xe0,0x3d,0xae,0xed,0x69,0x1c,0x3e,0x4c,0x06,0xa0,0x17,0x3c,0x55,0x1d,0x4a,0xd0,0x70,0xde,0x5b,0xb6,0x6e,0xa2,0xdf,0xbf,0x10,0x0e,0xe3,0x47,0x86,0x20,0x8d,
+ 0x04,0x20,0x9e,0xfb,0x9b,0xe5,0x1e,0x0b,0x27,0x0d,0x69,0x96,0x1b,0x30,0x6c,0x25,0xcf,0x3b,0x6b,0x3f,0xd8,0x95,0xac,0x6e,0x26,0x34,0x5a,0x7f,0x8d,0xc7,0x25,0xf6,0x3c,0xdc,0x20,0x8d,
+ 0x04,0x20,0x98,0x9d,0x1a,0xcb,0x18,0x3a,0x33,0x46,0x13,0x9d,0xf2,0x6e,0x89,0xf1,0x96,0xbc,0x35,0x33,0x41,0x4a,0xd6,0xb5,0x26,0xb2,0x39,0xe3,0xd0,0x4c,0x81,0x64,0x4f,0x6a,0x20,0x8d,
+ 0x04,0x20,0x99,0x27,0xc2,0x11,0x1d,0xa2,0x17,0x31,0x0c,0x7b,0x9f,0x8d,0x64,0x12,0x9d,0x3c,0x4a,0xc2,0xeb,0x49,0x22,0xbb,0x77,0xb7,0x31,0xa4,0x88,0xa4,0x9d,0x39,0x98,0x23,0x20,0x8d,
+ 0x04,0x20,0x99,0x8c,0x16,0x01,0x57,0xcc,0x47,0xf4,0xb1,0xc5,0x9f,0x54,0xda,0xa8,0xd1,0x87,0x6a,0x68,0x1b,0xa8,0x04,0x78,0x32,0x9c,0x30,0x4f,0x36,0x43,0xd5,0x0c,0xb8,0x6a,0x20,0x8d,
+ 0x04,0x20,0x99,0xe7,0x94,0xd3,0x88,0xcf,0x6b,0x89,0x89,0x3d,0x56,0xf4,0x64,0x5e,0x7b,0xc8,0x0d,0x09,0x02,0x98,0x56,0xcd,0x58,0x0a,0xd7,0xc3,0x04,0x12,0xea,0x87,0xd0,0xda,0x20,0x8d,
+ 0x04,0x20,0x99,0xee,0xe0,0x4b,0xc9,0x44,0x7a,0x96,0x2a,0x2e,0x46,0x51,0x66,0x20,0x82,0xac,0x55,0x3a,0x00,0x71,0xf2,0xf6,0x4e,0xa9,0x0f,0x3d,0xfe,0x4f,0x02,0xc7,0xea,0x12,0x20,0x8d,
+ 0x04,0x20,0x9a,0x0c,0xb7,0x33,0x0e,0x64,0x67,0x64,0x19,0x8e,0xbf,0x16,0x0c,0x8e,0xbd,0x09,0x60,0x2a,0x0a,0x50,0xd5,0xd2,0x86,0x22,0x6b,0x97,0xeb,0x5d,0x0b,0xeb,0x1b,0x8a,0x20,0x8d,
+ 0x04,0x20,0x9a,0xaf,0x7d,0x16,0xb9,0xe0,0xec,0x86,0x6d,0x52,0x87,0xb8,0x90,0x8b,0x84,0xcb,0xa6,0x36,0xfe,0x6c,0x01,0xde,0x23,0x1a,0x95,0x1b,0x5f,0x11,0xdd,0x26,0x66,0xbe,0x20,0x8d,
+ 0x04,0x20,0x9b,0xd2,0xbc,0x32,0x43,0x02,0xf0,0x0b,0x2f,0xd0,0xc5,0xb8,0xa9,0x88,0x09,0xe7,0x98,0xd0,0xf6,0x4b,0xc9,0x90,0xb7,0x79,0x8e,0x45,0x8e,0xaf,0x60,0xf2,0x92,0x69,0x20,0x8d,
+ 0x04,0x20,0x9d,0xc0,0x03,0xc0,0xea,0xf7,0x58,0xdb,0xe4,0x6d,0x0b,0xa1,0xe3,0xdb,0xe1,0xf9,0xa0,0xd4,0xd6,0x7c,0x04,0x9f,0x07,0x69,0x0a,0xa7,0x76,0xb5,0x77,0xf5,0x50,0xfe,0x20,0x8d,
+ 0x04,0x20,0x9e,0x6e,0x55,0x14,0x89,0x66,0x57,0xed,0xf2,0x10,0xc0,0x44,0xff,0x08,0xaa,0xb7,0xf8,0x7c,0xc7,0x1e,0x28,0x77,0xfd,0x06,0x58,0xf2,0xc5,0xbf,0xc8,0x8c,0x24,0x0c,0x20,0x8d,
+ 0x04,0x20,0xa6,0xb9,0xb0,0xb4,0xbb,0x7f,0x79,0x45,0x93,0x94,0x6f,0x54,0x39,0x64,0x5b,0x6f,0x46,0x2a,0xbd,0x3c,0x73,0x8a,0x33,0x06,0x9d,0xcc,0x15,0x68,0x44,0x4a,0x22,0x64,0x20,0x8d,
+ 0x04,0x20,0xa6,0x9a,0x97,0xdd,0x94,0xcc,0xa6,0x4c,0x61,0x8f,0xbc,0x33,0xdc,0xbd,0x9f,0x06,0xa3,0xb1,0x05,0xb6,0x78,0xbf,0x46,0x94,0xca,0xec,0x35,0x8d,0xae,0x76,0xc7,0x14,0x20,0x8d,
+ 0x04,0x20,0xa6,0xc8,0x38,0xcf,0x24,0x1d,0x7b,0x36,0x65,0x19,0x03,0x16,0x9f,0x37,0x8a,0x63,0xcb,0x16,0xf0,0x8a,0xad,0xca,0x97,0xe4,0x14,0xbb,0xb1,0xc4,0xbe,0x5b,0x74,0x72,0x20,0x8d,
+ 0x04,0x20,0xa6,0xe0,0x7b,0xd8,0x61,0x62,0x55,0x2d,0x1c,0x25,0x75,0x20,0x2a,0xb8,0x96,0x09,0x40,0x34,0xba,0x62,0x31,0x5a,0xbf,0x77,0xc0,0x38,0x77,0xb4,0x33,0x1c,0x03,0x41,0x20,0x8d,
+ 0x04,0x20,0xa7,0x04,0x38,0x9a,0x21,0x60,0xdb,0x7c,0xd8,0x51,0x28,0x88,0x90,0x89,0xea,0x70,0xb7,0x43,0x50,0x8e,0xa2,0xfb,0xa0,0xa2,0x22,0x97,0x8e,0x52,0x25,0x66,0x2b,0xd5,0x20,0x8d,
+ 0x04,0x20,0xa0,0xa6,0x1a,0xaa,0x6d,0xf4,0x5f,0x11,0xf6,0x20,0xd8,0x72,0xb6,0x5f,0x4d,0x59,0x9d,0x1d,0xb1,0xa4,0x5e,0x93,0x4f,0x79,0x04,0x4e,0x14,0x59,0xae,0x2e,0x2a,0xf1,0x20,0x8d,
+ 0x04,0x20,0xa1,0x0c,0x9c,0x3d,0x58,0x98,0x3b,0xda,0x68,0xfd,0x7c,0x81,0x05,0xd0,0x4f,0x76,0xe4,0xcd,0x9e,0x34,0x64,0xb0,0x6e,0x63,0xf0,0xd7,0x15,0x7b,0x6d,0x77,0x9a,0x95,0x20,0x8d,
+ 0x04,0x20,0xa1,0x95,0x0d,0xa9,0x7e,0xa3,0x52,0xce,0xd4,0xbf,0x9e,0xd7,0xc1,0x11,0xa9,0x97,0xf6,0x24,0x02,0x50,0x85,0x22,0x38,0x33,0x02,0xe6,0x51,0xd4,0xcc,0x3d,0xfd,0xf4,0x20,0x8d,
+ 0x04,0x20,0xa2,0x38,0x8d,0x2e,0x64,0x39,0x44,0x75,0x6c,0xaa,0x6f,0x8b,0x29,0x02,0x3c,0x83,0xb7,0xba,0xfe,0x18,0x26,0xe6,0x47,0x65,0x4c,0xc1,0x8e,0x9a,0x9a,0x01,0xb0,0x74,0x20,0x8d,
+ 0x04,0x20,0xa3,0x7e,0x09,0x5b,0x37,0xe1,0x92,0x4c,0x33,0x49,0x37,0x1b,0xee,0x9d,0xfb,0x6b,0x0c,0x5a,0x9f,0xbc,0x79,0xd4,0x87,0xfe,0x09,0x7d,0x06,0x40,0x25,0x83,0x50,0xcf,0x20,0x8d,
+ 0x04,0x20,0xa4,0x95,0xe9,0x6f,0x0a,0x2e,0x61,0xa6,0x3a,0xdf,0x13,0x2f,0xee,0xe7,0x00,0x81,0x44,0xa1,0xa4,0x59,0x52,0xbc,0x06,0x33,0x6e,0x24,0x05,0x28,0xa1,0x78,0xf5,0x6d,0x20,0x8d,
+ 0x04,0x20,0xa4,0x96,0xa4,0x92,0xd0,0x3f,0x70,0x08,0x3e,0x71,0x2e,0xd6,0x36,0x19,0x09,0xb5,0x1b,0x7d,0x5f,0x38,0x78,0x01,0x3c,0x62,0x4e,0x51,0x64,0x13,0x95,0x4d,0x83,0xa3,0x20,0x8d,
+ 0x04,0x20,0xa4,0xa7,0xfd,0x67,0x76,0x91,0x88,0x51,0x25,0x45,0xc0,0x43,0xa0,0x84,0xf8,0xa3,0xf5,0x91,0x0d,0x03,0xc8,0xef,0x99,0x70,0x0c,0x9a,0xf1,0xfa,0x06,0xba,0x5a,0x4c,0x20,0x8d,
+ 0x04,0x20,0xa6,0x6e,0x88,0x1c,0x92,0xf2,0xa4,0x50,0xb1,0x7d,0xbf,0xf9,0xc9,0xd7,0xa1,0x7a,0xa6,0x92,0x1d,0xc4,0x1f,0xbe,0xbd,0x94,0x24,0x23,0x8b,0xbb,0xc3,0x17,0x87,0x1f,0x20,0x8d,
+ 0x04,0x20,0xae,0xf5,0xf1,0x37,0x32,0xb7,0xca,0x72,0x21,0x9e,0xd9,0x89,0xa7,0x77,0x95,0x74,0xcd,0x90,0x47,0x0f,0x8d,0x49,0xca,0x4a,0xf9,0x80,0x2a,0xec,0x90,0x56,0x15,0x1b,0x20,0x8d,
+ 0x04,0x20,0xa8,0x02,0x67,0xf1,0x1f,0x5d,0x19,0xe5,0x09,0x57,0xf4,0xda,0x10,0xf4,0xc1,0x68,0xb5,0x2a,0x8f,0x65,0x29,0x1c,0x1d,0x8c,0x4e,0x8d,0x62,0xe8,0x0a,0xec,0x26,0xde,0x20,0x8d,
+ 0x04,0x20,0xa8,0x14,0xc8,0x00,0x55,0x8a,0xab,0xba,0x95,0xce,0x87,0xa5,0xf9,0x13,0x70,0xf4,0x67,0x89,0xd2,0xbd,0x7a,0xbe,0xe3,0xbb,0xbe,0x8f,0x83,0xc8,0x1d,0x7c,0x64,0x0a,0x20,0x8d,
+ 0x04,0x20,0xa8,0x9c,0x2f,0xac,0x6b,0x58,0xbd,0x83,0x60,0x6a,0x40,0x09,0xe6,0x39,0xf7,0x29,0xe8,0xd2,0x0c,0xc2,0x7a,0x42,0x79,0x7b,0x6c,0x53,0x3d,0x5f,0xce,0x28,0xa8,0xf8,0x20,0x8d,
+ 0x04,0x20,0xa8,0xb3,0x7b,0x4d,0x2b,0x52,0x16,0x49,0x9e,0x96,0xfe,0x23,0x02,0xb4,0x43,0xea,0xd4,0x5c,0xf9,0x25,0x91,0x14,0xbb,0x8a,0x1b,0x0f,0x31,0x82,0x1b,0xd7,0x5d,0x56,0x20,0x8d,
+ 0x04,0x20,0xa9,0x0c,0xbf,0x09,0x88,0xca,0xdc,0x38,0x52,0xc0,0xb5,0x9b,0xa3,0x26,0x65,0xba,0xdc,0x07,0xe8,0xed,0x81,0xc5,0xcc,0x3e,0xdc,0x64,0x33,0x3f,0xc1,0x67,0x52,0xdc,0x20,0x8d,
+ 0x04,0x20,0xa9,0x40,0x1a,0xbc,0x3d,0x96,0xc4,0x18,0xfd,0x65,0x13,0x50,0xce,0x8b,0xc9,0x7d,0x57,0x2e,0xed,0xfd,0x2f,0x2a,0xdc,0x91,0x61,0xa7,0xfb,0x73,0x51,0x86,0xec,0x29,0x20,0x8d,
+ 0x04,0x20,0xa9,0x63,0xba,0xbf,0x68,0x2c,0x65,0x80,0x76,0x99,0x2d,0xa3,0xe5,0x39,0xee,0x5b,0x8e,0x65,0x9e,0x3c,0x04,0x9d,0xd3,0xcd,0x8e,0xfa,0x65,0xd2,0x61,0xae,0xd9,0x63,0x20,0x8d,
+ 0x04,0x20,0xa9,0xa4,0x0d,0x47,0x4b,0x73,0xa8,0x41,0x93,0x86,0x8f,0xc7,0x52,0x8d,0x72,0x87,0x75,0x1a,0x85,0xe3,0x1a,0x17,0x3c,0xfa,0x3d,0x8d,0x9e,0x98,0x59,0xe3,0x66,0x59,0x20,0x8d,
+ 0x04,0x20,0xab,0x3d,0x24,0x57,0xa9,0x5f,0x6c,0x70,0xeb,0x50,0x84,0x6e,0x4f,0x74,0x4d,0xa4,0xf7,0x49,0x89,0x86,0x03,0xbf,0x30,0x25,0x4d,0x28,0xd9,0x3e,0x40,0x2a,0x90,0xe9,0x20,0x8d,
+ 0x04,0x20,0xab,0x1c,0x14,0x86,0x08,0xe0,0x9d,0x2d,0x7a,0x87,0xe3,0xdb,0x33,0x20,0x8b,0xbe,0x64,0xcf,0x4a,0xdb,0xe6,0x4f,0x05,0xa2,0xa9,0x01,0x0d,0x96,0xbd,0x70,0x4a,0xe5,0x20,0x8d,
+ 0x04,0x20,0xab,0x31,0x92,0xae,0x37,0x27,0x76,0xb8,0xe5,0x25,0x47,0x84,0xd9,0x17,0xbf,0x47,0x06,0xea,0xb5,0x13,0xc3,0xd2,0x7c,0x3a,0xaa,0x3f,0x67,0xe9,0xfd,0x6d,0xda,0xfc,0x20,0x8d,
+ 0x04,0x20,0xab,0xbd,0xfd,0xa9,0x19,0x3d,0x55,0xed,0x5a,0xe3,0x92,0x29,0xe1,0x17,0xb1,0x33,0x00,0xf5,0x4e,0xf7,0xd2,0xff,0x99,0xde,0xb9,0x2c,0x9a,0x3a,0x7a,0x4f,0x0f,0x68,0x20,0x8d,
+ 0x04,0x20,0xab,0x94,0xc5,0xf5,0xfd,0xe1,0x9d,0x0f,0xec,0xb4,0x1b,0xdd,0xa8,0xe6,0x30,0xd1,0x4d,0x72,0x29,0xae,0x02,0x7d,0xc0,0xfb,0x8b,0x80,0xb8,0x7a,0xc1,0xc7,0x22,0xe4,0x20,0x8d,
+ 0x04,0x20,0xac,0x2f,0xa9,0x9f,0xf3,0x9f,0x9a,0x63,0x6d,0xb4,0x12,0x2e,0x3c,0xae,0xb6,0xe7,0x43,0xf6,0x83,0x89,0xec,0xa2,0xab,0x0a,0x0b,0x33,0xb9,0x54,0x5e,0xbd,0x52,0x3b,0x20,0x8d,
+ 0x04,0x20,0xac,0xce,0x37,0xc9,0x6e,0x77,0x03,0x51,0xc1,0x66,0xc3,0x0f,0x9f,0xc6,0x05,0x71,0x6d,0xed,0xa6,0xba,0x41,0x28,0x48,0x02,0xde,0x43,0x6f,0x19,0xf5,0xc2,0x3f,0xc6,0x20,0x8d,
+ 0x04,0x20,0xad,0x12,0xd2,0x90,0xbe,0xdb,0x4f,0x56,0x6c,0xa3,0xc1,0x74,0x5b,0x2a,0x26,0xb0,0xc2,0x6b,0xf1,0x8e,0xaf,0x56,0x57,0xca,0x56,0x6b,0xd0,0xc0,0x9f,0x15,0xd4,0x31,0x20,0x8d,
+ 0x04,0x20,0xad,0x52,0xf0,0x0c,0xac,0x35,0x9c,0x25,0x6e,0x07,0x57,0x98,0x3c,0x66,0x28,0x12,0x16,0x69,0x04,0xc0,0xca,0x8d,0x5b,0x4f,0xfd,0x69,0x70,0x7b,0xa1,0x7d,0xb3,0x8d,0x20,0x8d,
+ 0x04,0x20,0xad,0xf1,0x28,0x47,0xa5,0xdd,0x98,0x26,0xb5,0x6a,0x14,0xf6,0x9f,0xad,0xef,0x4a,0x1b,0x8c,0x7e,0xac,0x43,0x4b,0xf8,0x13,0x53,0x9d,0x9f,0x22,0xde,0x37,0x9a,0x43,0x20,0x8d,
+ 0x04,0x20,0xae,0x56,0x40,0x4d,0xa2,0xb9,0x96,0x0c,0x97,0x16,0xf1,0x7c,0xa2,0x41,0x1b,0xd7,0xfc,0x5d,0x1c,0x96,0x32,0x24,0xe7,0xa0,0x77,0x3e,0x99,0x7d,0xd2,0xf4,0xe2,0x0a,0x20,0x8d,
+ 0x04,0x20,0xb6,0xa1,0x54,0xdd,0xba,0x22,0xd3,0x1e,0x9b,0x52,0xf3,0x78,0xf6,0xe2,0x1a,0xfa,0x6d,0x8c,0x0e,0x64,0x91,0x46,0x9d,0x65,0x7e,0x54,0xb3,0xb1,0x02,0x0e,0x83,0x11,0x20,0x8d,
+ 0x04,0x20,0xb6,0xc2,0xaf,0x27,0xaa,0xee,0xca,0xcb,0xf3,0x05,0xe7,0xd0,0x8f,0x2d,0x20,0xf5,0x65,0x33,0x2b,0x5e,0xea,0x2f,0x4c,0x44,0xcb,0x3b,0xd0,0xbe,0xf0,0x48,0x88,0x9d,0x20,0x8d,
+ 0x04,0x20,0xb7,0x1e,0x2b,0xd4,0x90,0xf3,0x25,0x26,0xab,0xe4,0x31,0xbc,0x3a,0x46,0xdf,0x68,0xf2,0xd9,0xfc,0x43,0xfb,0xca,0xde,0xc3,0x65,0xf5,0x25,0x0e,0xc0,0xcc,0xbf,0x26,0x20,0x8d,
+ 0x04,0x20,0xb7,0xe9,0x76,0x85,0xee,0xfb,0x7a,0x45,0x45,0x69,0x9b,0x7e,0x0c,0x1e,0x2c,0x88,0x53,0x02,0x0c,0xbf,0xca,0x2e,0xfc,0x2d,0x32,0x8d,0xb4,0x13,0xfb,0xe5,0xa8,0x4b,0x20,0x8d,
+ 0x04,0x20,0xb0,0x12,0x68,0x3f,0x4a,0xbe,0xf4,0x7d,0x58,0x81,0xdc,0x06,0x19,0x03,0x91,0xa2,0x1b,0xcc,0xed,0xeb,0xb8,0x8d,0xfb,0x8e,0x65,0x27,0xfb,0x47,0x48,0xcc,0xb6,0xde,0x20,0x8d,
+ 0x04,0x20,0xb0,0x5f,0xab,0x43,0x1b,0x87,0x29,0x9c,0xbd,0x12,0xd7,0x8b,0xf3,0xd4,0x80,0x72,0xaa,0x12,0xf5,0x2d,0x56,0xf3,0xcd,0x49,0x21,0xaf,0xa8,0x0a,0x5a,0x1e,0x76,0x36,0x20,0x8d,
+ 0x04,0x20,0xb0,0xe5,0x84,0x11,0xd5,0x9c,0xe6,0x97,0x1b,0x47,0x18,0xc2,0x2e,0x35,0xd0,0xdd,0xc6,0x8c,0x4d,0x12,0xfb,0x4f,0x45,0xf5,0x52,0xd4,0x50,0x4e,0x3d,0x64,0x29,0x37,0x20,0x8d,
+ 0x04,0x20,0xb1,0x68,0x51,0x13,0xfa,0x0b,0x54,0x70,0x13,0xfd,0x46,0x1a,0x37,0x85,0x07,0xcc,0x7f,0xeb,0x8b,0xcd,0x59,0x0e,0x7c,0xa0,0xf1,0x6b,0x20,0x38,0x63,0x57,0x64,0x69,0x20,0x8d,
+ 0x04,0x20,0xb1,0xf6,0x21,0xc9,0xa9,0xc2,0xeb,0x18,0x9c,0x2d,0x44,0xbf,0xb2,0xe2,0x32,0xc7,0x76,0x5c,0x15,0x40,0x49,0xc2,0x5f,0x8d,0x6e,0x0a,0x44,0x24,0xbf,0xa9,0xe9,0x2b,0x20,0x8d,
+ 0x04,0x20,0xb1,0xfa,0x87,0xad,0xc8,0x91,0x27,0x8b,0xa2,0x19,0xa4,0xca,0x3e,0xa8,0x1a,0xb9,0x5e,0xd2,0xca,0x59,0x99,0xec,0x41,0x59,0xcc,0x66,0x24,0x87,0xed,0x22,0x08,0x37,0x20,0x8d,
+ 0x04,0x20,0xb3,0x4f,0x12,0xa7,0x69,0xab,0xca,0xeb,0x40,0x1c,0xc1,0x78,0xcd,0xf4,0xe0,0x12,0x34,0x9b,0x9a,0xf0,0xd4,0xe8,0x64,0xc5,0x07,0xfc,0xf4,0xaf,0xa3,0x29,0xdf,0xbf,0x20,0x8d,
+ 0x04,0x20,0xb3,0x84,0xa5,0x22,0x4e,0xe8,0x0a,0x7e,0x7c,0xcf,0x78,0x17,0x05,0xe2,0x30,0x18,0xde,0x90,0x14,0xd3,0x87,0x65,0x89,0x51,0xea,0x1a,0x2d,0x69,0x41,0xbe,0x39,0xa1,0x20,0x8d,
+ 0x04,0x20,0xb4,0x4e,0x85,0x5d,0x4f,0xb4,0xa4,0x7d,0x25,0xbb,0x13,0x10,0x28,0x9b,0x2f,0x45,0x80,0x6a,0xdf,0x76,0x2d,0x62,0x18,0xb9,0x20,0x88,0x36,0xd2,0x05,0x76,0x06,0x8e,0x20,0x8d,
+ 0x04,0x20,0xb4,0xbb,0xa3,0xe9,0xa1,0x53,0x68,0x19,0x74,0xf6,0x8a,0xd4,0x01,0xfe,0x71,0x9c,0x5f,0x4d,0x83,0xaa,0x84,0x13,0x34,0x20,0xdf,0x25,0x17,0x65,0x1b,0xff,0xff,0x6b,0x20,0x8d,
+ 0x04,0x20,0xb4,0xc7,0x93,0x5b,0x9e,0xb8,0x70,0x34,0x53,0xe2,0xe5,0xfa,0xe4,0xe2,0xa2,0xe6,0x7d,0x47,0xb3,0x13,0xa0,0x0c,0x72,0x63,0xea,0xf3,0x4e,0xf0,0x01,0xb3,0x63,0x2c,0x20,0x8d,
+ 0x04,0x20,0xb5,0xdb,0x05,0x00,0x68,0xfb,0x22,0x70,0x05,0x33,0xfe,0xb4,0xb9,0xd5,0x3b,0x77,0x73,0x46,0x0d,0x69,0x20,0x2c,0x45,0x17,0xe6,0x57,0x64,0xb1,0x40,0x5a,0x28,0xc2,0x20,0x8d,
+ 0x04,0x20,0xbe,0x99,0x8f,0x18,0xc6,0x26,0x21,0xa5,0x0c,0x77,0x8e,0x82,0x01,0xef,0x57,0xf2,0xe8,0x00,0xd2,0x57,0xb0,0xc2,0x01,0x75,0x34,0x83,0xf9,0x9b,0x65,0x30,0xbe,0x1d,0x20,0x8d,
+ 0x04,0x20,0xbe,0x9b,0xf9,0x28,0x32,0x00,0xa8,0x18,0xe6,0x4d,0xa8,0xd3,0xdc,0xca,0x71,0xf4,0x93,0x23,0x66,0xad,0xf7,0x9e,0x3d,0x4d,0x4c,0xc8,0x47,0x9c,0xff,0x3d,0x79,0xd9,0x20,0x8d,
+ 0x04,0x20,0xbe,0xe4,0x29,0x2b,0xd7,0xe9,0x5d,0x2f,0x1d,0xae,0x42,0xfb,0xa6,0x6e,0xc4,0x21,0xcf,0xb2,0x90,0x85,0x85,0x93,0x5f,0xce,0x11,0x2a,0x49,0x17,0x49,0xd0,0x1d,0x46,0x20,0x8d,
+ 0x04,0x20,0xbf,0x19,0x64,0x59,0x52,0x4f,0x5e,0x45,0xfb,0xfa,0x59,0x86,0xc9,0x5c,0x53,0x5c,0xda,0x40,0x2c,0x39,0x18,0x37,0xc1,0x0f,0x54,0x8f,0xae,0xd6,0x1f,0x8e,0xd9,0xcc,0x20,0x8d,
+ 0x04,0x20,0xb8,0x60,0x1c,0x77,0xc4,0x14,0x0f,0x98,0x5b,0xa4,0xd7,0x41,0x04,0xf9,0x23,0xf8,0x77,0x3f,0x85,0x57,0x77,0xd4,0x7a,0x9f,0x7f,0x49,0x8c,0x92,0x1e,0x4f,0xc1,0xfe,0x20,0x8d,
+ 0x04,0x20,0xb8,0x6e,0x79,0xd4,0xd9,0xc7,0x10,0xac,0x59,0x0c,0xfe,0x56,0x4a,0x0a,0x81,0x93,0x57,0xf2,0x16,0x0e,0xb0,0xdd,0x0a,0x28,0xa9,0x37,0x18,0xac,0xcb,0x92,0x8f,0xaa,0x20,0x8d,
+ 0x04,0x20,0xba,0x19,0x26,0xb6,0x08,0x2c,0x9f,0x05,0x46,0xaa,0x19,0x03,0x28,0xdd,0x86,0x36,0x57,0x4f,0x70,0xf2,0xba,0x5f,0xb8,0x5b,0xbd,0xa3,0xa4,0x55,0xd4,0x26,0x7f,0x55,0x20,0x8d,
+ 0x04,0x20,0xba,0xf7,0x25,0xa5,0x9b,0x7b,0x68,0xb0,0xa7,0xed,0x8e,0x5e,0xf5,0x0b,0x85,0x6d,0xa7,0x72,0x4d,0x8f,0xc6,0xb9,0x1c,0xae,0x90,0xbc,0x79,0x4c,0x3f,0x60,0xa3,0x66,0x20,0x8d,
+ 0x04,0x20,0xbb,0x23,0xd2,0x3c,0x76,0xa5,0x70,0xbb,0x48,0x95,0xcc,0x37,0xa7,0x59,0x07,0x55,0xd5,0x60,0x23,0x06,0x3c,0x43,0xc6,0x26,0x92,0x2b,0x83,0xf1,0x80,0x0c,0x4b,0x30,0x20,0x8d,
+ 0x04,0x20,0xbb,0x78,0x28,0x84,0xe9,0xc6,0x04,0x14,0xe9,0xe0,0xdc,0x29,0x5f,0x6f,0x7b,0x46,0xae,0xf6,0x48,0x41,0xcc,0x8e,0xc9,0x48,0x27,0xa0,0x8e,0x2f,0xf0,0x7e,0xa3,0xce,0x20,0x8d,
+ 0x04,0x20,0xbb,0xc7,0x29,0xf9,0x7a,0x10,0x56,0x07,0x86,0x3c,0xa0,0x51,0xaa,0x86,0xad,0xd1,0xc3,0x18,0xf5,0x9c,0x92,0x57,0xd1,0xfd,0x11,0x7e,0x43,0xdc,0x2f,0x2e,0xd6,0x94,0x20,0x8d,
+ 0x04,0x20,0xbc,0x47,0xc7,0x7c,0x32,0xfe,0xbf,0xa7,0x84,0xf0,0x9c,0xe1,0x9c,0xd0,0x65,0x78,0xf2,0x9a,0xe5,0xcf,0x10,0x66,0x35,0x5c,0x97,0x22,0x49,0x40,0x9e,0x68,0x32,0x26,0x20,0x8d,
+ 0x04,0x20,0xbc,0xfa,0xf9,0xe8,0xcd,0xd4,0x1a,0xf8,0xe7,0xb5,0xa8,0xc2,0x49,0xf1,0xfc,0xb1,0x8b,0xb2,0x24,0x30,0xff,0xcd,0x40,0x63,0xa5,0xca,0x57,0x73,0x37,0xe3,0x63,0x73,0x20,0x8d,
+ 0x04,0x20,0xbc,0xd1,0xc5,0x0d,0x7c,0x72,0x65,0x2e,0x75,0xc8,0x77,0x4e,0x08,0xe4,0xc7,0x21,0x3f,0x98,0xea,0xc7,0xcb,0xba,0x66,0xf3,0xe5,0xff,0x22,0x63,0xf0,0xfb,0xaa,0xe1,0x20,0x8d,
+ 0x04,0x20,0xbe,0x79,0xed,0xa8,0xc3,0x91,0xc8,0xf4,0x97,0xe6,0x9b,0x65,0x74,0x05,0x20,0x73,0x26,0x1a,0x2a,0x47,0xd5,0x85,0xce,0x7e,0xe6,0x05,0x99,0x15,0xf0,0x21,0x28,0x72,0x20,0x8d,
+ 0x04,0x20,0xc0,0x52,0x8d,0x4a,0x55,0x17,0x12,0x4e,0x0a,0x19,0x08,0x07,0xa7,0x8b,0x31,0x38,0x1a,0x27,0x1d,0xb8,0xc7,0xbc,0xe3,0x48,0x2f,0x36,0xc7,0xe0,0xc9,0xf5,0x3f,0x81,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,0x22,0xd5,0x31,0xb6,0x7e,0xb6,0x01,0xe2,0x56,0x4d,0x5b,0x5b,0x7e,0x98,0x94,0xbf,0x59,0x84,0xa2,0x40,0x95,0x0f,0x50,0xdf,0x46,0xfa,0x30,0x15,0x86,0x2a,0x47,0x20,0x8d,
+ 0x04,0x20,0xc4,0x89,0xef,0x0d,0x22,0x1c,0x56,0xc4,0xd6,0xeb,0xc2,0x03,0x8c,0x13,0x72,0xfc,0x7a,0x7a,0xf3,0xfc,0x44,0xc8,0x09,0x6e,0x6f,0x5c,0x34,0xfd,0x14,0x0c,0x95,0xd4,0x20,0x8d,
+ 0x04,0x20,0xc4,0xc2,0x40,0x14,0x0b,0x78,0xa6,0xb9,0x5f,0x52,0xd4,0x1e,0x76,0x82,0xca,0x00,0x67,0x4d,0x24,0x3b,0x6d,0x41,0x15,0x5a,0xbd,0xf8,0x60,0x36,0x5c,0xcc,0x39,0x34,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,0xc4,0xd9,0xd4,0x1e,0xce,0x2d,0x2f,0xc5,0x4e,0xe7,0x9d,0xc1,0xce,0xc8,0xe1,0x48,0x08,0xbc,0x07,0x2c,0x68,0x7f,0x48,0x21,0x6b,0x7d,0xf4,0x8c,0x33,0xb3,0x50,0x5b,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,0x87,0xf5,0xaf,0x3f,0x60,0x20,0x66,0xb9,0xc0,0x0f,0x03,0xe9,0x38,0xc5,0xf9,0x25,0x90,0x19,0x7f,0x3a,0x0d,0x1a,0xaa,0x5a,0x26,0x15,0x67,0x19,0x05,0xb1,0xf6,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,0x53,0xb1,0x05,0x7e,0x9f,0xdc,0x9d,0x17,0xcd,0x24,0x17,0xf0,0x9d,0xf0,0x5b,0x10,0xc7,0xf9,0x05,0xeb,0xc3,0x96,0x0b,0x29,0x47,0xd7,0xba,0x67,0x07,0x7a,0x44,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,0xca,0xc5,0x01,0xc3,0x21,0x34,0x38,0x33,0x82,0x4f,0x2f,0x87,0xe2,0x1d,0x47,0xca,0x6f,0xda,0xd8,0x7f,0xd2,0x1d,0x27,0xde,0xe1,0x1b,0x82,0x90,0x5d,0x1c,0x23,0xbc,0x20,0x8d,
+ 0x04,0x20,0xcb,0x01,0x28,0xb6,0x1d,0x34,0x2d,0x53,0x7f,0x15,0xf6,0xa7,0x2f,0x3f,0x16,0x6f,0x5e,0x84,0xb5,0xc7,0x31,0x60,0x17,0x79,0x38,0x9a,0x28,0x85,0x40,0x74,0x2b,0xfd,0x20,0x8d,
+ 0x04,0x20,0xcb,0x8c,0x8c,0x77,0x81,0x24,0x66,0x1c,0x1c,0x52,0xed,0x70,0x4f,0xdd,0x32,0x7d,0x2d,0x5c,0x18,0xce,0x61,0x0e,0x2f,0x37,0x53,0x0a,0xad,0x61,0xe7,0x0f,0xd9,0xed,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,
+ 0x04,0x20,0xcd,0xfb,0x39,0x81,0x98,0xab,0xb9,0x5c,0xee,0xfe,0xf7,0x89,0x00,0x13,0x3b,0xd7,0xc3,0x4c,0x7e,0x7a,0x65,0xd7,0xe9,0x95,0x15,0x08,0xb9,0xe1,0x0c,0xf1,0x9a,0xa3,0x20,0x8d,
};
static const uint8_t chainparams_seed_test[] = {
- 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,
+ 0x06,0x10,0xfc,0xcb,0x02,0x48,0x11,0xa6,0x10,0x42,0x0b,0xca,0x12,0x18,0xf7,0xce,0x7d,0x3d,0x47,0x9d,
+ 0x01,0x04,0x02,0x57,0x48,0xeb,0x47,0x9d,
+ 0x01,0x04,0x03,0xfd,0xa3,0x0e,0x47,0x9d,
+ 0x01,0x04,0x05,0xb6,0x04,0x6a,0x47,0x9d,
+ 0x01,0x04,0x05,0xbc,0x77,0xc4,0x47,0x9d,
+ 0x01,0x04,0x05,0xbd,0xaf,0x5c,0x47,0x9d,
+ 0x01,0x04,0x05,0xfc,0x15,0xe8,0x47,0x9d,
+ 0x01,0x04,0x05,0xff,0x61,0x5b,0x47,0x9d,
+ 0x01,0x04,0x05,0xff,0x63,0x82,0x47,0x9d,
+ 0x01,0x04,0x08,0xde,0xe4,0xd9,0x47,0x9d,
+ 0x01,0x04,0x12,0x8f,0x6c,0xd5,0x47,0x9d,
+ 0x01,0x04,0x17,0x5d,0x59,0xc7,0x47,0x9d,
+ 0x01,0x04,0x17,0x5e,0x60,0x86,0x47,0x9d,
+ 0x01,0x04,0x17,0x89,0x39,0x64,0x47,0x9d,
+ 0x01,0x04,0x1f,0xdc,0x63,0x41,0x47,0x9d,
+ 0x01,0x04,0x23,0xc0,0xbf,0xe5,0x47,0x9d,
+ 0x01,0x04,0x23,0xc8,0xc9,0x4f,0x47,0x9d,
+ 0x01,0x04,0x23,0xe9,0x98,0xdb,0x47,0x9d,
+ 0x01,0x04,0x25,0x1b,0x3a,0x86,0x47,0x9d,
+ 0x01,0x04,0x25,0x1b,0x74,0x57,0x47,0x9d,
+ 0x01,0x04,0x28,0x76,0xe4,0xbb,0x47,0x9d,
+ 0x01,0x04,0x2b,0xf7,0xb8,0x32,0x47,0x9d,
+ 0x01,0x04,0x2d,0x4d,0x19,0x0e,0x47,0x9d,
+ 0x01,0x04,0x2d,0x81,0xb6,0x3b,0x47,0x9d,
+ 0x01,0x04,0x2f,0xfe,0x7f,0xfc,0x47,0x9d,
+ 0x01,0x04,0x33,0x4d,0x2a,0xea,0x47,0x9d,
+ 0x01,0x04,0x33,0x4f,0x52,0x4b,0x47,0x9d,
+ 0x01,0x04,0x33,0xfa,0x4b,0x30,0x47,0x9d,
+ 0x01,0x04,0x34,0xae,0xbb,0x11,0x47,0x9d,
+ 0x01,0x04,0x3e,0x48,0x1b,0xd4,0x47,0x9d,
+ 0x01,0x04,0x3e,0xa8,0x41,0x2a,0x47,0x9d,
+ 0x01,0x04,0x3e,0xd2,0xcf,0x3f,0x47,0x9d,
+ 0x01,0x04,0x3e,0xd2,0xde,0x49,0x47,0x9d,
+ 0x01,0x04,0x41,0x6c,0x27,0xab,0x47,0x9d,
+ 0x01,0x04,0x42,0x55,0x91,0x86,0x47,0x9d,
+ 0x01,0x04,0x42,0x87,0x1d,0xf3,0x47,0x9d,
+ 0x01,0x04,0x42,0xb7,0x00,0xcd,0x47,0x9d,
+ 0x01,0x04,0x43,0x04,0x52,0x09,0x47,0x9d,
+ 0x01,0x04,0x44,0xc5,0xcb,0xb5,0x47,0x9d,
+ 0x01,0x04,0x45,0x3b,0x12,0x17,0x47,0x9d,
+ 0x01,0x04,0x45,0x3d,0x20,0xf2,0x47,0x9d,
+ 0x01,0x04,0x45,0xc5,0xb9,0x6a,0x47,0x9d,
+ 0x01,0x04,0x47,0x08,0x1d,0x0c,0x47,0x9d,
+ 0x01,0x04,0x47,0x0d,0x5c,0x3e,0x47,0x9d,
+ 0x01,0x04,0x47,0xab,0x7b,0xa1,0x47,0x9d,
+ 0x01,0x04,0x48,0x2e,0x81,0x32,0x47,0x9d,
+ 0x01,0x04,0x49,0x16,0x09,0xe7,0x47,0x9d,
+ 0x01,0x04,0x49,0x35,0x2a,0x69,0x47,0x9d,
+ 0x01,0x04,0x4a,0xd5,0xaf,0x63,0x47,0x9d,
+ 0x01,0x04,0x4d,0xa3,0xdd,0xab,0x47,0x9d,
+ 0x01,0x04,0x4f,0xc0,0x27,0x69,0x47,0x9d,
+ 0x01,0x04,0x50,0x4f,0x04,0xf9,0x47,0x9d,
+ 0x01,0x04,0x50,0x5d,0xb3,0xfc,0x47,0x9d,
+ 0x01,0x04,0x50,0xf1,0xc2,0x93,0x47,0x9d,
+ 0x01,0x04,0x51,0x11,0x66,0x88,0x47,0x9d,
+ 0x01,0x04,0x53,0xe7,0xf0,0x03,0x47,0x9d,
+ 0x01,0x04,0x54,0x18,0x4d,0xbf,0x47,0x9d,
+ 0x01,0x04,0x54,0x9b,0x71,0xb1,0x47,0x9d,
+ 0x01,0x04,0x54,0xf7,0xa4,0x67,0x47,0x9d,
+ 0x01,0x04,0x55,0xcb,0x35,0x59,0x47,0x9d,
+ 0x01,0x04,0x55,0xcb,0x35,0x95,0x47,0x9d,
+ 0x01,0x04,0x55,0xd0,0x45,0x0c,0x47,0x9d,
+ 0x01,0x04,0x55,0xd0,0x45,0x0d,0x47,0x9d,
+ 0x01,0x04,0x58,0x50,0x94,0xd7,0x47,0x9d,
+ 0x01,0x04,0x59,0x75,0x13,0xbf,0x47,0x9d,
+ 0x01,0x04,0x59,0x99,0xa1,0x10,0x47,0x9d,
+ 0x01,0x04,0x59,0x9b,0xef,0x6b,0x47,0x9d,
+ 0x01,0x04,0x5b,0x7b,0xb6,0xa4,0x47,0x9d,
+ 0x01,0x04,0x5b,0x94,0x8d,0xd2,0x47,0x9d,
+ 0x01,0x04,0x65,0x64,0x8b,0xf9,0x47,0x9d,
+ 0x01,0x04,0x68,0xed,0x83,0x8a,0x47,0x9d,
+ 0x01,0x04,0x6d,0xe9,0x6d,0x1a,0x47,0x9d,
+ 0x01,0x04,0x7a,0xd0,0x75,0xc5,0x47,0x9d,
+ 0x01,0x04,0x7c,0xec,0x10,0x5b,0x47,0x9d,
+ 0x01,0x04,0x81,0xe2,0xc6,0xd3,0x47,0x9d,
+ 0x01,0x04,0x81,0xe2,0xc6,0xf6,0x47,0x9d,
+ 0x01,0x04,0x83,0xbc,0x28,0x2f,0x47,0x9d,
+ 0x01,0x04,0x84,0xe2,0x3d,0xd7,0x47,0x9d,
+ 0x01,0x04,0x87,0x54,0x88,0x9d,0x47,0x9d,
+ 0x01,0x04,0x89,0xb8,0x02,0x7c,0x47,0x9d,
+ 0x01,0x04,0x8a,0x02,0x64,0x72,0x47,0x9d,
+ 0x01,0x04,0x8d,0x62,0xdb,0x8e,0x47,0x9d,
+ 0x01,0x04,0x8d,0x62,0xdb,0xc7,0x47,0x9d,
+ 0x01,0x04,0x95,0x32,0x65,0x1b,0x47,0x9d,
+ 0x01,0x04,0x95,0x9a,0xb0,0x2f,0x47,0x9d,
+ 0x01,0x04,0x98,0x35,0x11,0x35,0x47,0x9d,
+ 0x01,0x04,0x98,0x35,0x12,0x6d,0x47,0x9d,
+ 0x01,0x04,0x9e,0xb2,0xe4,0x29,0x47,0x9d,
+ 0x01,0x04,0xa0,0x50,0x0b,0x42,0x47,0x9d,
+ 0x01,0x04,0xa2,0x00,0xd0,0x5a,0x47,0x9d,
+ 0x01,0x04,0xa2,0xf4,0x50,0xda,0x47,0x9d,
+ 0x01,0x04,0xa4,0x5c,0x8c,0x15,0x47,0x9d,
+ 0x01,0x04,0xa9,0x9b,0x2d,0xb4,0x47,0x9d,
+ 0x01,0x04,0xa9,0x9b,0xab,0xfc,0x47,0x9d,
+ 0x01,0x04,0xac,0xac,0x3e,0x56,0x47,0x9d,
+ 0x01,0x04,0xaf,0xd1,0xe4,0x8d,0x47,0x9d,
+ 0x01,0x04,0xb0,0x6c,0xc1,0x61,0x47,0x9d,
+ 0x01,0x04,0xb2,0x15,0x76,0x52,0x47,0x9d,
+ 0x01,0x04,0xb2,0x15,0x76,0x60,0x47,0x9d,
+ 0x01,0x04,0xb2,0x3f,0x57,0xa3,0x47,0x9d,
+ 0x01,0x04,0xb8,0x4a,0xf0,0x9d,0x47,0x9d,
+ 0x01,0x04,0xb9,0x1c,0x60,0x10,0x47,0x9d,
+ 0x01,0x04,0xb9,0x46,0x2b,0xc0,0x47,0x9d,
+ 0x01,0x04,0xb9,0x6b,0x44,0x87,0x47,0x9d,
+ 0x01,0x04,0xb9,0x84,0xb1,0x68,0x47,0x9d,
+ 0x01,0x04,0xb9,0xba,0xd0,0x7c,0x47,0x9d,
+ 0x01,0x04,0xb9,0xbe,0x18,0x48,0x47,0x9d,
+ 0x01,0x04,0xb9,0xd1,0xdf,0xc3,0x47,0x9d,
+ 0x01,0x04,0xb9,0xd2,0x7d,0x21,0x47,0x9d,
+ 0x01,0x04,0xb9,0xe8,0x46,0xe2,0x47,0x9d,
+ 0x01,0x04,0xba,0x9a,0xcf,0xe4,0x47,0x9d,
+ 0x01,0x04,0xbc,0x75,0x84,0x52,0x47,0x9d,
+ 0x01,0x04,0xbc,0xd5,0x5a,0x95,0x47,0x9d,
+ 0x01,0x04,0xbc,0xf6,0xa8,0x90,0x47,0x9d,
+ 0x01,0x04,0xc0,0xc6,0x51,0xf3,0x47,0x9d,
+ 0x01,0x04,0xc1,0xc6,0x22,0x18,0x47,0x9d,
+ 0x01,0x04,0xc2,0x5f,0x42,0x81,0x47,0x9d,
+ 0x01,0x04,0xc2,0x6e,0xa9,0x85,0x47,0x9d,
+ 0x01,0x04,0xc2,0xe9,0x5b,0x99,0x47,0x9d,
+ 0x01,0x04,0xc3,0x7b,0xf4,0x79,0x47,0x9d,
+ 0x01,0x04,0xc3,0xb3,0xe6,0xb4,0x47,0x9d,
+ 0x01,0x04,0xc6,0x3a,0x66,0x12,0x47,0x9d,
+ 0x01,0x04,0xcb,0x84,0x5e,0xc4,0x47,0x9d,
+ 0x01,0x04,0xcd,0xd1,0x77,0x96,0x47,0x9d,
+ 0x01,0x04,0xce,0xcc,0x68,0x07,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x44,0x00,0x63,0xc7,0x54,0x00,0x04,0xff,0xfe,0xcc,0xfc,0x1e,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x03,0x2d,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x03,0x87,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x06,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x70,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x06,0x02,0x2d,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x07,0x00,0x54,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x08,0x00,0x1d,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x08,0x00,0x3d,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x05,0x04,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x07,0x06,0xf2,0x16,0x71,0x5a,0x1c,0x24,0x33,0xb5,0x17,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x07,0x06,0xf2,0x2e,0x58,0xb9,0xff,0xfe,0x18,0xe0,0x93,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x07,0x06,0xf2,0x4d,0xfe,0xd8,0xfe,0x3d,0xc7,0x06,0x3f,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x07,0x06,0xf2,0x6a,0x34,0xc6,0x1d,0x97,0xb1,0xc9,0x8c,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x40,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x47,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x07,0x28,0x10,0x00,0x04,0x02,0x54,0x6e,0x98,0xff,0xfe,0x16,0x68,0xc6,0x47,0x9d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x04,0x09,0x16,0x18,0x77,0xff,0xfe,0x5f,0x0b,0x12,0x47,0x9d,
+ 0x02,0x10,0x24,0x01,0xc0,0x80,0x10,0x00,0x4c,0xb2,0x3e,0xec,0xef,0xff,0xfe,0xb9,0x86,0x04,0x47,0x9d,
+ 0x02,0x10,0x24,0x01,0xd0,0x02,0x39,0x02,0x07,0x00,0x87,0x08,0x37,0xc4,0xe2,0x31,0xd3,0xd8,0x47,0x9d,
+ 0x02,0x10,0x24,0x02,0x1f,0x00,0x81,0x01,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x5b,0x4c,0xf3,0x47,0x9d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x9e,0x7f,0x03,0x47,0x9d,
+ 0x02,0x10,0x26,0x01,0x06,0x03,0x53,0x00,0x83,0xb7,0x00,0x00,0x00,0xff,0xfe,0x00,0x42,0x0a,0x47,0x9d,
+ 0x02,0x10,0x26,0x04,0x13,0x80,0x45,0x31,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x47,0x9d,
+ 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x65,0xc0,0x01,0x47,0x9d,
+ 0x02,0x10,0x26,0x05,0xa1,0x43,0x21,0x62,0x70,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x02,0x03,0x54,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x60,0x85,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x26,0x20,0x00,0x6e,0xa0,0x00,0x00,0x01,0x00,0x43,0x00,0x43,0x00,0x43,0x00,0x43,0x47,0x9d,
+ 0x02,0x10,0x28,0x04,0x04,0x31,0xe0,0x38,0xcd,0x01,0xaa,0xa1,0x59,0xff,0xfe,0x0d,0x44,0xb8,0x47,0x9d,
+ 0x02,0x10,0x28,0x06,0x02,0xf0,0x90,0xa0,0x45,0xfe,0xdd,0x25,0xf6,0xdf,0x47,0x41,0x4a,0x3f,0x47,0x9d,
+ 0x02,0x10,0x2a,0x00,0x12,0x98,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x42,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x73,0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x90,0x40,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x31,0x1e,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x42,0x4c,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0x97,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0x9a,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x2a,0x2d,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x30,0x70,0x26,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x30,0x71,0x21,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x30,0x80,0x35,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x47,0x9d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0xb3,0x14,0x20,0x7c,0xa0,0x3a,0x9a,0x5c,0xc3,0xb6,0x44,0x47,0x9d,
+ 0x02,0x10,0x2a,0x02,0x47,0x80,0x00,0x10,0x40,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x02,0x21,0x89,0x37,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x75,0x33,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x96,0x07,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x2a,0x05,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x9d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x1b,0x47,0x9d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x02,0x22,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x02,0x49,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x04,0x16,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x47,0x9d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x1c,0x03,0x92,0xc9,0x00,0x78,0xea,0xba,0x95,0x33,0x4c,0x1d,0x7c,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,0xdf,0x8b,0x65,0x4c,0x4a,0x31,0x81,0x15,0x09,0x61,0x7d,0x34,0xfa,0x32,0x43,0x78,0x95,0xcf,0x00,0xe4,0xf0,0xac,0xf7,0x64,0x7a,0x33,0x3d,0x0f,0xa8,0xc3,0x82,0xd2,0x47,0x9d,
+ 0x04,0x20,0xdc,0x57,0x12,0xdc,0x09,0xe4,0x9e,0x7c,0x90,0x6e,0xcc,0xb5,0xf8,0x44,0x85,0xa5,0xbd,0x4d,0xd7,0x42,0x85,0x34,0x29,0x86,0x21,0xa9,0xe4,0x2d,0xd9,0xbb,0xe2,0x09,0x47,0x9d,
+ 0x04,0x20,0xdc,0xc0,0xef,0x59,0xb8,0x1a,0x0f,0x28,0x34,0x69,0xb7,0x5f,0x00,0xa9,0xda,0xec,0x6e,0xad,0x6e,0xc1,0xee,0xcd,0x3c,0x57,0xf5,0x60,0x58,0x2d,0x27,0xf5,0xb7,0xf8,0x47,0x9d,
+ 0x04,0x20,0xe7,0x24,0x61,0x57,0xa3,0xab,0xde,0xb9,0xef,0x44,0x6a,0xda,0x41,0x8f,0x0b,0xe1,0x87,0xcc,0xee,0x61,0x26,0x57,0xa9,0x08,0x83,0xb0,0x84,0xd1,0xe3,0x31,0x8b,0xfc,0x47,0x9d,
+ 0x04,0x20,0xe5,0xb6,0x5d,0x32,0xe4,0xe1,0x66,0xe1,0xb8,0x44,0x8b,0x24,0x0c,0xcb,0x70,0x5b,0xdd,0xbf,0xa0,0xca,0x19,0x9a,0x4f,0x28,0x1a,0x7f,0xac,0xd6,0xc4,0xd6,0x7e,0x61,0x47,0x9d,
+ 0x04,0x20,0xf7,0xd7,0xe5,0xe9,0x5f,0x64,0x02,0xbd,0x06,0x78,0xab,0xba,0x7e,0xad,0x48,0xda,0xae,0x28,0x98,0x34,0x6a,0xd5,0xf0,0xc4,0x4b,0x76,0x00,0xe0,0x16,0x61,0x97,0x58,0x47,0x9d,
+ 0x04,0x20,0xf3,0x3e,0xa3,0xaa,0x75,0x22,0x18,0x2d,0xf7,0x09,0xa4,0x8c,0x47,0xc5,0xa3,0xb7,0x36,0x68,0xa4,0x97,0x97,0x42,0xf8,0xd2,0xca,0x71,0x82,0x7e,0xad,0xd5,0xaf,0x3e,0x47,0x9d,
+ 0x04,0x20,0xf4,0x5b,0x07,0xc2,0x02,0x7a,0xd7,0x03,0xa5,0xc0,0xe1,0xad,0x19,0xc3,0xb8,0x47,0x8a,0x31,0x1f,0xd4,0x86,0x40,0xf1,0x90,0x9a,0x34,0x3d,0xf3,0x5c,0xd2,0x5f,0xf7,0x47,0x9d,
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,0xfb,0xdd,0x00,0x25,0x7e,0x95,0x73,0xca,0xc7,0x60,0x82,0x3f,0x51,0xcc,0x11,0xd4,0xfb,0xe1,0x44,0x31,0x9a,0x7d,0x84,0x7f,0xb8,0x1c,0x67,0xb4,0x18,0xf8,0xbf,0xe1,0x47,0x9d,
+ 0x04,0x20,0xfe,0x57,0x08,0xa0,0xe1,0xe8,0xdd,0xd2,0x04,0x2c,0x4d,0x8d,0x27,0xdd,0x06,0x81,0x46,0xc5,0x16,0x4b,0x54,0x26,0x6d,0x34,0xc3,0x17,0xb0,0xf9,0x51,0xb9,0x0f,0x10,0x47,0x9d,
+ 0x04,0x20,0x00,0xd2,0xd9,0x5d,0x15,0x5c,0x83,0xd6,0x70,0x9c,0x09,0x66,0x7a,0xd4,0x42,0x49,0x6b,0xfc,0xa9,0xf8,0x4e,0x08,0x1a,0x82,0x6b,0x3e,0x21,0x81,0x61,0x43,0xfa,0x02,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,0x16,0x80,0xee,0x0a,0xe0,0x62,0x7e,0x67,0x4d,0xab,0x18,0x01,0xb9,0x1e,0x30,0x65,0x6f,0x95,0x07,0x2d,0xe7,0x1f,0xc5,0xac,0xe6,0x7a,0x3f,0x40,0x52,0x7c,0x7e,0x47,0x9d,
+ 0x04,0x20,0x06,0x2f,0xbe,0xc7,0x4c,0x3d,0xb0,0x31,0x67,0x2e,0x85,0x3e,0x1f,0x0d,0x7b,0x95,0x1f,0xc7,0x1e,0x7f,0xe4,0x8c,0xd5,0xc5,0x2a,0xbe,0x03,0x93,0xe8,0xec,0x2b,0x40,0x47,0x9d,
+ 0x04,0x20,0x09,0x15,0xee,0xe9,0x65,0x97,0xd8,0x92,0x73,0xd9,0x05,0x0e,0x5b,0xcc,0x67,0xd6,0x5c,0x72,0x69,0x2f,0x0c,0x98,0xb3,0xd1,0x74,0x95,0x32,0x07,0x6b,0xf4,0xb3,0xec,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,0x0d,0xb1,0x41,0xd5,0x7b,0x41,0x77,0x1f,0x92,0x44,0xd0,0x81,0x86,0x15,0xa1,0xbc,0x33,0x31,0x6d,0x86,0x8e,0x91,0xd3,0xd2,0x29,0x9c,0xd6,0x00,0x9d,0x7b,0x19,0x4d,0x47,0x9d,
+ 0x04,0x20,0x0e,0x5b,0xed,0xae,0x4c,0x95,0x2b,0x95,0x9b,0x94,0x80,0x07,0x8c,0x2e,0xe0,0x31,0x86,0x28,0xe5,0x41,0xef,0x99,0x4b,0x68,0x3c,0xd9,0x67,0xd8,0x2b,0x0d,0xae,0x4a,0x47,0x9d,
+ 0x04,0x20,0x17,0xf3,0x18,0x6b,0x10,0x9f,0xa3,0x36,0xf4,0x77,0x50,0xb2,0xfe,0x86,0xbe,0xd2,0xb4,0x96,0x8a,0xbb,0x64,0x84,0xe7,0x6b,0x82,0xd7,0x22,0xb4,0x85,0xeb,0x8e,0x87,0x47,0x9d,
+ 0x04,0x20,0x14,0x0f,0x49,0xe8,0x64,0x04,0xbd,0x20,0x54,0xee,0x7e,0xb1,0x42,0x7e,0xa4,0x0d,0x3f,0xf2,0x8f,0x64,0x43,0x6f,0xbf,0x4d,0x66,0xbc,0x7e,0x10,0xfa,0xab,0x21,0x76,0x47,0x9d,
+ 0x04,0x20,0x15,0x7b,0x9d,0xa3,0x22,0xa7,0xca,0xc9,0x87,0x1c,0x3e,0x12,0xb4,0x3c,0xef,0xf0,0x4f,0xa0,0x6f,0x2c,0x66,0xbf,0x32,0x91,0xa3,0xc0,0xa9,0xbe,0x4e,0xda,0x9a,0x81,0x47,0x9d,
+ 0x04,0x20,0x16,0x17,0xf2,0x51,0x2a,0xba,0xf7,0x2d,0x88,0x34,0x3b,0x1d,0x43,0xaa,0xf3,0xe0,0x86,0x57,0xad,0xe1,0x38,0x35,0x9f,0x27,0xa0,0x18,0x04,0x30,0x43,0x51,0x4a,0x74,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,0x18,0xe5,0x79,0x6f,0x23,0x54,0x9f,0x05,0x0a,0x59,0x65,0xff,0xc8,0xaa,0xdf,0x34,0x12,0x67,0xe7,0x54,0x28,0x79,0x08,0x1f,0x83,0xcf,0x50,0x0c,0x49,0xc4,0xd9,0x6b,0x47,0x9d,
+ 0x04,0x20,0x1d,0x29,0x61,0x95,0xab,0x8d,0x06,0xe6,0xd8,0xc3,0xad,0x41,0x41,0xed,0x1d,0xd6,0x47,0x73,0x68,0x29,0x26,0x3e,0x96,0x66,0x4a,0x30,0x81,0x44,0x60,0x89,0xc1,0x4b,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,0x26,0xbe,0xd0,0xa5,0x4e,0xa6,0x98,0xa8,0x51,0xd8,0x9a,0x50,0xbd,0x7c,0xdd,0x3e,0xf9,0x65,0x19,0x33,0x8d,0xa8,0xf6,0xed,0x94,0x16,0x85,0xa0,0xff,0xc3,0x28,0xd5,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,0x21,0x2b,0xba,0xd0,0xfd,0xe8,0xf0,0xc3,0xb7,0x79,0xe2,0xd8,0x70,0x44,0xc2,0xc6,0xaf,0x96,0x79,0x7c,0xc6,0x07,0xd0,0xf0,0x26,0x2c,0xa7,0x7d,0x48,0xbf,0xeb,0x25,0x47,0x9d,
+ 0x04,0x20,0x26,0x12,0x03,0xc4,0xc9,0xfc,0x00,0x3c,0x89,0xd3,0x03,0x6e,0x50,0x9e,0x47,0x92,0x59,0xfc,0x27,0x6f,0xf4,0xe5,0x24,0x51,0xe8,0xa0,0x7e,0xae,0xcb,0xbd,0x6d,0xc5,0x47,0x9d,
+ 0x04,0x20,0x2f,0x81,0x64,0x09,0xc1,0xcc,0x77,0x7e,0x17,0x3b,0x1b,0x6e,0x18,0xb8,0x11,0x0d,0x16,0x48,0x6b,0xc9,0xca,0xe6,0xd5,0xfa,0xca,0x6a,0x9e,0x7d,0x2e,0x97,0x8d,0x2c,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,0x2a,0x45,0x1e,0xf4,0xc6,0xdd,0x6b,0xf8,0x21,0x5e,0xe4,0xae,0xd4,0x1c,0xe4,0xa5,0x54,0x5c,0x4d,0xf5,0xcb,0x3a,0x96,0x1b,0x3d,0xe8,0x9f,0xee,0x6b,0xf8,0xae,0x13,0x47,0x9d,
+ 0x04,0x20,0x2b,0xf3,0x81,0x30,0x59,0xe0,0xe2,0x7e,0x78,0xa7,0x11,0x46,0xa3,0x20,0x2d,0x7f,0xe0,0x64,0x39,0xdb,0xa3,0xe1,0x4b,0xe1,0x36,0x57,0xb2,0x43,0x22,0x21,0x10,0xf9,0x47,0x9d,
+ 0x04,0x20,0x2c,0x17,0x2f,0x8a,0xb4,0x67,0xd6,0xf0,0x58,0x03,0xfb,0x7b,0x98,0xd5,0x91,0x85,0xa2,0x3f,0xfa,0x14,0x17,0x63,0xf7,0x85,0x6d,0x18,0x1c,0x3d,0xda,0x09,0x5b,0xcb,0x47,0x9d,
+ 0x04,0x20,0x2d,0xa5,0x68,0x4f,0x51,0x08,0xc3,0x29,0xdf,0xaa,0xc8,0x38,0x60,0xfc,0x0e,0x56,0xcc,0x4c,0x83,0x25,0x34,0xdc,0xa0,0x0e,0x04,0x45,0x8c,0xa3,0x0d,0x56,0xb0,0xd8,0x47,0x9d,
+ 0x04,0x20,0x2d,0xfe,0x48,0xd9,0x8a,0xa1,0xd3,0xf7,0xe8,0x88,0xa2,0x24,0x9b,0x1b,0x66,0xd8,0x36,0x0b,0x7a,0x86,0x59,0x1e,0x0e,0x7c,0xd6,0x17,0xfc,0x35,0xc6,0xcf,0x16,0xda,0x47,0x9d,
+ 0x04,0x20,0x31,0xe0,0x18,0x3f,0x63,0x44,0x70,0x0f,0x92,0x4f,0x6a,0x76,0xcd,0xa8,0xfe,0x61,0xc0,0xb8,0x5d,0x35,0xff,0x59,0x4a,0x33,0x92,0x25,0x14,0xe7,0x90,0x73,0xb6,0x25,0x47,0x9d,
+ 0x04,0x20,0x33,0xea,0x10,0x8e,0x55,0xf7,0xf7,0x92,0x9b,0x4c,0x78,0x73,0x72,0x5d,0xac,0xae,0xdd,0x00,0x28,0xd0,0x73,0xb1,0x5c,0x66,0x2b,0x3d,0x3c,0xca,0x0b,0x0b,0x2b,0x83,0x47,0x9d,
+ 0x04,0x20,0x34,0x51,0xa4,0xf2,0x74,0x1d,0x5d,0x70,0x67,0x5e,0x48,0x72,0xc6,0xf1,0x4b,0x73,0xbb,0x9f,0xc2,0x48,0xdd,0x4a,0x8d,0x8b,0xae,0x57,0x67,0x46,0xb3,0x78,0xcb,0x0a,0x47,0x9d,
+ 0x04,0x20,0x34,0xad,0xe9,0x37,0x5f,0x85,0x2c,0x5f,0x53,0x72,0xb1,0xa2,0x0f,0x3b,0xeb,0x8b,0xfb,0x00,0x53,0xca,0x9e,0xf0,0xca,0x61,0xd7,0x32,0xa6,0x7f,0x59,0xb3,0xcb,0x34,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,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,0x3f,0x2f,0x1f,0xe1,0xd5,0xc6,0xd4,0x68,0xb8,0xe3,0x58,0x7b,0x95,0xa6,0x78,0xb1,0x08,0xbc,0x0a,0x65,0x31,0x7b,0x0d,0x71,0xab,0x3e,0x1d,0x70,0xb1,0x2c,0x0a,0xfe,0x47,0x9d,
+ 0x04,0x20,0x3f,0x31,0x49,0x19,0x69,0x88,0x10,0x50,0x35,0x09,0xe3,0xee,0xab,0x72,0x0a,0x97,0x10,0x85,0xc0,0x30,0xdf,0x40,0x19,0x23,0x5c,0x12,0x1b,0x4a,0xd3,0x0c,0xef,0x8c,0x47,0x9d,
+ 0x04,0x20,0x38,0x41,0xb6,0x3c,0xf7,0x3b,0xe9,0x8e,0x5f,0xa6,0x4c,0x31,0x0f,0x70,0x36,0x9a,0xf2,0xb2,0xd2,0x42,0xb8,0xbe,0xde,0xac,0xfc,0x57,0x1c,0x8b,0x44,0xc2,0xcf,0x68,0x47,0x9d,
+ 0x04,0x20,0x3a,0x75,0x3b,0xae,0xe0,0x48,0xd6,0x7f,0xa6,0x45,0xb4,0x2f,0x37,0xec,0x4b,0x9a,0xdf,0x39,0x47,0x7b,0x14,0xd2,0xa0,0xdc,0xe1,0xc8,0x70,0x88,0xa9,0x82,0x79,0x4f,0x47,0x9d,
+ 0x04,0x20,0x3b,0x26,0x16,0xe1,0x8e,0xa0,0x10,0xc3,0xb6,0xe0,0xcd,0x13,0x6f,0xa3,0xa1,0xf9,0xe0,0x34,0x5e,0x2b,0x40,0x47,0x86,0xee,0x63,0xe0,0x47,0x6e,0x49,0x3f,0x90,0x5a,0x47,0x9d,
+ 0x04,0x20,0x3c,0xd4,0x88,0x02,0x0e,0x82,0xfe,0xf4,0xca,0x64,0x6b,0x2d,0xea,0xf0,0x2b,0x67,0x97,0xdf,0x8f,0xc7,0x5f,0x98,0x4b,0x5d,0x4c,0x2a,0x37,0x0a,0x31,0xd9,0x2a,0xef,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,0x67,0x7c,0x32,0xa3,0x0f,0x7b,0x4f,0xac,0xe3,0xb7,0xbf,0xfe,0x81,0x50,0xc7,0x3c,0x86,0xd1,0xab,0xdd,0x28,0xfd,0x7c,0xcd,0x95,0xd9,0xa0,0xc1,0x95,0xef,0x6c,0x47,0x9d,
+ 0x04,0x20,0x47,0x4a,0x97,0xfc,0xc6,0xbf,0xb5,0x95,0x95,0x48,0x0e,0x5b,0xf9,0x78,0xcb,0x7a,0x5f,0xb3,0xeb,0x0f,0x2b,0x99,0xb5,0xb2,0x08,0xba,0x0d,0xf8,0x04,0x66,0x22,0x77,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,0x41,0xc0,0xb3,0x33,0x67,0x97,0x78,0x7f,0x82,0x1b,0xf9,0xc3,0x1c,0x02,0xe2,0x1a,0xdd,0x66,0x2d,0x92,0xef,0x11,0xc1,0x67,0xc7,0x80,0x73,0xc6,0xea,0x09,0x4a,0x2d,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,0x46,0x25,0x7d,0x0d,0x7c,0x9b,0xdc,0x94,0x09,0x67,0xde,0x91,0x83,0x91,0x7e,0xcf,0xcf,0xad,0x7c,0x5f,0x77,0xc3,0x4c,0xab,0xb6,0xa4,0x2d,0xe8,0x1e,0x98,0x9d,0x65,0x47,0x9d,
+ 0x04,0x20,0x48,0x4d,0x52,0x7f,0x28,0xe5,0x6f,0xd5,0xff,0xdd,0xe2,0x0f,0xc6,0xe6,0x93,0x93,0xe9,0xbf,0x0e,0xb2,0xf7,0xae,0xb2,0x18,0x48,0xa4,0x74,0x27,0xe1,0x9c,0x30,0xd2,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,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,0x4b,0xe8,0x93,0x30,0x51,0xd1,0x66,0xa5,0xde,0x31,0xfd,0x2d,0x73,0xed,0x26,0xe6,0xe9,0x00,0x4f,0x12,0xfd,0x8c,0xe9,0x14,0x2f,0x28,0x6f,0xd9,0xde,0xda,0x6e,0x7f,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,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,0x50,0x18,0x06,0x9d,0xdd,0x12,0xc4,0xf6,0xf5,0x7b,0x90,0xbc,0x83,0xee,0xa1,0xe4,0x94,0xc2,0x9c,0xd7,0xb6,0xcf,0xa6,0x1a,0x5f,0x27,0x50,0x32,0x93,0x34,0xe8,0xed,0x47,0x9d,
+ 0x04,0x20,0x51,0x13,0x8c,0xce,0x71,0x26,0x07,0xf6,0xa7,0x52,0xbd,0xf5,0xd6,0xab,0x90,0xb1,0xaf,0x3a,0x43,0x01,0xc2,0xef,0x48,0x45,0x31,0x71,0x3a,0xc0,0x9d,0x71,0xee,0xf4,0x47,0x9d,
+ 0x04,0x20,0x53,0x54,0xa8,0x06,0xe7,0x1a,0x27,0xcb,0xa1,0x6a,0x90,0x7b,0x89,0x6e,0x0d,0x85,0x7d,0xb9,0x80,0xfd,0xa5,0x69,0xb6,0xe9,0x0c,0xa7,0x03,0x81,0x21,0xf4,0xdf,0x78,0x47,0x9d,
+ 0x04,0x20,0x53,0xe5,0x8f,0x84,0x30,0xba,0x1d,0x35,0x77,0xa0,0x00,0x93,0x3d,0x1d,0x00,0x4f,0x8f,0xd7,0xdd,0x29,0xac,0x83,0xed,0x9c,0xce,0x97,0x01,0x82,0xe6,0xd1,0x63,0x65,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,0x66,0xbe,0x71,0xeb,0xed,0xf8,0xd8,0xdc,0x18,0x63,0x6b,0xfa,0x16,0x97,0xd5,0x5f,0x68,0xa9,0x7f,0xe9,0x8c,0x35,0x43,0xce,0xf7,0xa9,0x89,0x61,0x2f,0x29,0xb4,0x91,0x47,0x9d,
+ 0x04,0x20,0x66,0xf7,0x96,0x76,0x13,0xc9,0x80,0x5f,0x74,0x07,0x05,0xc2,0xe6,0x7f,0xb9,0x71,0x0f,0x8c,0xc7,0x6b,0x0c,0x0b,0xa7,0x06,0x6f,0xce,0x72,0x92,0x06,0xbf,0xc0,0xff,0x47,0x9d,
+ 0x04,0x20,0x62,0x65,0xe7,0x8d,0xa3,0xe9,0xf9,0x81,0x32,0x46,0x8d,0x2d,0x6e,0x0a,0x32,0x24,0xa1,0x91,0xdb,0x65,0x23,0x06,0x86,0xc9,0x1e,0x71,0x8e,0xc4,0xac,0x7f,0x5b,0xb0,0x47,0x9d,
+ 0x04,0x20,0x6e,0xb6,0x06,0xdb,0x99,0x0f,0xcb,0xb7,0x82,0x2e,0x00,0xbd,0xaf,0x38,0x5a,0x94,0x31,0xbc,0x37,0xaa,0x49,0x5e,0x28,0x54,0x3b,0x5d,0x47,0x8b,0xfc,0x79,0xcb,0xdd,0x47,0x9d,
+ 0x04,0x20,0x6f,0x09,0xe2,0xbf,0xd7,0x76,0x1d,0xa3,0x2e,0x40,0x2a,0x6c,0x10,0x43,0x76,0x44,0x4e,0xb1,0xbd,0x36,0xe3,0x24,0xa6,0xf5,0x79,0x53,0x38,0xee,0xac,0xe7,0xeb,0x7a,0x47,0x9d,
+ 0x04,0x20,0x6b,0xb1,0x9b,0x4d,0xe5,0x86,0x03,0x83,0x91,0x91,0x65,0xf2,0x3f,0xb4,0xbc,0x42,0xfa,0xc3,0xc9,0xcb,0xa3,0xdf,0xfb,0xcd,0x91,0x4b,0xa4,0x09,0xfe,0x03,0x64,0x39,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,0x73,0x83,0x69,0xb7,0xa2,0x92,0x38,0x0a,0x12,0xa1,0xd3,0x65,0xa0,0xf6,0x31,0x4b,0x6e,0xc3,0xaf,0x23,0x60,0x31,0xcc,0xde,0x79,0xaa,0x93,0xf9,0x83,0x11,0x35,0x8a,0x47,0x9d,
+ 0x04,0x20,0x73,0x9a,0x3d,0xc1,0x8d,0x1a,0x82,0x33,0x7f,0xd1,0xc6,0x13,0x99,0x85,0x92,0x65,0x5c,0x9e,0x6e,0x9e,0xe1,0x92,0x78,0xe9,0xb5,0x84,0x51,0x44,0xe2,0x64,0x25,0x39,0x47,0x9d,
+ 0x04,0x20,0x74,0x2e,0x8a,0xdd,0xe8,0x9f,0xf9,0x69,0x39,0xf3,0x90,0x7c,0xa8,0xed,0x5a,0xb9,0x20,0xfc,0x94,0x6e,0xcd,0x6d,0xc6,0x6a,0xd5,0xad,0x13,0x12,0xae,0xee,0xe6,0x14,0x47,0x9d,
+ 0x04,0x20,0x75,0xd5,0x8a,0x25,0xa9,0x0a,0xfc,0xaf,0xa8,0x57,0x00,0xa7,0x82,0xf0,0x0a,0x7e,0xc8,0x99,0x96,0x6d,0x0b,0x33,0x35,0x7a,0x93,0xbc,0xf9,0x9c,0x70,0xa7,0x3c,0xd5,0x47,0x9d,
+ 0x04,0x20,0x7e,0x9c,0x89,0xe2,0x53,0xc0,0x25,0xd7,0xdc,0x8e,0xd7,0xb4,0xc7,0x5f,0xc0,0x71,0x79,0x3a,0x2b,0x01,0x6a,0xfe,0x24,0xfc,0xa2,0xb3,0xa4,0x78,0x12,0x55,0x2a,0xb5,0x47,0x9d,
+ 0x04,0x20,0x7a,0x75,0x1b,0xc3,0x52,0x28,0x6d,0x39,0x42,0x02,0x0b,0x4a,0xdb,0x28,0xdb,0xf0,0xff,0xac,0x08,0x9d,0xf4,0x18,0xfd,0x49,0x29,0x60,0x7e,0x7a,0xe5,0xf9,0x02,0x36,0x47,0x9d,
+ 0x04,0x20,0x7d,0x37,0x91,0x10,0x54,0x4e,0x43,0x21,0x81,0xc6,0x2f,0x20,0x67,0x6e,0x84,0xf7,0xd6,0x8a,0xbb,0x20,0xf6,0x81,0x65,0x94,0xa9,0x6c,0x1b,0x14,0x04,0xcc,0xae,0x20,0x47,0x9d,
+ 0x04,0x20,0x87,0x60,0xeb,0xff,0xbe,0x40,0xfa,0xd2,0x8e,0x9e,0x3c,0xf8,0x33,0x1c,0x5b,0xea,0x49,0x95,0xcb,0x81,0x32,0x44,0x36,0xc4,0x72,0xdb,0xec,0xd1,0xd4,0x77,0xde,0xb2,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,0x81,0x75,0x30,0x42,0xd3,0xce,0xdf,0x29,0xcf,0xfb,0x39,0x83,0x12,0xd6,0x68,0x59,0x88,0x29,0x0b,0xbd,0xf2,0xd1,0x95,0x65,0x5a,0x12,0x24,0x38,0x23,0xeb,0x8b,0x65,0x47,0x9d,
+ 0x04,0x20,0x82,0x08,0xfe,0x1e,0xb4,0x75,0x48,0x30,0x84,0x5b,0xf1,0xd7,0xf6,0xda,0x4b,0xb2,0x3c,0x03,0xfa,0x96,0xe3,0x5b,0x22,0x61,0x23,0x98,0xbf,0xb1,0x0b,0xb1,0x28,0xc1,0x47,0x9d,
+ 0x04,0x20,0x84,0x32,0x46,0x12,0x33,0x84,0x6d,0xd8,0x0c,0xa0,0x52,0x5c,0x0c,0x6f,0xb6,0x25,0x3d,0x09,0x1e,0x3a,0x5f,0x4f,0xc9,0x31,0x6d,0x80,0x0a,0x8d,0xe6,0x05,0xcc,0xef,0x47,0x9d,
+ 0x04,0x20,0x86,0x6f,0xd2,0xe9,0x06,0xd4,0x55,0xa9,0x4a,0x21,0x73,0xf3,0xac,0xad,0x69,0x87,0x58,0xa2,0x1f,0x68,0xc9,0xcf,0x7d,0xcf,0x62,0x23,0xe4,0x4e,0xc1,0xa7,0xab,0xdd,0x47,0x9d,
+ 0x04,0x20,0x8e,0x82,0x32,0xa8,0x47,0x4e,0xb3,0xe6,0xc4,0x3d,0xf0,0x17,0x40,0xe5,0x81,0xe4,0xed,0x91,0xb4,0x42,0x50,0x45,0x79,0x55,0x52,0xca,0x45,0xe6,0x45,0x0d,0x40,0x40,0x47,0x9d,
+ 0x04,0x20,0x89,0x51,0xa3,0x8d,0xe9,0x39,0xd4,0xd0,0x2d,0x73,0x0d,0x87,0x5c,0x50,0xf2,0x51,0xfb,0x84,0xcb,0xde,0x8c,0x32,0xfc,0x79,0x64,0xc7,0xef,0x3a,0x71,0x55,0x09,0x1c,0x47,0x9d,
+ 0x04,0x20,0x8c,0x41,0xf8,0x7e,0xfb,0x25,0x05,0xb7,0x67,0x04,0x02,0xd1,0x5d,0xce,0x58,0xb4,0x73,0xbe,0x2f,0x9e,0xf1,0x41,0x77,0x1d,0x93,0x9d,0xa6,0x5e,0x8e,0x72,0xfe,0xd9,0x47,0x9d,
+ 0x04,0x20,0x91,0x74,0x55,0x47,0xc7,0x31,0x49,0x92,0x16,0xe0,0x81,0x61,0x06,0xf6,0x24,0x69,0xa2,0xb5,0x56,0xd8,0x9c,0x72,0x47,0xc8,0x15,0xb3,0xa6,0x43,0xbf,0x4b,0x55,0x69,0x47,0x9d,
+ 0x04,0x20,0x91,0xde,0x7d,0x52,0x02,0xa8,0x49,0xa3,0x8b,0x5d,0x86,0xd6,0xdf,0xee,0x12,0x11,0xc9,0xd1,0x8e,0x01,0xe5,0x3b,0x35,0x30,0xd0,0xaf,0xf6,0x04,0x0a,0x2c,0x62,0x94,0x47,0x9d,
+ 0x04,0x20,0x92,0xde,0x83,0x33,0xa4,0x7f,0x32,0x06,0xec,0x1e,0xe8,0x70,0x16,0x93,0xdf,0x79,0xd2,0x8c,0x12,0x41,0xa2,0xbb,0x2d,0x85,0xc3,0x21,0x68,0x76,0xdf,0x42,0x28,0xe6,0x47,0x9d,
+ 0x04,0x20,0x95,0xd9,0xe5,0x5a,0x23,0x7f,0x8b,0xa3,0x18,0x0e,0xc9,0xe2,0xbe,0x7e,0xf4,0xc6,0xc9,0x2d,0xc8,0xcc,0xda,0x2a,0xf7,0xb0,0xfc,0xbb,0x36,0x72,0xb0,0x93,0xad,0x83,0x47,0x9d,
+ 0x04,0x20,0x9e,0xf3,0xf9,0x48,0x49,0x18,0x5b,0x2c,0x0d,0xc7,0xb8,0xa5,0xd6,0xb1,0xd7,0x2a,0x37,0xd7,0xfb,0x35,0xe2,0x6b,0xd4,0xc9,0x73,0x92,0xf8,0x30,0x4f,0x33,0x51,0x0b,0x47,0x9d,
+ 0x04,0x20,0x98,0xda,0x29,0xab,0x8b,0xbf,0xd2,0xd5,0x2d,0xc9,0x44,0x86,0x2c,0xbf,0xc7,0xe0,0x78,0x44,0xce,0x84,0x9e,0x0f,0xd1,0x04,0x8c,0xcb,0x04,0xd7,0x7e,0xb5,0x77,0xec,0x47,0x9d,
+ 0x04,0x20,0x9c,0x6e,0xea,0x54,0xc2,0xb4,0x45,0xb8,0xa8,0x96,0x7e,0x6a,0xab,0x84,0xb5,0x7a,0xe6,0x5b,0x30,0xcb,0xdf,0xec,0xe4,0x51,0x29,0xe5,0x5b,0xed,0xe6,0xc7,0xaa,0xb9,0x47,0x9d,
+ 0x04,0x20,0x9e,0x1d,0xe4,0xd6,0x09,0x3e,0xf9,0x1d,0x07,0xe8,0xe7,0xff,0x75,0x8a,0x36,0x9f,0xe3,0x0d,0x16,0xd4,0xb3,0xc1,0x7e,0xcb,0x6d,0xb6,0xe6,0x50,0xce,0xc1,0x75,0xfe,0x47,0x9d,
+ 0x04,0x20,0xa6,0xf2,0xd2,0xdc,0xfe,0xc2,0x6a,0x25,0xd3,0x6b,0xf7,0x3d,0x9c,0xb0,0xc2,0x5c,0x14,0xc6,0x46,0x31,0xb4,0xc3,0xda,0x46,0x71,0xe5,0x87,0xe9,0x54,0xf1,0x38,0xcd,0x47,0x9d,
+ 0x04,0x20,0xa0,0xb5,0xd9,0xf5,0x83,0x63,0x5f,0x76,0xf7,0x50,0x40,0x76,0x27,0xcb,0x90,0xc0,0xb8,0x63,0x85,0xb3,0x44,0xc9,0x3c,0xa0,0x1a,0xaa,0xa0,0x00,0x59,0x15,0xc4,0x32,0x47,0x9d,
+ 0x04,0x20,0xa0,0xfb,0xd3,0x12,0xa7,0xc9,0xce,0x24,0xc8,0x06,0x39,0x73,0x08,0x7e,0xd8,0xb5,0xd9,0x6f,0xb7,0xd2,0xc1,0xed,0x21,0xcb,0x54,0xb7,0x13,0xf7,0x27,0x4e,0x3f,0x73,0x47,0x9d,
+ 0x04,0x20,0xa1,0x31,0x85,0x31,0xb8,0x82,0xb4,0x16,0xb0,0x26,0xab,0x21,0x10,0xf1,0x25,0x0a,0x6a,0xf3,0x10,0x96,0xf0,0xa9,0x0e,0x18,0x10,0x27,0xeb,0xa7,0x23,0x17,0x05,0x02,0x47,0x9d,
+ 0x04,0x20,0xa5,0xbe,0x82,0xfa,0xd8,0x0b,0xf3,0x9b,0x44,0x16,0x7f,0xa2,0x39,0xa8,0x51,0x43,0xe7,0xfa,0xb2,0x8e,0xe0,0x5f,0x35,0x9b,0x83,0x23,0x7f,0x3d,0x3b,0xfb,0xda,0x78,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,0xac,0x1a,0xa1,0xb1,0xec,0x20,0x85,0xd5,0x39,0xa3,0x4e,0xf4,0x9b,0x04,0x8c,0x64,0x68,0x76,0x0f,0xa6,0x53,0x0a,0xd3,0x2a,0x42,0x24,0xd0,0x1c,0xbb,0x31,0xc3,0xf8,0x47,0x9d,
+ 0x04,0x20,0xb6,0x9a,0xd9,0x25,0xfb,0x77,0x5a,0x33,0xf2,0x24,0x74,0x6d,0x2a,0x0d,0x8a,0x4d,0x71,0xb0,0xba,0x9d,0x34,0xfe,0x56,0x52,0x55,0x7e,0xda,0x4d,0x15,0xc9,0x36,0x1e,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,0xa9,0xf9,0xa6,0xb4,0x83,0x20,0xbd,0x7d,0x90,0x65,0xc3,0x39,0x46,0x23,0xbb,0x78,0x38,0x06,0x68,0xda,0x42,0xf6,0xa9,0x6a,0x8d,0x20,0x98,0xe6,0x73,0xc6,0x92,0x47,0x9d,
+ 0x04,0x20,0xb3,0xe4,0x03,0xa4,0x24,0x4d,0xc8,0x77,0xe7,0xff,0xd2,0xb3,0x77,0x35,0x3f,0xff,0xde,0x44,0xb9,0x7a,0x02,0x84,0x81,0x0e,0x90,0x75,0x75,0x1f,0xaa,0x6c,0xd0,0x7c,0x47,0x9d,
+ 0x04,0x20,0xb5,0x11,0xd6,0x6b,0x1d,0x0f,0xc4,0xc9,0x6f,0xc0,0x47,0xa4,0x7c,0xe2,0x12,0x37,0xa1,0x32,0x11,0x36,0x65,0xe4,0x5d,0x79,0xb8,0x64,0xbd,0x51,0x61,0x57,0x0d,0x58,0x47,0x9d,
+ 0x04,0x20,0xb5,0x49,0xeb,0x2a,0x44,0x14,0x3c,0x42,0x53,0xda,0x79,0xd4,0xa8,0xa5,0xdd,0xae,0x07,0x12,0x11,0xa0,0xce,0x5f,0xd1,0x78,0xd3,0x9c,0xdd,0xdc,0x36,0x98,0x82,0x49,0x47,0x9d,
+ 0x04,0x20,0xbf,0x2d,0x5b,0xc1,0xd3,0x04,0x52,0xd4,0x23,0xd4,0x27,0x26,0x5a,0xc2,0x7d,0x8d,0xd6,0x2d,0x7d,0xfa,0x17,0x50,0xc5,0x21,0xf2,0xa6,0xbe,0xe7,0xc4,0xb7,0x94,0xd8,0x47,0x9d,
+ 0x04,0x20,0xb8,0x0a,0x2c,0x1f,0xcc,0xbd,0x88,0x1a,0x8a,0x46,0xb7,0x2c,0x20,0xd2,0xdf,0x6f,0x2b,0xfa,0x86,0x07,0x16,0x5a,0x7b,0x40,0x4f,0x80,0xa9,0xe1,0xda,0xda,0x62,0x69,0x47,0x9d,
+ 0x04,0x20,0xbb,0x32,0x43,0x18,0xd9,0xe2,0x98,0x96,0x61,0x0f,0xd0,0xdc,0x6a,0x9d,0x3b,0x06,0x99,0xb9,0x71,0x8a,0x43,0x06,0x91,0xc1,0x56,0x82,0xfa,0xdd,0x8a,0x30,0x24,0xc6,0x47,0x9d,
+ 0x04,0x20,0xbc,0x79,0x56,0x7a,0x37,0x72,0xe5,0x94,0xdb,0xec,0xfe,0xd8,0x84,0x6f,0xaf,0x7b,0x71,0x3f,0x82,0x0f,0xfd,0xbb,0xbc,0x60,0xdf,0x93,0x04,0xf0,0xbb,0x4c,0x36,0xca,0x47,0x9d,
+ 0x04,0x20,0xbc,0x7c,0x30,0x32,0x54,0x79,0x86,0x3b,0x5b,0x28,0x45,0xc0,0x40,0x38,0xc9,0xf7,0xce,0xd4,0x8d,0xe9,0x99,0x31,0xd0,0x89,0xa7,0x97,0x70,0x37,0xbe,0x8b,0xe5,0xba,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,0xc7,0x09,0x41,0xf9,0x00,0x08,0x1d,0xcf,0x7b,0xd5,0x14,0x37,0x01,0x1f,0xca,0xa9,0xbc,0xb3,0x76,0x1d,0x38,0x33,0x92,0x4d,0x5c,0x4b,0x6d,0x1f,0x54,0x43,0xc2,0x47,0x47,0x9d,
+ 0x04,0x20,0xc7,0x4f,0xee,0xe9,0x39,0xf4,0x8c,0xc0,0xf0,0x2a,0x11,0x5a,0x5b,0xb5,0x3a,0xe1,0x9a,0x2c,0xc0,0xbf,0x59,0xc7,0xd5,0xc0,0x35,0x19,0xcb,0xd6,0x3d,0x6b,0xe1,0xb0,0x47,0x9d,
+ 0x04,0x20,0xc0,0x3d,0x2f,0xba,0xbf,0x66,0x11,0x7c,0xee,0x0b,0xd6,0xe9,0xce,0x9e,0x78,0xfb,0x1d,0x77,0x6e,0x3c,0x1e,0xbd,0x00,0x21,0xb6,0xef,0x73,0xee,0xfa,0xb3,0x05,0x3d,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,0xc2,0x80,0xa6,0xc3,0x7d,0xb3,0x6c,0x17,0x05,0xfc,0x39,0xa5,0x71,0x8f,0x75,0x27,0x7f,0xd0,0xc8,0xab,0x94,0xfd,0x77,0xbd,0xdd,0x0f,0x2c,0x2e,0x70,0xaf,0xdd,0xdf,0x47,0x9d,
+ 0x04,0x20,0xc4,0x16,0xad,0xb9,0xd7,0x4b,0xd2,0x3f,0x53,0xe1,0xe2,0x80,0x12,0x6c,0xc8,0x18,0x96,0x5d,0x77,0x14,0x80,0x44,0xf0,0xaa,0xcd,0x20,0xd8,0xb4,0xc5,0x97,0x66,0xe4,0x47,0x9d,
+ 0x04,0x20,0xc8,0xa4,0xdd,0xa7,0xc0,0x95,0x9b,0x12,0xf7,0xd7,0x4e,0x9b,0xd4,0xb7,0x93,0x5d,0x99,0x87,0x43,0x81,0x23,0x52,0xde,0xd1,0x22,0x36,0x79,0xe1,0x3b,0x58,0xec,0xd9,0x47,0x9d,
+ 0x04,0x20,0xc9,0x0a,0xd6,0x83,0x40,0xd9,0x81,0xc2,0x67,0x4d,0xa4,0xeb,0x87,0xb0,0x1f,0x66,0x37,0xd7,0xc6,0xdb,0xc0,0x90,0xd0,0xc2,0xd5,0x07,0xeb,0xc7,0x97,0x60,0xa4,0x60,0x47,0x9d,
+ 0x04,0x20,0xc9,0x2a,0x5e,0xe6,0xcc,0x54,0x34,0xca,0xda,0x96,0xc1,0x41,0x58,0x7b,0x47,0x48,0x1e,0xa1,0x0c,0xb2,0x59,0x2c,0x8c,0x23,0xec,0x5c,0x43,0x7f,0xd7,0x28,0x1c,0xd0,0x47,0x9d,
+ 0x04,0x20,0xc9,0xd0,0x9a,0x69,0xc1,0xba,0x0b,0x07,0xa4,0x22,0x67,0xaf,0x35,0x99,0x23,0x0b,0x8b,0xf4,0x9d,0xc2,0x9d,0x6d,0xbb,0xf7,0xf5,0x3a,0x0b,0x39,0x4c,0x3d,0x3a,0x36,0x47,0x9d,
+ 0x04,0x20,0xca,0x11,0xb7,0xed,0xeb,0x7c,0x27,0xbe,0x5e,0xe3,0xe3,0x23,0xf7,0x16,0xb5,0x45,0xda,0x87,0xcf,0xe8,0x53,0x8e,0x6a,0xa3,0x66,0x9a,0x56,0xdc,0xb8,0xa9,0x4e,0xfe,0x47,0x9d,
+ 0x04,0x20,0xca,0xa0,0x31,0xe6,0x88,0xeb,0xd5,0x18,0x55,0x29,0xd6,0x6d,0x22,0xf5,0x4b,0x6f,0xe5,0x35,0x85,0x96,0xeb,0xd8,0xdf,0x52,0x7c,0xf1,0x5c,0x1a,0xe7,0x15,0xd4,0x9b,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,0x2e,0xb8,0xe5,0xd7,0x37,0x0a,0xc9,0x3b,0xcb,0xd5,0xe9,0x0e,0xcc,0x77,0x62,0xf0,0x05,0x0e,0x04,0x5a,0xf3,0x44,0x9f,0x60,0xd6,0xd1,0x4c,0x9b,0x99,0x58,0x26,0x47,0x9d,
+ 0x04,0x20,0xcd,0x7a,0x43,0x28,0xac,0x1b,0xe8,0xd3,0x8d,0x9b,0xb1,0xc6,0x0b,0x9b,0x2f,0x40,0x1e,0x15,0x12,0x25,0x80,0xf5,0xc4,0xd2,0x1e,0xe7,0xce,0xcc,0x9c,0x82,0xfc,0x3f,0x47,0x9d,
+};
+
+static const uint8_t chainparams_seed_testnet4[] = {
+ 0x01,0x04,0x12,0xbd,0x9c,0x66,0xbc,0xcd,
+ 0x01,0x04,0x12,0xc9,0xcf,0x37,0xbc,0xcd,
+ 0x01,0x04,0x33,0x9e,0xf8,0x08,0xbc,0xcd,
+ 0x01,0x04,0x39,0x80,0xb0,0xa3,0xbc,0xcd,
+ 0x01,0x04,0x52,0x43,0x66,0x0f,0xbc,0xcd,
+ 0x01,0x04,0x58,0x63,0xf8,0x32,0xbc,0xcd,
+ 0x01,0x04,0x5f,0xd9,0x49,0xa2,0xbc,0xcd,
+ 0x01,0x04,0x67,0x63,0xab,0xd4,0xbc,0xcd,
+ 0x01,0x04,0x67,0xa5,0xc0,0xd2,0xbc,0xcd,
};
#endif // BITCOIN_CHAINPARAMSSEEDS_H
diff --git a/src/clientversion.cpp b/src/clientversion.cpp
index e52703c8bf..7e6741a1a0 100644
--- a/src/clientversion.cpp
+++ b/src/clientversion.cpp
@@ -23,14 +23,12 @@ using util::Join;
const std::string CLIENT_NAME("Satoshi");
-#ifdef HAVE_BUILD_INFO
-#include <obj/build.h>
-// The <obj/build.h>, which is generated by the build environment (share/genbuild.sh),
+#include <bitcoin-build-info.h>
+// The <bitcoin-build-info.h>, which is generated by the build environment (cmake/script/GenerateBuildInfo.cmake),
// could contain only one line of the following:
// - "#define BUILD_GIT_TAG ...", if the top commit is tagged
// - "#define BUILD_GIT_COMMIT ...", if the top commit is not tagged
// - "// No build information available", if proper git information is not available
-#endif
//! git will put "#define GIT_COMMIT_ID ..." on the next line inside archives. $Format:%n#define GIT_COMMIT_ID "%H"$
diff --git a/src/cluster_linearize.h b/src/cluster_linearize.h
new file mode 100644
index 0000000000..e964849f22
--- /dev/null
+++ b/src/cluster_linearize.h
@@ -0,0 +1,1282 @@
+// 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.
+
+#ifndef BITCOIN_CLUSTER_LINEARIZE_H
+#define BITCOIN_CLUSTER_LINEARIZE_H
+
+#include <algorithm>
+#include <numeric>
+#include <optional>
+#include <stdint.h>
+#include <vector>
+#include <utility>
+
+#include <random.h>
+#include <span.h>
+#include <util/feefrac.h>
+#include <util/vecdeque.h>
+
+namespace cluster_linearize {
+
+/** Data type to represent cluster input.
+ *
+ * cluster[i].first is tx_i's fee and size.
+ * cluster[i].second[j] is true iff tx_i spends one or more of tx_j's outputs.
+ */
+template<typename SetType>
+using Cluster = std::vector<std::pair<FeeFrac, SetType>>;
+
+/** Data type to represent transaction indices in clusters. */
+using ClusterIndex = uint32_t;
+
+/** Data structure that holds a transaction graph's preprocessed data (fee, size, ancestors,
+ * descendants). */
+template<typename SetType>
+class DepGraph
+{
+ /** Information about a single transaction. */
+ struct Entry
+ {
+ /** Fee and size of transaction itself. */
+ FeeFrac feerate;
+ /** All ancestors of the transaction (including itself). */
+ SetType ancestors;
+ /** All descendants of the transaction (including itself). */
+ SetType descendants;
+
+ /** Equality operator (primarily for for testing purposes). */
+ friend bool operator==(const Entry&, const Entry&) noexcept = default;
+
+ /** Construct an empty entry. */
+ Entry() noexcept = default;
+ /** Construct an entry with a given feerate, ancestor set, descendant set. */
+ Entry(const FeeFrac& f, const SetType& a, const SetType& d) noexcept : feerate(f), ancestors(a), descendants(d) {}
+ };
+
+ /** Data for each transaction, in the same order as the Cluster it was constructed from. */
+ std::vector<Entry> entries;
+
+public:
+ /** Equality operator (primarily for testing purposes). */
+ friend bool operator==(const DepGraph&, const DepGraph&) noexcept = default;
+
+ // Default constructors.
+ DepGraph() noexcept = default;
+ DepGraph(const DepGraph&) noexcept = default;
+ DepGraph(DepGraph&&) noexcept = default;
+ DepGraph& operator=(const DepGraph&) noexcept = default;
+ DepGraph& operator=(DepGraph&&) noexcept = default;
+
+ /** Construct a DepGraph object for ntx transactions, with no dependencies.
+ *
+ * Complexity: O(N) where N=ntx.
+ **/
+ explicit DepGraph(ClusterIndex ntx) noexcept
+ {
+ Assume(ntx <= SetType::Size());
+ entries.resize(ntx);
+ for (ClusterIndex i = 0; i < ntx; ++i) {
+ entries[i].ancestors = SetType::Singleton(i);
+ entries[i].descendants = SetType::Singleton(i);
+ }
+ }
+
+ /** Construct a DepGraph object given a cluster.
+ *
+ * Complexity: O(N^2) where N=cluster.size().
+ */
+ explicit DepGraph(const Cluster<SetType>& cluster) noexcept : entries(cluster.size())
+ {
+ for (ClusterIndex i = 0; i < cluster.size(); ++i) {
+ // Fill in fee and size.
+ entries[i].feerate = cluster[i].first;
+ // Fill in direct parents as ancestors.
+ entries[i].ancestors = cluster[i].second;
+ // Make sure transactions are ancestors of themselves.
+ entries[i].ancestors.Set(i);
+ }
+
+ // Propagate ancestor information.
+ for (ClusterIndex i = 0; i < entries.size(); ++i) {
+ // At this point, entries[a].ancestors[b] is true iff b is an ancestor of a and there
+ // is a path from a to b through the subgraph consisting of {a, b} union
+ // {0, 1, ..., (i-1)}.
+ SetType to_merge = entries[i].ancestors;
+ for (ClusterIndex j = 0; j < entries.size(); ++j) {
+ if (entries[j].ancestors[i]) {
+ entries[j].ancestors |= to_merge;
+ }
+ }
+ }
+
+ // Fill in descendant information by transposing the ancestor information.
+ for (ClusterIndex i = 0; i < entries.size(); ++i) {
+ for (auto j : entries[i].ancestors) {
+ entries[j].descendants.Set(i);
+ }
+ }
+ }
+
+ /** Construct a DepGraph object given another DepGraph and a mapping from old to new.
+ *
+ * Complexity: O(N^2) where N=depgraph.TxCount().
+ */
+ DepGraph(const DepGraph<SetType>& depgraph, Span<const ClusterIndex> mapping) noexcept : entries(depgraph.TxCount())
+ {
+ Assert(mapping.size() == depgraph.TxCount());
+ // Fill in fee, size, ancestors.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ const auto& input = depgraph.entries[i];
+ auto& output = entries[mapping[i]];
+ output.feerate = input.feerate;
+ for (auto j : input.ancestors) output.ancestors.Set(mapping[j]);
+ }
+ // Fill in descendant information.
+ for (ClusterIndex i = 0; i < entries.size(); ++i) {
+ for (auto j : entries[i].ancestors) {
+ entries[j].descendants.Set(i);
+ }
+ }
+ }
+
+ /** Get the number of transactions in the graph. Complexity: O(1). */
+ auto TxCount() const noexcept { return entries.size(); }
+ /** Get the feerate of a given transaction i. Complexity: O(1). */
+ const FeeFrac& FeeRate(ClusterIndex i) const noexcept { return entries[i].feerate; }
+ /** Get the mutable feerate of a given transaction i. Complexity: O(1). */
+ FeeFrac& FeeRate(ClusterIndex i) noexcept { return entries[i].feerate; }
+ /** Get the ancestors of a given transaction i. Complexity: O(1). */
+ const SetType& Ancestors(ClusterIndex i) const noexcept { return entries[i].ancestors; }
+ /** Get the descendants of a given transaction i. Complexity: O(1). */
+ const SetType& Descendants(ClusterIndex i) const noexcept { return entries[i].descendants; }
+
+ /** Add a new unconnected transaction to this transaction graph (at the end), and return its
+ * ClusterIndex.
+ *
+ * Complexity: O(1) (amortized, due to resizing of backing vector).
+ */
+ ClusterIndex AddTransaction(const FeeFrac& feefrac) noexcept
+ {
+ Assume(TxCount() < SetType::Size());
+ ClusterIndex new_idx = TxCount();
+ entries.emplace_back(feefrac, SetType::Singleton(new_idx), SetType::Singleton(new_idx));
+ return new_idx;
+ }
+
+ /** Modify this transaction graph, adding a dependency between a specified parent and child.
+ *
+ * Complexity: O(N) where N=TxCount().
+ **/
+ void AddDependency(ClusterIndex parent, ClusterIndex child) noexcept
+ {
+ // Bail out if dependency is already implied.
+ if (entries[child].ancestors[parent]) return;
+ // To each ancestor of the parent, add as descendants the descendants of the child.
+ const auto& chl_des = entries[child].descendants;
+ for (auto anc_of_par : Ancestors(parent)) {
+ entries[anc_of_par].descendants |= chl_des;
+ }
+ // To each descendant of the child, add as ancestors the ancestors of the parent.
+ const auto& par_anc = entries[parent].ancestors;
+ for (auto dec_of_chl : Descendants(child)) {
+ entries[dec_of_chl].ancestors |= par_anc;
+ }
+ }
+
+ /** Compute the aggregate feerate of a set of nodes in this graph.
+ *
+ * Complexity: O(N) where N=elems.Count().
+ **/
+ FeeFrac FeeRate(const SetType& elems) const noexcept
+ {
+ FeeFrac ret;
+ for (auto pos : elems) ret += entries[pos].feerate;
+ return ret;
+ }
+
+ /** Find some connected component within the subset "todo" of this graph.
+ *
+ * Specifically, this finds the connected component which contains the first transaction of
+ * todo (if any).
+ *
+ * Two transactions are considered connected if they are both in `todo`, and one is an ancestor
+ * of the other in the entire graph (so not just within `todo`), or transitively there is a
+ * path of transactions connecting them. This does mean that if `todo` contains a transaction
+ * and a grandparent, but misses the parent, they will still be part of the same component.
+ *
+ * Complexity: O(ret.Count()).
+ */
+ SetType FindConnectedComponent(const SetType& todo) const noexcept
+ {
+ if (todo.None()) return todo;
+ auto to_add = SetType::Singleton(todo.First());
+ SetType ret;
+ do {
+ SetType old = ret;
+ for (auto add : to_add) {
+ ret |= Descendants(add);
+ ret |= Ancestors(add);
+ }
+ ret &= todo;
+ to_add = ret - old;
+ } while (to_add.Any());
+ return ret;
+ }
+
+ /** Determine if a subset is connected.
+ *
+ * Complexity: O(subset.Count()).
+ */
+ bool IsConnected(const SetType& subset) const noexcept
+ {
+ return FindConnectedComponent(subset) == subset;
+ }
+
+ /** Determine if this entire graph is connected.
+ *
+ * Complexity: O(TxCount()).
+ */
+ bool IsConnected() const noexcept { return IsConnected(SetType::Fill(TxCount())); }
+
+ /** Append the entries of select to list in a topologically valid order.
+ *
+ * Complexity: O(select.Count() * log(select.Count())).
+ */
+ void AppendTopo(std::vector<ClusterIndex>& list, const SetType& select) const noexcept
+ {
+ ClusterIndex old_len = list.size();
+ for (auto i : select) list.push_back(i);
+ std::sort(list.begin() + old_len, list.end(), [&](ClusterIndex a, ClusterIndex b) noexcept {
+ const auto a_anc_count = entries[a].ancestors.Count();
+ const auto b_anc_count = entries[b].ancestors.Count();
+ if (a_anc_count != b_anc_count) return a_anc_count < b_anc_count;
+ return a < b;
+ });
+ }
+};
+
+/** A set of transactions together with their aggregate feerate. */
+template<typename SetType>
+struct SetInfo
+{
+ /** The transactions in the set. */
+ SetType transactions;
+ /** Their combined fee and size. */
+ FeeFrac feerate;
+
+ /** Construct a SetInfo for the empty set. */
+ SetInfo() noexcept = default;
+
+ /** Construct a SetInfo for a specified set and feerate. */
+ SetInfo(const SetType& txn, const FeeFrac& fr) noexcept : transactions(txn), feerate(fr) {}
+
+ /** Construct a SetInfo for a given transaction in a depgraph. */
+ explicit SetInfo(const DepGraph<SetType>& depgraph, ClusterIndex pos) noexcept :
+ transactions(SetType::Singleton(pos)), feerate(depgraph.FeeRate(pos)) {}
+
+ /** Construct a SetInfo for a set of transactions in a depgraph. */
+ explicit SetInfo(const DepGraph<SetType>& depgraph, const SetType& txn) noexcept :
+ transactions(txn), feerate(depgraph.FeeRate(txn)) {}
+
+ /** Add a transaction to this SetInfo (which must not yet be in it). */
+ void Set(const DepGraph<SetType>& depgraph, ClusterIndex pos) noexcept
+ {
+ Assume(!transactions[pos]);
+ transactions.Set(pos);
+ feerate += depgraph.FeeRate(pos);
+ }
+
+ /** Add the transactions of other to this SetInfo (no overlap allowed). */
+ SetInfo& operator|=(const SetInfo& other) noexcept
+ {
+ Assume(!transactions.Overlaps(other.transactions));
+ transactions |= other.transactions;
+ feerate += other.feerate;
+ return *this;
+ }
+
+ /** Construct a new SetInfo equal to this, with more transactions added (which may overlap
+ * with the existing transactions in the SetInfo). */
+ [[nodiscard]] SetInfo Add(const DepGraph<SetType>& depgraph, const SetType& txn) const noexcept
+ {
+ return {transactions | txn, feerate + depgraph.FeeRate(txn - transactions)};
+ }
+
+ /** Swap two SetInfo objects. */
+ friend void swap(SetInfo& a, SetInfo& b) noexcept
+ {
+ swap(a.transactions, b.transactions);
+ swap(a.feerate, b.feerate);
+ }
+
+ /** Permit equality testing. */
+ friend bool operator==(const SetInfo&, const SetInfo&) noexcept = default;
+};
+
+/** Compute the feerates of the chunks of linearization. */
+template<typename SetType>
+std::vector<FeeFrac> ChunkLinearization(const DepGraph<SetType>& depgraph, Span<const ClusterIndex> linearization) noexcept
+{
+ std::vector<FeeFrac> ret;
+ for (ClusterIndex i : linearization) {
+ /** The new chunk to be added, initially a singleton. */
+ auto new_chunk = depgraph.FeeRate(i);
+ // As long as the new chunk has a higher feerate than the last chunk so far, absorb it.
+ while (!ret.empty() && new_chunk >> ret.back()) {
+ new_chunk += ret.back();
+ ret.pop_back();
+ }
+ // Actually move that new chunk into the chunking.
+ ret.push_back(std::move(new_chunk));
+ }
+ return ret;
+}
+
+/** Data structure encapsulating the chunking of a linearization, permitting removal of subsets. */
+template<typename SetType>
+class LinearizationChunking
+{
+ /** The depgraph this linearization is for. */
+ const DepGraph<SetType>& m_depgraph;
+
+ /** The linearization we started from, possibly with removed prefix stripped. */
+ Span<const ClusterIndex> m_linearization;
+
+ /** Chunk sets and their feerates, of what remains of the linearization. */
+ std::vector<SetInfo<SetType>> m_chunks;
+
+ /** How large a prefix of m_chunks corresponds to removed transactions. */
+ ClusterIndex m_chunks_skip{0};
+
+ /** Which transactions remain in the linearization. */
+ SetType m_todo;
+
+ /** Fill the m_chunks variable, and remove the done prefix of m_linearization. */
+ void BuildChunks() noexcept
+ {
+ // Caller must clear m_chunks.
+ Assume(m_chunks.empty());
+
+ // Chop off the initial part of m_linearization that is already done.
+ while (!m_linearization.empty() && !m_todo[m_linearization.front()]) {
+ m_linearization = m_linearization.subspan(1);
+ }
+
+ // Iterate over the remaining entries in m_linearization. This is effectively the same
+ // algorithm as ChunkLinearization, but supports skipping parts of the linearization and
+ // keeps track of the sets themselves instead of just their feerates.
+ for (auto idx : m_linearization) {
+ if (!m_todo[idx]) continue;
+ // Start with an initial chunk containing just element idx.
+ SetInfo add(m_depgraph, idx);
+ // Absorb existing final chunks into add while they have lower feerate.
+ while (!m_chunks.empty() && add.feerate >> m_chunks.back().feerate) {
+ add |= m_chunks.back();
+ m_chunks.pop_back();
+ }
+ // Remember new chunk.
+ m_chunks.push_back(std::move(add));
+ }
+ }
+
+public:
+ /** Initialize a LinearizationSubset object for a given length of linearization. */
+ explicit LinearizationChunking(const DepGraph<SetType>& depgraph LIFETIMEBOUND, Span<const ClusterIndex> lin LIFETIMEBOUND) noexcept :
+ m_depgraph(depgraph), m_linearization(lin)
+ {
+ // Mark everything in lin as todo still.
+ for (auto i : m_linearization) m_todo.Set(i);
+ // Compute the initial chunking.
+ m_chunks.reserve(depgraph.TxCount());
+ BuildChunks();
+ }
+
+ /** Determine how many chunks remain in the linearization. */
+ ClusterIndex NumChunksLeft() const noexcept { return m_chunks.size() - m_chunks_skip; }
+
+ /** Access a chunk. Chunk 0 is the highest-feerate prefix of what remains. */
+ const SetInfo<SetType>& GetChunk(ClusterIndex n) const noexcept
+ {
+ Assume(n + m_chunks_skip < m_chunks.size());
+ return m_chunks[n + m_chunks_skip];
+ }
+
+ /** Remove some subset of transactions from the linearization. */
+ void MarkDone(SetType subset) noexcept
+ {
+ Assume(subset.Any());
+ Assume(subset.IsSubsetOf(m_todo));
+ m_todo -= subset;
+ if (GetChunk(0).transactions == subset) {
+ // If the newly done transactions exactly match the first chunk of the remainder of
+ // the linearization, we do not need to rechunk; just remember to skip one
+ // additional chunk.
+ ++m_chunks_skip;
+ // With subset marked done, some prefix of m_linearization will be done now. How long
+ // that prefix is depends on how many done elements were interspersed with subset,
+ // but at least as many transactions as there are in subset.
+ m_linearization = m_linearization.subspan(subset.Count());
+ } else {
+ // Otherwise rechunk what remains of m_linearization.
+ m_chunks.clear();
+ m_chunks_skip = 0;
+ BuildChunks();
+ }
+ }
+
+ /** Find the shortest intersection between subset and the prefixes of remaining chunks
+ * of the linearization that has a feerate not below subset's.
+ *
+ * This is a crucial operation in guaranteeing improvements to linearizations. If subset has
+ * a feerate not below GetChunk(0)'s, then moving IntersectPrefixes(subset) to the front of
+ * (what remains of) the linearization is guaranteed not to make it worse at any point.
+ *
+ * See https://delvingbitcoin.org/t/introduction-to-cluster-linearization/1032 for background.
+ */
+ SetInfo<SetType> IntersectPrefixes(const SetInfo<SetType>& subset) const noexcept
+ {
+ Assume(subset.transactions.IsSubsetOf(m_todo));
+ SetInfo<SetType> accumulator;
+ // Iterate over all chunks of the remaining linearization.
+ for (ClusterIndex i = 0; i < NumChunksLeft(); ++i) {
+ // Find what (if any) intersection the chunk has with subset.
+ const SetType to_add = GetChunk(i).transactions & subset.transactions;
+ if (to_add.Any()) {
+ // If adding that to accumulator makes us hit all of subset, we are done as no
+ // shorter intersection with higher/equal feerate exists.
+ accumulator.transactions |= to_add;
+ if (accumulator.transactions == subset.transactions) break;
+ // Otherwise update the accumulator feerate.
+ accumulator.feerate += m_depgraph.FeeRate(to_add);
+ // If that does result in something better, or something with the same feerate but
+ // smaller, return that. Even if a longer, higher-feerate intersection exists, it
+ // does not hurt to return the shorter one (the remainder of the longer intersection
+ // will generally be found in the next call to Intersect, but even if not, it is not
+ // required for the improvement guarantee this function makes).
+ if (!(accumulator.feerate << subset.feerate)) return accumulator;
+ }
+ }
+ return subset;
+ }
+};
+
+/** Class encapsulating the state needed to find the best remaining ancestor set.
+ *
+ * It is initialized for an entire DepGraph, and parts of the graph can be dropped by calling
+ * MarkDone.
+ *
+ * As long as any part of the graph remains, FindCandidateSet() can be called which will return a
+ * SetInfo with the highest-feerate ancestor set that remains (an ancestor set is a single
+ * transaction together with all its remaining ancestors).
+ */
+template<typename SetType>
+class AncestorCandidateFinder
+{
+ /** Internal dependency graph. */
+ const DepGraph<SetType>& m_depgraph;
+ /** Which transaction are left to include. */
+ SetType m_todo;
+ /** Precomputed ancestor-set feerates (only kept up-to-date for indices in m_todo). */
+ std::vector<FeeFrac> m_ancestor_set_feerates;
+
+public:
+ /** Construct an AncestorCandidateFinder for a given cluster.
+ *
+ * Complexity: O(N^2) where N=depgraph.TxCount().
+ */
+ AncestorCandidateFinder(const DepGraph<SetType>& depgraph LIFETIMEBOUND) noexcept :
+ m_depgraph(depgraph),
+ m_todo{SetType::Fill(depgraph.TxCount())},
+ m_ancestor_set_feerates(depgraph.TxCount())
+ {
+ // Precompute ancestor-set feerates.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ /** The remaining ancestors for transaction i. */
+ SetType anc_to_add = m_depgraph.Ancestors(i);
+ FeeFrac anc_feerate;
+ // Reuse accumulated feerate from first ancestor, if usable.
+ Assume(anc_to_add.Any());
+ ClusterIndex first = anc_to_add.First();
+ if (first < i) {
+ anc_feerate = m_ancestor_set_feerates[first];
+ Assume(!anc_feerate.IsEmpty());
+ anc_to_add -= m_depgraph.Ancestors(first);
+ }
+ // Add in other ancestors (which necessarily include i itself).
+ Assume(anc_to_add[i]);
+ anc_feerate += m_depgraph.FeeRate(anc_to_add);
+ // Store the result.
+ m_ancestor_set_feerates[i] = anc_feerate;
+ }
+ }
+
+ /** Remove a set of transactions from the set of to-be-linearized ones.
+ *
+ * The same transaction may not be MarkDone()'d twice.
+ *
+ * Complexity: O(N*M) where N=depgraph.TxCount(), M=select.Count().
+ */
+ void MarkDone(SetType select) noexcept
+ {
+ Assume(select.Any());
+ Assume(select.IsSubsetOf(m_todo));
+ m_todo -= select;
+ for (auto i : select) {
+ auto feerate = m_depgraph.FeeRate(i);
+ for (auto j : m_depgraph.Descendants(i) & m_todo) {
+ m_ancestor_set_feerates[j] -= feerate;
+ }
+ }
+ }
+
+ /** Check whether any unlinearized transactions remain. */
+ bool AllDone() const noexcept
+ {
+ return m_todo.None();
+ }
+
+ /** Count the number of remaining unlinearized transactions. */
+ ClusterIndex NumRemaining() const noexcept
+ {
+ return m_todo.Count();
+ }
+
+ /** Find the best (highest-feerate, smallest among those in case of a tie) ancestor set
+ * among the remaining transactions. Requires !AllDone().
+ *
+ * Complexity: O(N) where N=depgraph.TxCount();
+ */
+ SetInfo<SetType> FindCandidateSet() const noexcept
+ {
+ Assume(!AllDone());
+ std::optional<ClusterIndex> best;
+ for (auto i : m_todo) {
+ if (best.has_value()) {
+ Assume(!m_ancestor_set_feerates[i].IsEmpty());
+ if (!(m_ancestor_set_feerates[i] > m_ancestor_set_feerates[*best])) continue;
+ }
+ best = i;
+ }
+ Assume(best.has_value());
+ return {m_depgraph.Ancestors(*best) & m_todo, m_ancestor_set_feerates[*best]};
+ }
+};
+
+/** Class encapsulating the state needed to perform search for good candidate sets.
+ *
+ * It is initialized for an entire DepGraph, and parts of the graph can be dropped by calling
+ * MarkDone().
+ *
+ * As long as any part of the graph remains, FindCandidateSet() can be called to perform a search
+ * over the set of topologically-valid subsets of that remainder, with a limit on how many
+ * combinations are tried.
+ */
+template<typename SetType>
+class SearchCandidateFinder
+{
+ /** Internal RNG. */
+ InsecureRandomContext m_rng;
+ /** m_sorted_to_original[i] is the original position that sorted transaction position i had. */
+ std::vector<ClusterIndex> m_sorted_to_original;
+ /** m_original_to_sorted[i] is the sorted position original transaction position i has. */
+ std::vector<ClusterIndex> m_original_to_sorted;
+ /** Internal dependency graph for the cluster (with transactions in decreasing individual
+ * feerate order). */
+ DepGraph<SetType> m_sorted_depgraph;
+ /** Which transactions are left to do (indices in m_sorted_depgraph's order). */
+ SetType m_todo;
+
+ /** Given a set of transactions with sorted indices, get their original indices. */
+ SetType SortedToOriginal(const SetType& arg) const noexcept
+ {
+ SetType ret;
+ for (auto pos : arg) ret.Set(m_sorted_to_original[pos]);
+ return ret;
+ }
+
+ /** Given a set of transactions with original indices, get their sorted indices. */
+ SetType OriginalToSorted(const SetType& arg) const noexcept
+ {
+ SetType ret;
+ for (auto pos : arg) ret.Set(m_original_to_sorted[pos]);
+ return ret;
+ }
+
+public:
+ /** Construct a candidate finder for a graph.
+ *
+ * @param[in] depgraph Dependency graph for the to-be-linearized cluster.
+ * @param[in] rng_seed A random seed to control the search order.
+ *
+ * Complexity: O(N^2) where N=depgraph.Count().
+ */
+ SearchCandidateFinder(const DepGraph<SetType>& depgraph, uint64_t rng_seed) noexcept :
+ m_rng(rng_seed),
+ m_sorted_to_original(depgraph.TxCount()),
+ m_original_to_sorted(depgraph.TxCount()),
+ m_todo(SetType::Fill(depgraph.TxCount()))
+ {
+ // Determine reordering mapping, by sorting by decreasing feerate.
+ std::iota(m_sorted_to_original.begin(), m_sorted_to_original.end(), ClusterIndex{0});
+ std::sort(m_sorted_to_original.begin(), m_sorted_to_original.end(), [&](auto a, auto b) {
+ auto feerate_cmp = depgraph.FeeRate(a) <=> depgraph.FeeRate(b);
+ if (feerate_cmp == 0) return a < b;
+ return feerate_cmp > 0;
+ });
+ // Compute reverse mapping.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ m_original_to_sorted[m_sorted_to_original[i]] = i;
+ }
+ // Compute reordered dependency graph.
+ m_sorted_depgraph = DepGraph(depgraph, m_original_to_sorted);
+ }
+
+ /** Check whether any unlinearized transactions remain. */
+ bool AllDone() const noexcept
+ {
+ return m_todo.None();
+ }
+
+ /** Find a high-feerate topologically-valid subset of what remains of the cluster.
+ * Requires !AllDone().
+ *
+ * @param[in] max_iterations The maximum number of optimization steps that will be performed.
+ * @param[in] best A set/feerate pair with an already-known good candidate. This may
+ * be empty.
+ * @return A pair of:
+ * - The best (highest feerate, smallest size as tiebreaker)
+ * topologically valid subset (and its feerate) that was
+ * encountered during search. It will be at least as good as the
+ * best passed in (if not empty).
+ * - The number of optimization steps that were performed. This will
+ * be <= max_iterations. If strictly < max_iterations, the
+ * returned subset is optimal.
+ *
+ * Complexity: possibly O(N * min(max_iterations, sqrt(2^N))) where N=depgraph.TxCount().
+ */
+ std::pair<SetInfo<SetType>, uint64_t> FindCandidateSet(uint64_t max_iterations, SetInfo<SetType> best) noexcept
+ {
+ Assume(!AllDone());
+
+ // Convert the provided best to internal sorted indices.
+ best.transactions = OriginalToSorted(best.transactions);
+
+ /** Type for work queue items. */
+ struct WorkItem
+ {
+ /** Set of transactions definitely included (and its feerate). This must be a subset
+ * of m_todo, and be topologically valid (includes all in-m_todo ancestors of
+ * itself). */
+ SetInfo<SetType> inc;
+ /** Set of undecided transactions. This must be a subset of m_todo, and have no overlap
+ * with inc. The set (inc | und) must be topologically valid. */
+ SetType und;
+ /** (Only when inc is not empty) The best feerate of any superset of inc that is also a
+ * subset of (inc | und), without requiring it to be topologically valid. It forms a
+ * conservative upper bound on how good a set this work item can give rise to.
+ * Transactions whose feerate is below best's are ignored when determining this value,
+ * which means it may technically be an underestimate, but if so, this work item
+ * cannot result in something that beats best anyway. */
+ FeeFrac pot_feerate;
+
+ /** Construct a new work item. */
+ WorkItem(SetInfo<SetType>&& i, SetType&& u, FeeFrac&& p_f) noexcept :
+ inc(std::move(i)), und(std::move(u)), pot_feerate(std::move(p_f))
+ {
+ Assume(pot_feerate.IsEmpty() == inc.feerate.IsEmpty());
+ }
+
+ /** Swap two WorkItems. */
+ void Swap(WorkItem& other) noexcept
+ {
+ swap(inc, other.inc);
+ swap(und, other.und);
+ swap(pot_feerate, other.pot_feerate);
+ }
+ };
+
+ /** The queue of work items. */
+ VecDeque<WorkItem> queue;
+ queue.reserve(std::max<size_t>(256, 2 * m_todo.Count()));
+
+ // Create initial entries per connected component of m_todo. While clusters themselves are
+ // generally connected, this is not necessarily true after some parts have already been
+ // removed from m_todo. Without this, effort can be wasted on searching "inc" sets that
+ // span multiple components.
+ auto to_cover = m_todo;
+ do {
+ auto component = m_sorted_depgraph.FindConnectedComponent(to_cover);
+ to_cover -= component;
+ // If best is not provided, set it to the first component, so that during the work
+ // processing loop below, and during the add_fn/split_fn calls, we do not need to deal
+ // with the best=empty case.
+ if (best.feerate.IsEmpty()) best = SetInfo(m_sorted_depgraph, component);
+ queue.emplace_back(/*inc=*/SetInfo<SetType>{},
+ /*und=*/std::move(component),
+ /*pot_feerate=*/FeeFrac{});
+ } while (to_cover.Any());
+
+ /** Local copy of the iteration limit. */
+ uint64_t iterations_left = max_iterations;
+
+ /** The set of transactions in m_todo which have feerate > best's. */
+ SetType imp = m_todo;
+ while (imp.Any()) {
+ ClusterIndex check = imp.Last();
+ if (m_sorted_depgraph.FeeRate(check) >> best.feerate) break;
+ imp.Reset(check);
+ }
+
+ /** Internal function to add an item to the queue of elements to explore if there are any
+ * transactions left to split on, possibly improving it before doing so, and to update
+ * best/imp.
+ *
+ * - inc: the "inc" value for the new work item (must be topological).
+ * - und: the "und" value for the new work item ((inc | und) must be topological).
+ */
+ auto add_fn = [&](SetInfo<SetType> inc, SetType und) noexcept {
+ /** SetInfo object with the set whose feerate will become the new work item's
+ * pot_feerate. It starts off equal to inc. */
+ auto pot = inc;
+ if (!inc.feerate.IsEmpty()) {
+ // Add entries to pot. We iterate over all undecided transactions whose feerate is
+ // higher than best. While undecided transactions of lower feerate may improve pot,
+ // the resulting pot feerate cannot possibly exceed best's (and this item will be
+ // skipped in split_fn anyway).
+ for (auto pos : imp & und) {
+ // Determine if adding transaction pos to pot (ignoring topology) would improve
+ // it. If not, we're done updating pot. This relies on the fact that
+ // m_sorted_depgraph, and thus the transactions iterated over, are in decreasing
+ // individual feerate order.
+ if (!(m_sorted_depgraph.FeeRate(pos) >> pot.feerate)) break;
+ pot.Set(m_sorted_depgraph, pos);
+ }
+
+ // The "jump ahead" optimization: whenever pot has a topologically-valid subset,
+ // that subset can be added to inc. Any subset of (pot - inc) has the property that
+ // its feerate exceeds that of any set compatible with this work item (superset of
+ // inc, subset of (inc | und)). Thus, if T is a topological subset of pot, and B is
+ // the best topologically-valid set compatible with this work item, and (T - B) is
+ // non-empty, then (T | B) is better than B and also topological. This is in
+ // contradiction with the assumption that B is best. Thus, (T - B) must be empty,
+ // or T must be a subset of B.
+ //
+ // See https://delvingbitcoin.org/t/how-to-linearize-your-cluster/303 section 2.4.
+ const auto init_inc = inc.transactions;
+ for (auto pos : pot.transactions - inc.transactions) {
+ // If the transaction's ancestors are a subset of pot, we can add it together
+ // with its ancestors to inc. Just update the transactions here; the feerate
+ // update happens below.
+ auto anc_todo = m_sorted_depgraph.Ancestors(pos) & m_todo;
+ if (anc_todo.IsSubsetOf(pot.transactions)) inc.transactions |= anc_todo;
+ }
+ // Finally update und and inc's feerate to account for the added transactions.
+ und -= inc.transactions;
+ inc.feerate += m_sorted_depgraph.FeeRate(inc.transactions - init_inc);
+
+ // If inc's feerate is better than best's, remember it as our new best.
+ if (inc.feerate > best.feerate) {
+ best = inc;
+ // See if we can remove any entries from imp now.
+ while (imp.Any()) {
+ ClusterIndex check = imp.Last();
+ if (m_sorted_depgraph.FeeRate(check) >> best.feerate) break;
+ imp.Reset(check);
+ }
+ }
+
+ // If no potential transactions exist beyond the already included ones, no
+ // improvement is possible anymore.
+ if (pot.feerate.size == inc.feerate.size) return;
+ // At this point und must be non-empty. If it were empty then pot would equal inc.
+ Assume(und.Any());
+ } else {
+ Assume(inc.transactions.None());
+ // If inc is empty, we just make sure there are undecided transactions left to
+ // split on.
+ if (und.None()) return;
+ }
+
+ // Actually construct a new work item on the queue. Due to the switch to DFS when queue
+ // space runs out (see below), we know that no reallocation of the queue should ever
+ // occur.
+ Assume(queue.size() < queue.capacity());
+ queue.emplace_back(/*inc=*/std::move(inc),
+ /*und=*/std::move(und),
+ /*pot_feerate=*/std::move(pot.feerate));
+ };
+
+ /** Internal process function. It takes an existing work item, and splits it in two: one
+ * with a particular transaction (and its ancestors) included, and one with that
+ * transaction (and its descendants) excluded. */
+ auto split_fn = [&](WorkItem&& elem) noexcept {
+ // Any queue element must have undecided transactions left, otherwise there is nothing
+ // to explore anymore.
+ Assume(elem.und.Any());
+ // The included and undecided set are all subsets of m_todo.
+ Assume(elem.inc.transactions.IsSubsetOf(m_todo) && elem.und.IsSubsetOf(m_todo));
+ // Included transactions cannot be undecided.
+ Assume(!elem.inc.transactions.Overlaps(elem.und));
+ // If pot is empty, then so is inc.
+ Assume(elem.inc.feerate.IsEmpty() == elem.pot_feerate.IsEmpty());
+
+ const ClusterIndex first = elem.und.First();
+ if (!elem.inc.feerate.IsEmpty()) {
+ // If no undecided transactions remain with feerate higher than best, this entry
+ // cannot be improved beyond best.
+ if (!elem.und.Overlaps(imp)) return;
+ // We can ignore any queue item whose potential feerate isn't better than the best
+ // seen so far.
+ if (elem.pot_feerate <= best.feerate) return;
+ } else {
+ // In case inc is empty use a simpler alternative check.
+ if (m_sorted_depgraph.FeeRate(first) <= best.feerate) return;
+ }
+
+ // Decide which transaction to split on. Splitting is how new work items are added, and
+ // how progress is made. One split transaction is chosen among the queue item's
+ // undecided ones, and:
+ // - A work item is (potentially) added with that transaction plus its remaining
+ // descendants excluded (removed from the und set).
+ // - A work item is (potentially) added with that transaction plus its remaining
+ // ancestors included (added to the inc set).
+ //
+ // To decide what to split on, consider the undecided ancestors of the highest
+ // individual feerate undecided transaction. Pick the one which reduces the search space
+ // most. Let I(t) be the size of the undecided set after including t, and E(t) the size
+ // of the undecided set after excluding t. Then choose the split transaction t such
+ // that 2^I(t) + 2^E(t) is minimal, tie-breaking by highest individual feerate for t.
+ ClusterIndex split = 0;
+ const auto select = elem.und & m_sorted_depgraph.Ancestors(first);
+ Assume(select.Any());
+ std::optional<std::pair<ClusterIndex, ClusterIndex>> split_counts;
+ for (auto t : select) {
+ // Call max = max(I(t), E(t)) and min = min(I(t), E(t)). Let counts = {max,min}.
+ // Sorting by the tuple counts is equivalent to sorting by 2^I(t) + 2^E(t). This
+ // expression is equal to 2^max + 2^min = 2^max * (1 + 1/2^(max - min)). The second
+ // factor (1 + 1/2^(max - min)) there is in (1,2]. Thus increasing max will always
+ // increase it, even when min decreases. Because of this, we can first sort by max.
+ std::pair<ClusterIndex, ClusterIndex> counts{
+ (elem.und - m_sorted_depgraph.Ancestors(t)).Count(),
+ (elem.und - m_sorted_depgraph.Descendants(t)).Count()};
+ if (counts.first < counts.second) std::swap(counts.first, counts.second);
+ // Remember the t with the lowest counts.
+ if (!split_counts.has_value() || counts < *split_counts) {
+ split = t;
+ split_counts = counts;
+ }
+ }
+ // Since there was at least one transaction in select, we must always find one.
+ Assume(split_counts.has_value());
+
+ // Add a work item corresponding to exclusion of the split transaction.
+ const auto& desc = m_sorted_depgraph.Descendants(split);
+ add_fn(/*inc=*/elem.inc,
+ /*und=*/elem.und - desc);
+
+ // Add a work item corresponding to inclusion of the split transaction.
+ const auto anc = m_sorted_depgraph.Ancestors(split) & m_todo;
+ add_fn(/*inc=*/elem.inc.Add(m_sorted_depgraph, anc),
+ /*und=*/elem.und - anc);
+
+ // Account for the performed split.
+ --iterations_left;
+ };
+
+ // Work processing loop.
+ //
+ // New work items are always added at the back of the queue, but items to process use a
+ // hybrid approach where they can be taken from the front or the back.
+ //
+ // Depth-first search (DFS) corresponds to always taking from the back of the queue. This
+ // is very memory-efficient (linear in the number of transactions). Breadth-first search
+ // (BFS) corresponds to always taking from the front, which potentially uses more memory
+ // (up to exponential in the transaction count), but seems to work better in practice.
+ //
+ // The approach here combines the two: use BFS (plus random swapping) until the queue grows
+ // too large, at which point we temporarily switch to DFS until the size shrinks again.
+ while (!queue.empty()) {
+ // Randomly swap the first two items to randomize the search order.
+ if (queue.size() > 1 && m_rng.randbool()) {
+ queue[0].Swap(queue[1]);
+ }
+
+ // Processing the first queue item, and then using DFS for everything it gives rise to,
+ // may increase the queue size by the number of undecided elements in there, minus 1
+ // for the first queue item being removed. Thus, only when that pushes the queue over
+ // its capacity can we not process from the front (BFS), and should we use DFS.
+ while (queue.size() - 1 + queue.front().und.Count() > queue.capacity()) {
+ if (!iterations_left) break;
+ auto elem = queue.back();
+ queue.pop_back();
+ split_fn(std::move(elem));
+ }
+
+ // Process one entry from the front of the queue (BFS exploration)
+ if (!iterations_left) break;
+ auto elem = queue.front();
+ queue.pop_front();
+ split_fn(std::move(elem));
+ }
+
+ // Return the found best set (converted to the original transaction indices), and the
+ // number of iterations performed.
+ best.transactions = SortedToOriginal(best.transactions);
+ return {std::move(best), max_iterations - iterations_left};
+ }
+
+ /** Remove a subset of transactions from the cluster being linearized.
+ *
+ * Complexity: O(N) where N=done.Count().
+ */
+ void MarkDone(const SetType& done) noexcept
+ {
+ const auto done_sorted = OriginalToSorted(done);
+ Assume(done_sorted.Any());
+ Assume(done_sorted.IsSubsetOf(m_todo));
+ m_todo -= done_sorted;
+ }
+};
+
+/** Find or improve a linearization for a cluster.
+ *
+ * @param[in] depgraph Dependency graph of the cluster to be linearized.
+ * @param[in] max_iterations Upper bound on the number of optimization steps that will be done.
+ * @param[in] rng_seed A random number seed to control search order. This prevents peers
+ * from predicting exactly which clusters would be hard for us to
+ * linearize.
+ * @param[in] old_linearization An existing linearization for the cluster (which must be
+ * topologically valid), or empty.
+ * @return A pair of:
+ * - The resulting linearization. It is guaranteed to be at least as
+ * good (in the feerate diagram sense) as old_linearization.
+ * - A boolean indicating whether the result is guaranteed to be
+ * optimal.
+ *
+ * Complexity: possibly O(N * min(max_iterations + N, sqrt(2^N))) where N=depgraph.TxCount().
+ */
+template<typename SetType>
+std::pair<std::vector<ClusterIndex>, bool> Linearize(const DepGraph<SetType>& depgraph, uint64_t max_iterations, uint64_t rng_seed, Span<const ClusterIndex> old_linearization = {}) noexcept
+{
+ Assume(old_linearization.empty() || old_linearization.size() == depgraph.TxCount());
+ if (depgraph.TxCount() == 0) return {{}, true};
+
+ uint64_t iterations_left = max_iterations;
+ std::vector<ClusterIndex> linearization;
+
+ AncestorCandidateFinder anc_finder(depgraph);
+ std::optional<SearchCandidateFinder<SetType>> src_finder;
+ linearization.reserve(depgraph.TxCount());
+ bool optimal = true;
+
+ // Treat the initialization of SearchCandidateFinder as taking N^2/64 (rounded up) iterations
+ // (largely due to the cost of constructing the internal sorted-by-feerate DepGraph inside
+ // SearchCandidateFinder), a rough approximation based on benchmark. If we don't have that
+ // many, don't start it.
+ uint64_t start_iterations = (uint64_t{depgraph.TxCount()} * depgraph.TxCount() + 63) / 64;
+ if (iterations_left > start_iterations) {
+ iterations_left -= start_iterations;
+ src_finder.emplace(depgraph, rng_seed);
+ }
+
+ /** Chunking of what remains of the old linearization. */
+ LinearizationChunking old_chunking(depgraph, old_linearization);
+
+ while (true) {
+ // Find the highest-feerate prefix of the remainder of old_linearization.
+ SetInfo<SetType> best_prefix;
+ if (old_chunking.NumChunksLeft()) best_prefix = old_chunking.GetChunk(0);
+
+ // Then initialize best to be either the best remaining ancestor set, or the first chunk.
+ auto best = anc_finder.FindCandidateSet();
+ if (!best_prefix.feerate.IsEmpty() && best_prefix.feerate >= best.feerate) best = best_prefix;
+
+ uint64_t iterations_done_now = 0;
+ uint64_t max_iterations_now = 0;
+ if (src_finder) {
+ // Treat the invocation of SearchCandidateFinder::FindCandidateSet() as costing N/4
+ // up-front (rounded up) iterations (largely due to the cost of connected-component
+ // splitting), a rough approximation based on benchmarks.
+ uint64_t base_iterations = (anc_finder.NumRemaining() + 3) / 4;
+ if (iterations_left > base_iterations) {
+ // Invoke bounded search to update best, with up to half of our remaining
+ // iterations as limit.
+ iterations_left -= base_iterations;
+ max_iterations_now = (iterations_left + 1) / 2;
+ std::tie(best, iterations_done_now) = src_finder->FindCandidateSet(max_iterations_now, best);
+ iterations_left -= iterations_done_now;
+ }
+ }
+
+ if (iterations_done_now == max_iterations_now) {
+ optimal = false;
+ // If the search result is not (guaranteed to be) optimal, run intersections to make
+ // sure we don't pick something that makes us unable to reach further diagram points
+ // of the old linearization.
+ if (old_chunking.NumChunksLeft() > 0) {
+ best = old_chunking.IntersectPrefixes(best);
+ }
+ }
+
+ // Add to output in topological order.
+ depgraph.AppendTopo(linearization, best.transactions);
+
+ // Update state to reflect best is no longer to be linearized.
+ anc_finder.MarkDone(best.transactions);
+ if (anc_finder.AllDone()) break;
+ if (src_finder) src_finder->MarkDone(best.transactions);
+ if (old_chunking.NumChunksLeft() > 0) {
+ old_chunking.MarkDone(best.transactions);
+ }
+ }
+
+ return {std::move(linearization), optimal};
+}
+
+/** Improve a given linearization.
+ *
+ * @param[in] depgraph Dependency graph of the cluster being linearized.
+ * @param[in,out] linearization On input, an existing linearization for depgraph. On output, a
+ * potentially better linearization for the same graph.
+ *
+ * Postlinearization guarantees:
+ * - The resulting chunks are connected.
+ * - If the input has a tree shape (either all transactions have at most one child, or all
+ * transactions have at most one parent), the result is optimal.
+ * - Given a linearization L1 and a leaf transaction T in it. Let L2 be L1 with T moved to the end,
+ * optionally with its fee increased. Let L3 be the postlinearization of L2. L3 will be at least
+ * as good as L1. This means that replacing transactions with same-size higher-fee transactions
+ * will not worsen linearizations through a "drop conflicts, append new transactions,
+ * postlinearize" process.
+ */
+template<typename SetType>
+void PostLinearize(const DepGraph<SetType>& depgraph, Span<ClusterIndex> linearization)
+{
+ // This algorithm performs a number of passes (currently 2); the even ones operate from back to
+ // front, the odd ones from front to back. Each results in an equal-or-better linearization
+ // than the one started from.
+ // - One pass in either direction guarantees that the resulting chunks are connected.
+ // - Each direction corresponds to one shape of tree being linearized optimally (forward passes
+ // guarantee this for graphs where each transaction has at most one child; backward passes
+ // guarantee this for graphs where each transaction has at most one parent).
+ // - Starting with a backward pass guarantees the moved-tree property.
+ //
+ // During an odd (forward) pass, the high-level operation is:
+ // - Start with an empty list of groups L=[].
+ // - For every transaction i in the old linearization, from front to back:
+ // - Append a new group C=[i], containing just i, to the back of L.
+ // - While L has at least one group before C, and the group immediately before C has feerate
+ // lower than C:
+ // - If C depends on P:
+ // - Merge P into C, making C the concatenation of P+C, continuing with the combined C.
+ // - Otherwise:
+ // - Swap P with C, continuing with the now-moved C.
+ // - The output linearization is the concatenation of the groups in L.
+ //
+ // During even (backward) passes, i iterates from the back to the front of the existing
+ // linearization, and new groups are prepended instead of appended to the list L. To enable
+ // more code reuse, both passes append groups, but during even passes the meanings of
+ // parent/child, and of high/low feerate are reversed, and the final concatenation is reversed
+ // on output.
+ //
+ // In the implementation below, the groups are represented by singly-linked lists (pointing
+ // from the back to the front), which are themselves organized in a singly-linked circular
+ // list (each group pointing to its predecessor, with a special sentinel group at the front
+ // that points back to the last group).
+ //
+ // Information about transaction t is stored in entries[t + 1], while the sentinel is in
+ // entries[0].
+
+ /** Index of the sentinel in the entries array below. */
+ static constexpr ClusterIndex SENTINEL{0};
+ /** Indicator that a group has no previous transaction. */
+ static constexpr ClusterIndex NO_PREV_TX{0};
+
+
+ /** Data structure per transaction entry. */
+ struct TxEntry
+ {
+ /** The index of the previous transaction in this group; NO_PREV_TX if this is the first
+ * entry of a group. */
+ ClusterIndex prev_tx;
+
+ // The fields below are only used for transactions that are the last one in a group
+ // (referred to as tail transactions below).
+
+ /** Index of the first transaction in this group, possibly itself. */
+ ClusterIndex first_tx;
+ /** Index of the last transaction in the previous group. The first group (the sentinel)
+ * points back to the last group here, making it a singly-linked circular list. */
+ ClusterIndex prev_group;
+ /** All transactions in the group. Empty for the sentinel. */
+ SetType group;
+ /** All dependencies of the group (descendants in even passes; ancestors in odd ones). */
+ SetType deps;
+ /** The combined fee/size of transactions in the group. Fee is negated in even passes. */
+ FeeFrac feerate;
+ };
+
+ // As an example, consider the state corresponding to the linearization [1,0,3,2], with
+ // groups [1,0,3] and [2], in an odd pass. The linked lists would be:
+ //
+ // +-----+
+ // 0<-P-- | 0 S | ---\ Legend:
+ // +-----+ |
+ // ^ | - digit in box: entries index
+ // /--------------F---------+ G | (note: one more than tx value)
+ // v \ | | - S: sentinel group
+ // +-----+ +-----+ +-----+ | (empty feerate)
+ // 0<-P-- | 2 | <--P-- | 1 | <--P-- | 4 T | | - T: tail transaction, contains
+ // +-----+ +-----+ +-----+ | fields beyond prev_tv.
+ // ^ | - P: prev_tx reference
+ // G G - F: first_tx reference
+ // | | - G: prev_group reference
+ // +-----+ |
+ // 0<-P-- | 3 T | <--/
+ // +-----+
+ // ^ |
+ // \-F-/
+ //
+ // During an even pass, the diagram above would correspond to linearization [2,3,0,1], with
+ // groups [2] and [3,0,1].
+
+ std::vector<TxEntry> entries(linearization.size() + 1);
+
+ // Perform two passes over the linearization.
+ for (int pass = 0; pass < 2; ++pass) {
+ int rev = !(pass & 1);
+ // Construct a sentinel group, identifying the start of the list.
+ entries[SENTINEL].prev_group = SENTINEL;
+ Assume(entries[SENTINEL].feerate.IsEmpty());
+
+ // Iterate over all elements in the existing linearization.
+ for (ClusterIndex i = 0; i < linearization.size(); ++i) {
+ // Even passes are from back to front; odd passes from front to back.
+ ClusterIndex idx = linearization[rev ? linearization.size() - 1 - i : i];
+ // Construct a new group containing just idx. In even passes, the meaning of
+ // parent/child and high/low feerate are swapped.
+ ClusterIndex cur_group = idx + 1;
+ entries[cur_group].group = SetType::Singleton(idx);
+ entries[cur_group].deps = rev ? depgraph.Descendants(idx): depgraph.Ancestors(idx);
+ entries[cur_group].feerate = depgraph.FeeRate(idx);
+ if (rev) entries[cur_group].feerate.fee = -entries[cur_group].feerate.fee;
+ entries[cur_group].prev_tx = NO_PREV_TX; // No previous transaction in group.
+ entries[cur_group].first_tx = cur_group; // Transaction itself is first of group.
+ // Insert the new group at the back of the groups linked list.
+ entries[cur_group].prev_group = entries[SENTINEL].prev_group;
+ entries[SENTINEL].prev_group = cur_group;
+
+ // Start merge/swap cycle.
+ ClusterIndex next_group = SENTINEL; // We inserted at the end, so next group is sentinel.
+ ClusterIndex prev_group = entries[cur_group].prev_group;
+ // Continue as long as the current group has higher feerate than the previous one.
+ while (entries[cur_group].feerate >> entries[prev_group].feerate) {
+ // prev_group/cur_group/next_group refer to (the last transactions of) 3
+ // consecutive entries in groups list.
+ Assume(cur_group == entries[next_group].prev_group);
+ Assume(prev_group == entries[cur_group].prev_group);
+ // The sentinel has empty feerate, which is neither higher or lower than other
+ // feerates. Thus, the while loop we are in here guarantees that cur_group and
+ // prev_group are not the sentinel.
+ Assume(cur_group != SENTINEL);
+ Assume(prev_group != SENTINEL);
+ if (entries[cur_group].deps.Overlaps(entries[prev_group].group)) {
+ // There is a dependency between cur_group and prev_group; merge prev_group
+ // into cur_group. The group/deps/feerate fields of prev_group remain unchanged
+ // but become unused.
+ entries[cur_group].group |= entries[prev_group].group;
+ entries[cur_group].deps |= entries[prev_group].deps;
+ entries[cur_group].feerate += entries[prev_group].feerate;
+ // Make the first of the current group point to the tail of the previous group.
+ entries[entries[cur_group].first_tx].prev_tx = prev_group;
+ // The first of the previous group becomes the first of the newly-merged group.
+ entries[cur_group].first_tx = entries[prev_group].first_tx;
+ // The previous group becomes whatever group was before the former one.
+ prev_group = entries[prev_group].prev_group;
+ entries[cur_group].prev_group = prev_group;
+ } else {
+ // There is no dependency between cur_group and prev_group; swap them.
+ ClusterIndex preprev_group = entries[prev_group].prev_group;
+ // If PP, P, C, N were the old preprev, prev, cur, next groups, then the new
+ // layout becomes [PP, C, P, N]. Update prev_groups to reflect that order.
+ entries[next_group].prev_group = prev_group;
+ entries[prev_group].prev_group = cur_group;
+ entries[cur_group].prev_group = preprev_group;
+ // The current group remains the same, but the groups before/after it have
+ // changed.
+ next_group = prev_group;
+ prev_group = preprev_group;
+ }
+ }
+ }
+
+ // Convert the entries back to linearization (overwriting the existing one).
+ ClusterIndex cur_group = entries[0].prev_group;
+ ClusterIndex done = 0;
+ while (cur_group != SENTINEL) {
+ ClusterIndex cur_tx = cur_group;
+ // Traverse the transactions of cur_group (from back to front), and write them in the
+ // same order during odd passes, and reversed (front to back) in even passes.
+ if (rev) {
+ do {
+ *(linearization.begin() + (done++)) = cur_tx - 1;
+ cur_tx = entries[cur_tx].prev_tx;
+ } while (cur_tx != NO_PREV_TX);
+ } else {
+ do {
+ *(linearization.end() - (++done)) = cur_tx - 1;
+ cur_tx = entries[cur_tx].prev_tx;
+ } while (cur_tx != NO_PREV_TX);
+ }
+ cur_group = entries[cur_group].prev_group;
+ }
+ Assume(done == linearization.size());
+ }
+}
+
+/** Merge two linearizations for the same cluster into one that is as good as both.
+ *
+ * Complexity: O(N^2) where N=depgraph.TxCount(); O(N) if both inputs are identical.
+ */
+template<typename SetType>
+std::vector<ClusterIndex> MergeLinearizations(const DepGraph<SetType>& depgraph, Span<const ClusterIndex> lin1, Span<const ClusterIndex> lin2)
+{
+ Assume(lin1.size() == depgraph.TxCount());
+ Assume(lin2.size() == depgraph.TxCount());
+
+ /** Chunkings of what remains of both input linearizations. */
+ LinearizationChunking chunking1(depgraph, lin1), chunking2(depgraph, lin2);
+ /** Output linearization. */
+ std::vector<ClusterIndex> ret;
+ if (depgraph.TxCount() == 0) return ret;
+ ret.reserve(depgraph.TxCount());
+
+ while (true) {
+ // As long as we are not done, both linearizations must have chunks left.
+ Assume(chunking1.NumChunksLeft() > 0);
+ Assume(chunking2.NumChunksLeft() > 0);
+ // Find the set to output by taking the best remaining chunk, and then intersecting it with
+ // prefixes of remaining chunks of the other linearization.
+ SetInfo<SetType> best;
+ const auto& lin1_firstchunk = chunking1.GetChunk(0);
+ const auto& lin2_firstchunk = chunking2.GetChunk(0);
+ if (lin2_firstchunk.feerate >> lin1_firstchunk.feerate) {
+ best = chunking1.IntersectPrefixes(lin2_firstchunk);
+ } else {
+ best = chunking2.IntersectPrefixes(lin1_firstchunk);
+ }
+ // Append the result to the output and mark it as done.
+ depgraph.AppendTopo(ret, best.transactions);
+ chunking1.MarkDone(best.transactions);
+ if (chunking1.NumChunksLeft() == 0) break;
+ chunking2.MarkDone(best.transactions);
+ }
+
+ Assume(ret.size() == depgraph.TxCount());
+ return ret;
+}
+
+} // namespace cluster_linearize
+
+#endif // BITCOIN_CLUSTER_LINEARIZE_H
diff --git a/src/coins.cpp b/src/coins.cpp
index a4e4d4ad32..a47ab8063e 100644
--- a/src/coins.cpp
+++ b/src/coins.cpp
@@ -12,7 +12,7 @@
bool CCoinsView::GetCoin(const COutPoint &outpoint, Coin &coin) const { return false; }
uint256 CCoinsView::GetBestBlock() const { return uint256(); }
std::vector<uint256> CCoinsView::GetHeadBlocks() const { return std::vector<uint256>(); }
-bool CCoinsView::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase) { return false; }
+bool CCoinsView::BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlock) { return false; }
std::unique_ptr<CCoinsViewCursor> CCoinsView::Cursor() const { return nullptr; }
bool CCoinsView::HaveCoin(const COutPoint &outpoint) const
@@ -27,33 +27,34 @@ bool CCoinsViewBacked::HaveCoin(const COutPoint &outpoint) const { return base->
uint256 CCoinsViewBacked::GetBestBlock() const { return base->GetBestBlock(); }
std::vector<uint256> CCoinsViewBacked::GetHeadBlocks() const { return base->GetHeadBlocks(); }
void CCoinsViewBacked::SetBackend(CCoinsView &viewIn) { base = &viewIn; }
-bool CCoinsViewBacked::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase) { return base->BatchWrite(mapCoins, hashBlock, erase); }
+bool CCoinsViewBacked::BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlock) { return base->BatchWrite(cursor, hashBlock); }
std::unique_ptr<CCoinsViewCursor> CCoinsViewBacked::Cursor() const { return base->Cursor(); }
size_t CCoinsViewBacked::EstimateSize() const { return base->EstimateSize(); }
CCoinsViewCache::CCoinsViewCache(CCoinsView* baseIn, bool deterministic) :
CCoinsViewBacked(baseIn), m_deterministic(deterministic),
cacheCoins(0, SaltedOutpointHasher(/*deterministic=*/deterministic), CCoinsMap::key_equal{}, &m_cache_coins_memory_resource)
-{}
+{
+ m_sentinel.second.SelfRef(m_sentinel);
+}
size_t CCoinsViewCache::DynamicMemoryUsage() const {
return memusage::DynamicUsage(cacheCoins) + cachedCoinsUsage;
}
CCoinsMap::iterator CCoinsViewCache::FetchCoin(const COutPoint &outpoint) const {
- CCoinsMap::iterator it = cacheCoins.find(outpoint);
- if (it != cacheCoins.end())
- return it;
- Coin tmp;
- if (!base->GetCoin(outpoint, tmp))
- return cacheCoins.end();
- CCoinsMap::iterator ret = cacheCoins.emplace(std::piecewise_construct, std::forward_as_tuple(outpoint), std::forward_as_tuple(std::move(tmp))).first;
- if (ret->second.coin.IsSpent()) {
- // The parent only has an empty entry for this outpoint; we can consider our
- // version as fresh.
- ret->second.flags = CCoinsCacheEntry::FRESH;
+ const auto [ret, inserted] = cacheCoins.try_emplace(outpoint);
+ if (inserted) {
+ if (!base->GetCoin(outpoint, ret->second.coin)) {
+ cacheCoins.erase(ret);
+ return cacheCoins.end();
+ }
+ if (ret->second.coin.IsSpent()) {
+ // The parent only has an empty entry for this outpoint; we can consider our version as fresh.
+ ret->second.AddFlags(CCoinsCacheEntry::FRESH, *ret, m_sentinel);
+ }
+ cachedCoinsUsage += ret->second.coin.DynamicMemoryUsage();
}
- cachedCoinsUsage += ret->second.coin.DynamicMemoryUsage();
return ret;
}
@@ -93,10 +94,10 @@ void CCoinsViewCache::AddCoin(const COutPoint &outpoint, Coin&& coin, bool possi
//
// If the coin doesn't exist in the current cache, or is spent but not
// DIRTY, then it can be marked FRESH.
- fresh = !(it->second.flags & CCoinsCacheEntry::DIRTY);
+ fresh = !it->second.IsDirty();
}
it->second.coin = std::move(coin);
- it->second.flags |= CCoinsCacheEntry::DIRTY | (fresh ? CCoinsCacheEntry::FRESH : 0);
+ it->second.AddFlags(CCoinsCacheEntry::DIRTY | (fresh ? CCoinsCacheEntry::FRESH : 0), *it, m_sentinel);
cachedCoinsUsage += it->second.coin.DynamicMemoryUsage();
TRACE5(utxocache, add,
outpoint.hash.data(),
@@ -108,10 +109,13 @@ void CCoinsViewCache::AddCoin(const COutPoint &outpoint, Coin&& coin, bool possi
void CCoinsViewCache::EmplaceCoinInternalDANGER(COutPoint&& outpoint, Coin&& coin) {
cachedCoinsUsage += coin.DynamicMemoryUsage();
- cacheCoins.emplace(
+ auto [it, inserted] = cacheCoins.emplace(
std::piecewise_construct,
std::forward_as_tuple(std::move(outpoint)),
- std::forward_as_tuple(std::move(coin), CCoinsCacheEntry::DIRTY));
+ std::forward_as_tuple(std::move(coin)));
+ if (inserted) {
+ it->second.AddFlags(CCoinsCacheEntry::DIRTY, *it, m_sentinel);
+ }
}
void AddCoins(CCoinsViewCache& cache, const CTransaction &tx, int nHeight, bool check_for_overwrite) {
@@ -138,10 +142,10 @@ bool CCoinsViewCache::SpendCoin(const COutPoint &outpoint, Coin* moveout) {
if (moveout) {
*moveout = std::move(it->second.coin);
}
- if (it->second.flags & CCoinsCacheEntry::FRESH) {
+ if (it->second.IsFresh()) {
cacheCoins.erase(it);
} else {
- it->second.flags |= CCoinsCacheEntry::DIRTY;
+ it->second.AddFlags(CCoinsCacheEntry::DIRTY, *it, m_sentinel);
it->second.coin.Clear();
}
return true;
@@ -178,42 +182,40 @@ void CCoinsViewCache::SetBestBlock(const uint256 &hashBlockIn) {
hashBlock = hashBlockIn;
}
-bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn, bool erase) {
- for (CCoinsMap::iterator it = mapCoins.begin();
- it != mapCoins.end();
- it = erase ? mapCoins.erase(it) : std::next(it)) {
+bool CCoinsViewCache::BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlockIn) {
+ for (auto it{cursor.Begin()}; it != cursor.End(); it = cursor.NextAndMaybeErase(*it)) {
// Ignore non-dirty entries (optimization).
- if (!(it->second.flags & CCoinsCacheEntry::DIRTY)) {
+ if (!it->second.IsDirty()) {
continue;
}
CCoinsMap::iterator itUs = cacheCoins.find(it->first);
if (itUs == cacheCoins.end()) {
// The parent cache does not have an entry, while the child cache does.
// We can ignore it if it's both spent and FRESH in the child
- if (!(it->second.flags & CCoinsCacheEntry::FRESH && it->second.coin.IsSpent())) {
+ if (!(it->second.IsFresh() && it->second.coin.IsSpent())) {
// Create the coin in the parent cache, move the data up
// and mark it as dirty.
- CCoinsCacheEntry& entry = cacheCoins[it->first];
- if (erase) {
- // The `move` call here is purely an optimization; we rely on the
- // `mapCoins.erase` call in the `for` expression to actually remove
- // the entry from the child map.
+ itUs = cacheCoins.try_emplace(it->first).first;
+ CCoinsCacheEntry& entry{itUs->second};
+ if (cursor.WillErase(*it)) {
+ // Since this entry will be erased,
+ // we can move the coin into us instead of copying it
entry.coin = std::move(it->second.coin);
} else {
entry.coin = it->second.coin;
}
cachedCoinsUsage += entry.coin.DynamicMemoryUsage();
- entry.flags = CCoinsCacheEntry::DIRTY;
+ entry.AddFlags(CCoinsCacheEntry::DIRTY, *itUs, m_sentinel);
// We can mark it FRESH in the parent if it was FRESH in the child
// Otherwise it might have just been flushed from the parent's cache
// and already exist in the grandparent
- if (it->second.flags & CCoinsCacheEntry::FRESH) {
- entry.flags |= CCoinsCacheEntry::FRESH;
+ if (it->second.IsFresh()) {
+ entry.AddFlags(CCoinsCacheEntry::FRESH, *itUs, m_sentinel);
}
}
} else {
// Found the entry in the parent cache
- if ((it->second.flags & CCoinsCacheEntry::FRESH) && !itUs->second.coin.IsSpent()) {
+ if (it->second.IsFresh() && !itUs->second.coin.IsSpent()) {
// The coin was marked FRESH in the child cache, but the coin
// exists in the parent cache. If this ever happens, it means
// the FRESH flag was misapplied and there is a logic error in
@@ -221,7 +223,7 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
throw std::logic_error("FRESH flag misapplied to coin that exists in parent cache");
}
- if ((itUs->second.flags & CCoinsCacheEntry::FRESH) && it->second.coin.IsSpent()) {
+ if (itUs->second.IsFresh() && it->second.coin.IsSpent()) {
// The grandparent cache does not have an entry, and the coin
// has been spent. We can just delete it from the parent cache.
cachedCoinsUsage -= itUs->second.coin.DynamicMemoryUsage();
@@ -229,16 +231,15 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
} else {
// A normal modification.
cachedCoinsUsage -= itUs->second.coin.DynamicMemoryUsage();
- if (erase) {
- // The `move` call here is purely an optimization; we rely on the
- // `mapCoins.erase` call in the `for` expression to actually remove
- // the entry from the child map.
+ if (cursor.WillErase(*it)) {
+ // Since this entry will be erased,
+ // we can move the coin into us instead of copying it
itUs->second.coin = std::move(it->second.coin);
} else {
itUs->second.coin = it->second.coin;
}
cachedCoinsUsage += itUs->second.coin.DynamicMemoryUsage();
- itUs->second.flags |= CCoinsCacheEntry::DIRTY;
+ itUs->second.AddFlags(CCoinsCacheEntry::DIRTY, *itUs, m_sentinel);
// NOTE: It isn't safe to mark the coin as FRESH in the parent
// cache. If it already existed and was spent in the parent
// cache then marking it FRESH would prevent that spentness
@@ -251,12 +252,10 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
}
bool CCoinsViewCache::Flush() {
- bool fOk = base->BatchWrite(cacheCoins, hashBlock, /*erase=*/true);
+ auto cursor{CoinsViewCacheCursor(cachedCoinsUsage, m_sentinel, cacheCoins, /*will_erase=*/true)};
+ bool fOk = base->BatchWrite(cursor, hashBlock);
if (fOk) {
- if (!cacheCoins.empty()) {
- /* BatchWrite must erase all cacheCoins elements when erase=true. */
- throw std::logic_error("Not all cached coins were erased");
- }
+ cacheCoins.clear();
ReallocateCache();
}
cachedCoinsUsage = 0;
@@ -265,16 +264,12 @@ bool CCoinsViewCache::Flush() {
bool CCoinsViewCache::Sync()
{
- bool fOk = base->BatchWrite(cacheCoins, hashBlock, /*erase=*/false);
- // Instead of clearing `cacheCoins` as we would in Flush(), just clear the
- // FRESH/DIRTY flags of any coin that isn't spent.
- for (auto it = cacheCoins.begin(); it != cacheCoins.end(); ) {
- if (it->second.coin.IsSpent()) {
- cachedCoinsUsage -= it->second.coin.DynamicMemoryUsage();
- it = cacheCoins.erase(it);
- } else {
- it->second.flags = 0;
- ++it;
+ auto cursor{CoinsViewCacheCursor(cachedCoinsUsage, m_sentinel, cacheCoins, /*will_erase=*/false)};
+ bool fOk = base->BatchWrite(cursor, hashBlock);
+ if (fOk) {
+ if (m_sentinel.second.Next() != &m_sentinel) {
+ /* BatchWrite must clear flags of all entries */
+ throw std::logic_error("Not all unspent flagged entries were cleared");
}
}
return fOk;
@@ -283,7 +278,7 @@ bool CCoinsViewCache::Sync()
void CCoinsViewCache::Uncache(const COutPoint& hash)
{
CCoinsMap::iterator it = cacheCoins.find(hash);
- if (it != cacheCoins.end() && it->second.flags == 0) {
+ if (it != cacheCoins.end() && !it->second.IsDirty() && !it->second.IsFresh()) {
cachedCoinsUsage -= it->second.coin.DynamicMemoryUsage();
TRACE5(utxocache, uncache,
hash.hash.data(),
@@ -324,17 +319,33 @@ void CCoinsViewCache::ReallocateCache()
void CCoinsViewCache::SanityCheck() const
{
size_t recomputed_usage = 0;
+ size_t count_flagged = 0;
for (const auto& [_, entry] : cacheCoins) {
unsigned attr = 0;
- if (entry.flags & CCoinsCacheEntry::DIRTY) attr |= 1;
- if (entry.flags & CCoinsCacheEntry::FRESH) attr |= 2;
+ if (entry.IsDirty()) attr |= 1;
+ if (entry.IsFresh()) attr |= 2;
if (entry.coin.IsSpent()) attr |= 4;
// Only 5 combinations are possible.
assert(attr != 2 && attr != 4 && attr != 7);
// Recompute cachedCoinsUsage.
recomputed_usage += entry.coin.DynamicMemoryUsage();
+
+ // Count the number of entries we expect in the linked list.
+ if (entry.IsDirty() || entry.IsFresh()) ++count_flagged;
+ }
+ // Iterate over the linked list of flagged entries.
+ size_t count_linked = 0;
+ for (auto it = m_sentinel.second.Next(); it != &m_sentinel; it = it->second.Next()) {
+ // Verify linked list integrity.
+ assert(it->second.Next()->second.Prev() == it);
+ assert(it->second.Prev()->second.Next() == it);
+ // Verify they are actually flagged.
+ assert(it->second.IsDirty() || it->second.IsFresh());
+ // Count the number of entries actually in the list.
+ ++count_linked;
}
+ assert(count_linked == count_flagged);
assert(recomputed_usage == cachedCoinsUsage);
}
diff --git a/src/coins.h b/src/coins.h
index c798cc38ba..78b8eddacd 100644
--- a/src/coins.h
+++ b/src/coins.h
@@ -13,6 +13,7 @@
#include <serialize.h>
#include <support/allocators/pool.h>
#include <uint256.h>
+#include <util/check.h>
#include <util/hasher.h>
#include <assert.h>
@@ -86,6 +87,9 @@ public:
}
};
+struct CCoinsCacheEntry;
+using CoinsCachePair = std::pair<const COutPoint, CCoinsCacheEntry>;
+
/**
* A Coin in one level of the coins database caching hierarchy.
*
@@ -103,8 +107,29 @@ public:
*/
struct CCoinsCacheEntry
{
+private:
+ /**
+ * These are used to create a doubly linked list of flagged entries.
+ * They are set in AddFlags and unset in ClearFlags.
+ * A flagged entry is any entry that is either DIRTY, FRESH, or both.
+ *
+ * DIRTY entries are tracked so that only modified entries can be passed to
+ * the parent cache for batch writing. This is a performance optimization
+ * compared to giving all entries in the cache to the parent and having the
+ * parent scan for only modified entries.
+ *
+ * FRESH-but-not-DIRTY coins can not occur in practice, since that would
+ * mean a spent coin exists in the parent CCoinsView and not in the child
+ * CCoinsViewCache. Nevertheless, if a spent coin is retrieved from the
+ * parent cache, the FRESH-but-not-DIRTY coin will be tracked by the linked
+ * list and deleted when Sync or Flush is called on the CCoinsViewCache.
+ */
+ CoinsCachePair* m_prev{nullptr};
+ CoinsCachePair* m_next{nullptr};
+ uint8_t m_flags{0};
+
+public:
Coin coin; // The actual cached data.
- unsigned char flags;
enum Flags {
/**
@@ -127,9 +152,59 @@ struct CCoinsCacheEntry
FRESH = (1 << 1),
};
- CCoinsCacheEntry() : flags(0) {}
- explicit CCoinsCacheEntry(Coin&& coin_) : coin(std::move(coin_)), flags(0) {}
- CCoinsCacheEntry(Coin&& coin_, unsigned char flag) : coin(std::move(coin_)), flags(flag) {}
+ CCoinsCacheEntry() noexcept = default;
+ explicit CCoinsCacheEntry(Coin&& coin_) noexcept : coin(std::move(coin_)) {}
+ ~CCoinsCacheEntry()
+ {
+ ClearFlags();
+ }
+
+ //! Adding a flag also requires a self reference to the pair that contains
+ //! this entry in the CCoinsCache map and a reference to the sentinel of the
+ //! flagged pair linked list.
+ inline void AddFlags(uint8_t flags, CoinsCachePair& self, CoinsCachePair& sentinel) noexcept
+ {
+ Assume(&self.second == this);
+ if (!m_flags && flags) {
+ m_prev = sentinel.second.m_prev;
+ m_next = &sentinel;
+ sentinel.second.m_prev = &self;
+ m_prev->second.m_next = &self;
+ }
+ m_flags |= flags;
+ }
+ inline void ClearFlags() noexcept
+ {
+ if (!m_flags) return;
+ m_next->second.m_prev = m_prev;
+ m_prev->second.m_next = m_next;
+ m_flags = 0;
+ }
+ inline uint8_t GetFlags() const noexcept { return m_flags; }
+ inline bool IsDirty() const noexcept { return m_flags & DIRTY; }
+ inline bool IsFresh() const noexcept { return m_flags & FRESH; }
+
+ //! Only call Next when this entry is DIRTY, FRESH, or both
+ inline CoinsCachePair* Next() const noexcept {
+ Assume(m_flags);
+ return m_next;
+ }
+
+ //! Only call Prev when this entry is DIRTY, FRESH, or both
+ inline CoinsCachePair* Prev() const noexcept {
+ Assume(m_flags);
+ return m_prev;
+ }
+
+ //! Only use this for initializing the linked list sentinel
+ inline void SelfRef(CoinsCachePair& self) noexcept
+ {
+ Assume(&self.second == this);
+ m_prev = &self;
+ m_next = &self;
+ // Set sentinel to DIRTY so we can call Next on it
+ m_flags = DIRTY;
+ }
};
/**
@@ -144,8 +219,8 @@ using CCoinsMap = std::unordered_map<COutPoint,
CCoinsCacheEntry,
SaltedOutpointHasher,
std::equal_to<COutPoint>,
- PoolAllocator<std::pair<const COutPoint, CCoinsCacheEntry>,
- sizeof(std::pair<const COutPoint, CCoinsCacheEntry>) + sizeof(void*) * 4>>;
+ PoolAllocator<CoinsCachePair,
+ sizeof(CoinsCachePair) + sizeof(void*) * 4>>;
using CCoinsMapMemoryResource = CCoinsMap::allocator_type::ResourceType;
@@ -154,7 +229,7 @@ class CCoinsViewCursor
{
public:
CCoinsViewCursor(const uint256 &hashBlockIn): hashBlock(hashBlockIn) {}
- virtual ~CCoinsViewCursor() {}
+ virtual ~CCoinsViewCursor() = default;
virtual bool GetKey(COutPoint &key) const = 0;
virtual bool GetValue(Coin &coin) const = 0;
@@ -168,6 +243,62 @@ private:
uint256 hashBlock;
};
+/**
+ * Cursor for iterating over the linked list of flagged entries in CCoinsViewCache.
+ *
+ * This is a helper struct to encapsulate the diverging logic between a non-erasing
+ * CCoinsViewCache::Sync and an erasing CCoinsViewCache::Flush. This allows the receiver
+ * of CCoinsView::BatchWrite to iterate through the flagged entries without knowing
+ * the caller's intent.
+ *
+ * However, the receiver can still call CoinsViewCacheCursor::WillErase to see if the
+ * caller will erase the entry after BatchWrite returns. If so, the receiver can
+ * perform optimizations such as moving the coin out of the CCoinsCachEntry instead
+ * of copying it.
+ */
+struct CoinsViewCacheCursor
+{
+ //! If will_erase is not set, iterating through the cursor will erase spent coins from the map,
+ //! and other coins will be unflagged (removing them from the linked list).
+ //! If will_erase is set, the underlying map and linked list will not be modified,
+ //! as the caller is expected to wipe the entire map anyway.
+ //! This is an optimization compared to erasing all entries as the cursor iterates them when will_erase is set.
+ //! Calling CCoinsMap::clear() afterwards is faster because a CoinsCachePair cannot be coerced back into a
+ //! CCoinsMap::iterator to be erased, and must therefore be looked up again by key in the CCoinsMap before being erased.
+ CoinsViewCacheCursor(size_t& usage LIFETIMEBOUND,
+ CoinsCachePair& sentinel LIFETIMEBOUND,
+ CCoinsMap& map LIFETIMEBOUND,
+ bool will_erase) noexcept
+ : m_usage(usage), m_sentinel(sentinel), m_map(map), m_will_erase(will_erase) {}
+
+ inline CoinsCachePair* Begin() const noexcept { return m_sentinel.second.Next(); }
+ inline CoinsCachePair* End() const noexcept { return &m_sentinel; }
+
+ //! Return the next entry after current, possibly erasing current
+ inline CoinsCachePair* NextAndMaybeErase(CoinsCachePair& current) noexcept
+ {
+ const auto next_entry{current.second.Next()};
+ // If we are not going to erase the cache, we must still erase spent entries.
+ // Otherwise clear the flags on the entry.
+ if (!m_will_erase) {
+ if (current.second.coin.IsSpent()) {
+ m_usage -= current.second.coin.DynamicMemoryUsage();
+ m_map.erase(current.first);
+ } else {
+ current.second.ClearFlags();
+ }
+ }
+ return next_entry;
+ }
+
+ inline bool WillErase(CoinsCachePair& current) const noexcept { return m_will_erase || current.second.coin.IsSpent(); }
+private:
+ size_t& m_usage;
+ CoinsCachePair& m_sentinel;
+ CCoinsMap& m_map;
+ bool m_will_erase;
+};
+
/** Abstract view on the open txout dataset. */
class CCoinsView
{
@@ -191,14 +322,14 @@ public:
virtual std::vector<uint256> GetHeadBlocks() const;
//! Do a bulk modification (multiple Coin changes + BestBlock change).
- //! The passed mapCoins can be modified.
- virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase = true);
+ //! The passed cursor is used to iterate through the coins.
+ virtual bool BatchWrite(CoinsViewCacheCursor& cursor, const uint256& hashBlock);
//! Get a cursor to iterate over the whole state
virtual std::unique_ptr<CCoinsViewCursor> Cursor() const;
//! As we use CCoinsViews polymorphically, have a virtual destructor
- virtual ~CCoinsView() {}
+ virtual ~CCoinsView() = default;
//! Estimate database size (0 if not implemented)
virtual size_t EstimateSize() const { return 0; }
@@ -218,7 +349,7 @@ public:
uint256 GetBestBlock() const override;
std::vector<uint256> GetHeadBlocks() const override;
void SetBackend(CCoinsView &viewIn);
- bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase = true) override;
+ bool BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlock) override;
std::unique_ptr<CCoinsViewCursor> Cursor() const override;
size_t EstimateSize() const override;
};
@@ -237,6 +368,8 @@ protected:
*/
mutable uint256 hashBlock;
mutable CCoinsMapMemoryResource m_cache_coins_memory_resource{};
+ /* The starting sentinel of the flagged entry circular doubly linked list. */
+ mutable CoinsCachePair m_sentinel;
mutable CCoinsMap cacheCoins;
/* Cached dynamic memory usage for the inner Coin objects. */
@@ -255,7 +388,7 @@ public:
bool HaveCoin(const COutPoint &outpoint) const override;
uint256 GetBestBlock() const override;
void SetBestBlock(const uint256 &hashBlock);
- bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase = true) override;
+ bool BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlock) override;
std::unique_ptr<CCoinsViewCursor> Cursor() const override {
throw std::logic_error("CCoinsViewCache cursor iteration not supported.");
}
diff --git a/src/common/args.cpp b/src/common/args.cpp
index caff36fdb3..f59d2b8f0f 100644
--- a/src/common/args.cpp
+++ b/src/common/args.cpp
@@ -16,6 +16,7 @@
#include <util/fs.h>
#include <util/fs_helpers.h>
#include <util/strencodings.h>
+#include <util/string.h>
#ifdef WIN32
#include <codecvt> /* for codecvt_utf8_utf16 */
@@ -159,6 +160,7 @@ std::list<SectionInfo> ArgsManager::GetUnrecognizedSections() const
ChainTypeToString(ChainType::REGTEST),
ChainTypeToString(ChainType::SIGNET),
ChainTypeToString(ChainType::TESTNET),
+ ChainTypeToString(ChainType::TESTNET4),
ChainTypeToString(ChainType::MAIN),
};
@@ -587,6 +589,23 @@ void ArgsManager::AddHiddenArgs(const std::vector<std::string>& names)
}
}
+void ArgsManager::CheckMultipleCLIArgs() const
+{
+ LOCK(cs_args);
+ std::vector<std::string> found{};
+ auto cmds = m_available_args.find(OptionsCategory::CLI_COMMANDS);
+ if (cmds != m_available_args.end()) {
+ for (const auto& [cmd, argspec] : cmds->second) {
+ if (IsArgSet(cmd)) {
+ found.push_back(cmd);
+ }
+ }
+ if (found.size() > 1) {
+ throw std::runtime_error(strprintf("Only one of %s may be specified.", util::Join(found, ", ")));
+ }
+ }
+}
+
std::string ArgsManager::GetHelpMessage() const
{
const bool show_debug = GetBoolArg("-help-debug", false);
@@ -616,6 +635,9 @@ std::string ArgsManager::GetHelpMessage() const
case OptionsCategory::RPC:
usage += HelpMessageGroup("RPC server options:");
break;
+ case OptionsCategory::IPC:
+ usage += HelpMessageGroup("IPC interprocess connection options:");
+ break;
case OptionsCategory::WALLET:
usage += HelpMessageGroup("Wallet options:");
break;
@@ -634,6 +656,9 @@ std::string ArgsManager::GetHelpMessage() const
case OptionsCategory::REGISTER_COMMANDS:
usage += HelpMessageGroup("Register Commands:");
break;
+ case OptionsCategory::CLI_COMMANDS:
+ usage += HelpMessageGroup("CLI Commands:");
+ break;
default:
break;
}
@@ -773,10 +798,11 @@ std::variant<ChainType, std::string> ArgsManager::GetChainArg() const
const bool fRegTest = get_net("-regtest");
const bool fSigNet = get_net("-signet");
const bool fTestNet = get_net("-testnet");
+ const bool fTestNet4 = get_net("-testnet4");
const auto chain_arg = GetArg("-chain");
- if ((int)chain_arg.has_value() + (int)fRegTest + (int)fSigNet + (int)fTestNet > 1) {
- throw std::runtime_error("Invalid combination of -regtest, -signet, -testnet and -chain. Can use at most one.");
+ if ((int)chain_arg.has_value() + (int)fRegTest + (int)fSigNet + (int)fTestNet + (int)fTestNet4 > 1) {
+ throw std::runtime_error("Invalid combination of -regtest, -signet, -testnet, -testnet4 and -chain. Can use at most one.");
}
if (chain_arg) {
if (auto parsed = ChainTypeFromString(*chain_arg)) return *parsed;
@@ -786,6 +812,7 @@ std::variant<ChainType, std::string> ArgsManager::GetChainArg() const
if (fRegTest) return ChainType::REGTEST;
if (fSigNet) return ChainType::SIGNET;
if (fTestNet) return ChainType::TESTNET;
+ if (fTestNet4) return ChainType::TESTNET4;
return ChainType::MAIN;
}
diff --git a/src/common/args.h b/src/common/args.h
index 78a61313b9..8d9daf5f65 100644
--- a/src/common/args.h
+++ b/src/common/args.h
@@ -63,6 +63,8 @@ enum class OptionsCategory {
GUI,
COMMANDS,
REGISTER_COMMANDS,
+ CLI_COMMANDS,
+ IPC,
HIDDEN // Always the last option to avoid printing these in the help
};
@@ -364,6 +366,13 @@ protected:
}
/**
+ * Check CLI command args
+ *
+ * @throws std::runtime_error when multiple CLI_COMMAND arguments are specified
+ */
+ void CheckMultipleCLIArgs() const;
+
+ /**
* Get the help string
*/
std::string GetHelpMessage() const;
@@ -423,7 +432,7 @@ private:
fs::path GetDataDir(bool net_specific) const;
/**
- * Return -regtest/-signet/-testnet/-chain= setting as a ChainType enum if a
+ * Return -regtest/-signet/-testnet/-testnet4/-chain= setting as a ChainType enum if a
* recognized chain type was set, or as a string if an unrecognized chain
* name was set. Raise an exception if an invalid combination of flags was
* provided.
diff --git a/src/common/bloom.cpp b/src/common/bloom.cpp
index ca6af90b76..076ee40635 100644
--- a/src/common/bloom.cpp
+++ b/src/common/bloom.cpp
@@ -239,7 +239,7 @@ bool CRollingBloomFilter::contains(Span<const unsigned char> vKey) const
void CRollingBloomFilter::reset()
{
- nTweak = GetRand<unsigned int>();
+ nTweak = FastRandomContext().rand<unsigned int>();
nEntriesThisGeneration = 0;
nGeneration = 1;
std::fill(data.begin(), data.end(), 0);
diff --git a/src/common/messages.cpp b/src/common/messages.cpp
index 9e88ca8b0f..5fe3e9e4d8 100644
--- a/src/common/messages.cpp
+++ b/src/common/messages.cpp
@@ -53,6 +53,34 @@ const std::vector<std::pair<std::string, FeeEstimateMode>>& FeeModeMap()
return FEE_MODES;
}
+std::string FeeModeInfo(const std::pair<std::string, FeeEstimateMode>& mode, std::string& default_info)
+{
+ switch (mode.second) {
+ case FeeEstimateMode::UNSET:
+ return strprintf("%s means no mode set (%s). \n", mode.first, default_info);
+ case FeeEstimateMode::ECONOMICAL:
+ return strprintf("%s estimates use a shorter time horizon, making them more\n"
+ "responsive to short-term drops in the prevailing fee market. This mode\n"
+ "potentially returns a lower fee rate estimate.\n", mode.first);
+ case FeeEstimateMode::CONSERVATIVE:
+ return strprintf("%s estimates use a longer time horizon, making them\n"
+ "less responsive to short-term drops in the prevailing fee market. This mode\n"
+ "potentially returns a higher fee rate estimate.\n", mode.first);
+ default:
+ // Other modes apart from the ones handled are fee rate units; they should not be clarified.
+ assert(false);
+ }
+}
+
+std::string FeeModesDetail(std::string default_info)
+{
+ std::string info;
+ for (const auto& fee_mode : FeeModeMap()) {
+ info += FeeModeInfo(fee_mode, default_info);
+ }
+ return strprintf("%s \n%s", FeeModes(", "), info);
+}
+
std::string FeeModes(const std::string& delimiter)
{
return Join(FeeModeMap(), delimiter, [&](const std::pair<std::string, FeeEstimateMode>& i) { return i.first; });
@@ -100,8 +128,8 @@ bilingual_str TransactionErrorString(const TransactionError err)
return Untranslated("No error");
case TransactionError::MISSING_INPUTS:
return Untranslated("Inputs missing or spent");
- case TransactionError::ALREADY_IN_CHAIN:
- return Untranslated("Transaction already in block chain");
+ case TransactionError::ALREADY_IN_UTXO_SET:
+ return Untranslated("Transaction outputs already in utxo set");
case TransactionError::MEMPOOL_REJECTED:
return Untranslated("Transaction rejected by mempool");
case TransactionError::MEMPOOL_ERROR:
diff --git a/src/common/messages.h b/src/common/messages.h
index 68e7bb2169..5827fccee0 100644
--- a/src/common/messages.h
+++ b/src/common/messages.h
@@ -26,6 +26,8 @@ enum class PSBTError;
bool FeeModeFromString(const std::string& mode_string, FeeEstimateMode& fee_estimate_mode);
std::string StringForFeeReason(FeeReason reason);
std::string FeeModes(const std::string& delimiter);
+std::string FeeModeInfo(std::pair<std::string, FeeEstimateMode>& mode);
+std::string FeeModesDetail(std::string default_info);
std::string InvalidEstimateModeErrorMessage();
bilingual_str PSBTErrorString(PSBTError error);
bilingual_str TransactionErrorString(const node::TransactionError error);
diff --git a/src/common/netif.cpp b/src/common/netif.cpp
new file mode 100644
index 0000000000..d75123b265
--- /dev/null
+++ b/src/common/netif.cpp
@@ -0,0 +1,303 @@
+// Copyright (c) 2024 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 <config/bitcoin-config.h> // IWYU pragma: keep
+
+#include <common/netif.h>
+
+#include <logging.h>
+#include <netbase.h>
+#include <util/check.h>
+#include <util/sock.h>
+#include <util/syserror.h>
+
+#if defined(__linux__)
+#include <linux/rtnetlink.h>
+#elif defined(__FreeBSD__)
+#include <osreldate.h>
+#if __FreeBSD_version >= 1400000
+// Workaround https://github.com/freebsd/freebsd-src/pull/1070.
+#define typeof __typeof
+#include <netlink/netlink.h>
+#include <netlink/netlink_route.h>
+#endif
+#elif defined(WIN32)
+#include <iphlpapi.h>
+#elif defined(__APPLE__)
+#include <net/route.h>
+#include <sys/sysctl.h>
+#endif
+
+namespace {
+
+// Linux and FreeBSD 14.0+. For FreeBSD 13.2 the code can be compiled but
+// running it requires loading a special kernel module, otherwise socket(AF_NETLINK,...)
+// will fail, so we skip that.
+#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 1400000)
+
+std::optional<CNetAddr> QueryDefaultGatewayImpl(sa_family_t family)
+{
+ // Create a netlink socket.
+ auto sock{CreateSock(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)};
+ if (!sock) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "socket(AF_NETLINK): %s\n", NetworkErrorString(errno));
+ return std::nullopt;
+ }
+
+ // Send request.
+ struct {
+ nlmsghdr hdr; ///< Request header.
+ rtmsg data; ///< Request data, a "route message".
+ nlattr dst_hdr; ///< One attribute, conveying the route destination address.
+ char dst_data[16]; ///< Route destination address. To query the default route we use 0.0.0.0/0 or [::]/0. For IPv4 the first 4 bytes are used.
+ } request{};
+
+ // Whether to use the first 4 or 16 bytes from request.dst_data.
+ const size_t dst_data_len = family == AF_INET ? 4 : 16;
+
+ request.hdr.nlmsg_type = RTM_GETROUTE;
+ request.hdr.nlmsg_flags = NLM_F_REQUEST;
+#ifdef __linux__
+ // Linux IPv4 / IPv6 - this must be present, otherwise no gateway is found
+ // FreeBSD IPv4 - does not matter, the gateway is found with or without this
+ // FreeBSD IPv6 - this must be absent, otherwise no gateway is found
+ request.hdr.nlmsg_flags |= NLM_F_DUMP;
+#endif
+ request.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(rtmsg) + sizeof(nlattr) + dst_data_len);
+ request.hdr.nlmsg_seq = 0; // Sequence number, used to match which reply is to which request. Irrelevant for us because we send just one request.
+ request.data.rtm_family = family;
+ request.data.rtm_dst_len = 0; // Prefix length.
+#ifdef __FreeBSD__
+ // Linux IPv4 / IPv6 this must be absent, otherwise no gateway is found
+ // FreeBSD IPv4 - does not matter, the gateway is found with or without this
+ // FreeBSD IPv6 - this must be present, otherwise no gateway is found
+ request.data.rtm_flags = RTM_F_PREFIX;
+#endif
+ request.dst_hdr.nla_type = RTA_DST;
+ request.dst_hdr.nla_len = sizeof(nlattr) + dst_data_len;
+
+ if (sock->Send(&request, request.hdr.nlmsg_len, 0) != static_cast<ssize_t>(request.hdr.nlmsg_len)) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "send() to netlink socket: %s\n", NetworkErrorString(errno));
+ return std::nullopt;
+ }
+
+ // Receive response.
+ char response[4096];
+ int64_t recv_result;
+ do {
+ recv_result = sock->Recv(response, sizeof(response), 0);
+ } while (recv_result < 0 && (errno == EINTR || errno == EAGAIN));
+ if (recv_result < 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "recv() from netlink socket: %s\n", NetworkErrorString(errno));
+ return std::nullopt;
+ }
+
+ for (nlmsghdr* hdr = (nlmsghdr*)response; NLMSG_OK(hdr, recv_result); hdr = NLMSG_NEXT(hdr, recv_result)) {
+ rtmsg* r = (rtmsg*)NLMSG_DATA(hdr);
+ int remaining_len = RTM_PAYLOAD(hdr);
+
+ // Iterate over the attributes.
+ rtattr *rta_gateway = nullptr;
+ int scope_id = 0;
+ for (rtattr* attr = RTM_RTA(r); RTA_OK(attr, remaining_len); attr = RTA_NEXT(attr, remaining_len)) {
+ if (attr->rta_type == RTA_GATEWAY) {
+ rta_gateway = attr;
+ } else if (attr->rta_type == RTA_OIF && sizeof(int) == RTA_PAYLOAD(attr)) {
+ std::memcpy(&scope_id, RTA_DATA(attr), sizeof(scope_id));
+ }
+ }
+
+ // Found gateway?
+ if (rta_gateway != nullptr) {
+ if (family == AF_INET && sizeof(in_addr) == RTA_PAYLOAD(rta_gateway)) {
+ in_addr gw;
+ std::memcpy(&gw, RTA_DATA(rta_gateway), sizeof(gw));
+ return CNetAddr(gw);
+ } else if (family == AF_INET6 && sizeof(in6_addr) == RTA_PAYLOAD(rta_gateway)) {
+ in6_addr gw;
+ std::memcpy(&gw, RTA_DATA(rta_gateway), sizeof(gw));
+ return CNetAddr(gw, scope_id);
+ }
+ }
+ }
+
+ return std::nullopt;
+}
+
+#elif defined(WIN32)
+
+std::optional<CNetAddr> QueryDefaultGatewayImpl(sa_family_t family)
+{
+ NET_LUID interface_luid = {};
+ SOCKADDR_INET destination_address = {};
+ MIB_IPFORWARD_ROW2 best_route = {};
+ SOCKADDR_INET best_source_address = {};
+ DWORD best_if_idx = 0;
+ DWORD status = 0;
+
+ // Pass empty destination address of the requested type (:: or 0.0.0.0) to get interface of default route.
+ destination_address.si_family = family;
+ status = GetBestInterfaceEx((sockaddr*)&destination_address, &best_if_idx);
+ if (status != NO_ERROR) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "Could not get best interface for default route: %s\n", NetworkErrorString(status));
+ return std::nullopt;
+ }
+
+ // Get best route to default gateway.
+ // Leave interface_luid at all-zeros to use interface index instead.
+ status = GetBestRoute2(&interface_luid, best_if_idx, nullptr, &destination_address, 0, &best_route, &best_source_address);
+ if (status != NO_ERROR) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "Could not get best route for default route for interface index %d: %s\n",
+ best_if_idx, NetworkErrorString(status));
+ return std::nullopt;
+ }
+
+ Assume(best_route.NextHop.si_family == family);
+ if (family == AF_INET) {
+ return CNetAddr(best_route.NextHop.Ipv4.sin_addr);
+ } else if(family == AF_INET6) {
+ return CNetAddr(best_route.NextHop.Ipv6.sin6_addr, best_route.InterfaceIndex);
+ }
+ return std::nullopt;
+}
+
+#elif defined(__APPLE__)
+
+#define ROUNDUP32(a) \
+ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(uint32_t) - 1))) : sizeof(uint32_t))
+
+std::optional<CNetAddr> FromSockAddr(const struct sockaddr* addr)
+{
+ // Check valid length. Note that sa_len is not part of POSIX, and exists on MacOS and some BSDs only, so we can't
+ // do this check in SetSockAddr.
+ if (!(addr->sa_family == AF_INET && addr->sa_len == sizeof(struct sockaddr_in)) &&
+ !(addr->sa_family == AF_INET6 && addr->sa_len == sizeof(struct sockaddr_in6))) {
+ return std::nullopt;
+ }
+
+ // Fill in a CService from the sockaddr, then drop the port part.
+ CService service;
+ if (service.SetSockAddr(addr)) {
+ return (CNetAddr)service;
+ }
+ return std::nullopt;
+}
+
+//! MacOS: Get default gateway from route table. See route(4) for the format.
+std::optional<CNetAddr> QueryDefaultGatewayImpl(sa_family_t family)
+{
+ // net.route.0.inet[6].flags.gateway
+ int mib[] = {CTL_NET, PF_ROUTE, 0, family, NET_RT_FLAGS, RTF_GATEWAY};
+ // The size of the available data is determined by calling sysctl() with oldp=nullptr. See sysctl(3).
+ size_t l = 0;
+ if (sysctl(/*name=*/mib, /*namelen=*/sizeof(mib) / sizeof(int), /*oldp=*/nullptr, /*oldlenp=*/&l, /*newp=*/nullptr, /*newlen=*/0) < 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "Could not get sysctl length of routing table: %s\n", SysErrorString(errno));
+ return std::nullopt;
+ }
+ std::vector<std::byte> buf(l);
+ if (sysctl(/*name=*/mib, /*namelen=*/sizeof(mib) / sizeof(int), /*oldp=*/buf.data(), /*oldlenp=*/&l, /*newp=*/nullptr, /*newlen=*/0) < 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "Could not get sysctl data of routing table: %s\n", SysErrorString(errno));
+ return std::nullopt;
+ }
+ // Iterate over messages (each message is a routing table entry).
+ for (size_t msg_pos = 0; msg_pos < buf.size(); ) {
+ if ((msg_pos + sizeof(rt_msghdr)) > buf.size()) return std::nullopt;
+ const struct rt_msghdr* rt = (const struct rt_msghdr*)(buf.data() + msg_pos);
+ const size_t next_msg_pos = msg_pos + rt->rtm_msglen;
+ if (rt->rtm_msglen < sizeof(rt_msghdr) || next_msg_pos > buf.size()) return std::nullopt;
+ // Iterate over addresses within message, get destination and gateway (if present).
+ // Address data starts after header.
+ size_t sa_pos = msg_pos + sizeof(struct rt_msghdr);
+ std::optional<CNetAddr> dst, gateway;
+ for (int i = 0; i < RTAX_MAX; i++) {
+ if (rt->rtm_addrs & (1 << i)) {
+ // 2 is just sa_len + sa_family, the theoretical minimum size of a socket address.
+ if ((sa_pos + 2) > next_msg_pos) return std::nullopt;
+ const struct sockaddr* sa = (const struct sockaddr*)(buf.data() + sa_pos);
+ if ((sa_pos + sa->sa_len) > next_msg_pos) return std::nullopt;
+ if (i == RTAX_DST) {
+ dst = FromSockAddr(sa);
+ } else if (i == RTAX_GATEWAY) {
+ gateway = FromSockAddr(sa);
+ }
+ // Skip sockaddr entries for bit flags we're not interested in,
+ // move cursor.
+ sa_pos += ROUNDUP32(sa->sa_len);
+ }
+ }
+ // Found default gateway?
+ if (dst && gateway && dst->IsBindAny()) { // Route to 0.0.0.0 or :: ?
+ return *gateway;
+ }
+ // Skip to next message.
+ msg_pos = next_msg_pos;
+ }
+ return std::nullopt;
+}
+
+#else
+
+// Dummy implementation.
+std::optional<CNetAddr> QueryDefaultGatewayImpl(sa_family_t)
+{
+ return std::nullopt;
+}
+
+#endif
+
+}
+
+std::optional<CNetAddr> QueryDefaultGateway(Network network)
+{
+ Assume(network == NET_IPV4 || network == NET_IPV6);
+
+ sa_family_t family;
+ if (network == NET_IPV4) {
+ family = AF_INET;
+ } else if(network == NET_IPV6) {
+ family = AF_INET6;
+ } else {
+ return std::nullopt;
+ }
+
+ std::optional<CNetAddr> ret = QueryDefaultGatewayImpl(family);
+
+ // It's possible for the default gateway to be 0.0.0.0 or ::0 on at least Windows
+ // for some routing strategies. If so, return as if no default gateway was found.
+ if (ret && !ret->IsBindAny()) {
+ return ret;
+ } else {
+ return std::nullopt;
+ }
+}
+
+std::vector<CNetAddr> GetLocalAddresses()
+{
+ std::vector<CNetAddr> addresses;
+#ifdef WIN32
+ char pszHostName[256] = "";
+ if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR) {
+ addresses = LookupHost(pszHostName, 0, true);
+ }
+#elif (HAVE_DECL_GETIFADDRS && HAVE_DECL_FREEIFADDRS)
+ struct ifaddrs* myaddrs;
+ if (getifaddrs(&myaddrs) == 0) {
+ for (struct ifaddrs* ifa = myaddrs; ifa != nullptr; ifa = ifa->ifa_next)
+ {
+ if (ifa->ifa_addr == nullptr) continue;
+ if ((ifa->ifa_flags & IFF_UP) == 0) continue;
+ if ((ifa->ifa_flags & IFF_LOOPBACK) != 0) continue;
+ if (ifa->ifa_addr->sa_family == AF_INET) {
+ struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr);
+ addresses.emplace_back(s4->sin_addr);
+ } else if (ifa->ifa_addr->sa_family == AF_INET6) {
+ struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr);
+ addresses.emplace_back(s6->sin6_addr);
+ }
+ }
+ freeifaddrs(myaddrs);
+ }
+#endif
+ return addresses;
+}
diff --git a/src/common/netif.h b/src/common/netif.h
new file mode 100644
index 0000000000..55bc023be6
--- /dev/null
+++ b/src/common/netif.h
@@ -0,0 +1,19 @@
+// Copyright (c) 2024 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_COMMON_NETIF_H
+#define BITCOIN_COMMON_NETIF_H
+
+#include <netaddress.h>
+
+#include <optional>
+
+//! Query the OS for the default gateway for `network`. This only makes sense for NET_IPV4 and NET_IPV6.
+//! Returns std::nullopt if it cannot be found, or there is no support for this OS.
+std::optional<CNetAddr> QueryDefaultGateway(Network network);
+
+//! Return all local non-loopback IPv4 and IPv6 network addresses.
+std::vector<CNetAddr> GetLocalAddresses();
+
+#endif // BITCOIN_COMMON_NETIF_H
diff --git a/src/common/pcp.cpp b/src/common/pcp.cpp
new file mode 100644
index 0000000000..3cc1cba924
--- /dev/null
+++ b/src/common/pcp.cpp
@@ -0,0 +1,524 @@
+// Copyright (c) 2024 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 <common/pcp.h>
+
+#include <common/netif.h>
+#include <crypto/common.h>
+#include <logging.h>
+#include <netaddress.h>
+#include <netbase.h>
+#include <random.h>
+#include <span.h>
+#include <util/check.h>
+#include <util/readwritefile.h>
+#include <util/sock.h>
+#include <util/strencodings.h>
+
+namespace {
+
+// RFC6886 NAT-PMP and RFC6887 Port Control Protocol (PCP) implementation.
+// NAT-PMP and PCP use network byte order (big-endian).
+
+// NAT-PMP (v0) protocol constants.
+//! NAT-PMP uses a fixed server port number (RFC6887 section 1.1).
+constexpr uint16_t NATPMP_SERVER_PORT = 5351;
+//! Version byte for NATPMP (RFC6886 1.1)
+constexpr uint8_t NATPMP_VERSION = 0;
+//! Request opcode base (RFC6886 3).
+constexpr uint8_t NATPMP_REQUEST = 0x00;
+//! Response opcode base (RFC6886 3).
+constexpr uint8_t NATPMP_RESPONSE = 0x80;
+//! Get external address (RFC6886 3.2)
+constexpr uint8_t NATPMP_OP_GETEXTERNAL = 0x00;
+//! Map TCP port (RFC6886 3.3)
+constexpr uint8_t NATPMP_OP_MAP_TCP = 0x02;
+//! Shared request header size in bytes.
+constexpr size_t NATPMP_REQUEST_HDR_SIZE = 2;
+//! Shared response header (minimum) size in bytes.
+constexpr size_t NATPMP_RESPONSE_HDR_SIZE = 8;
+//! GETEXTERNAL request size in bytes, including header (RFC6886 3.2).
+constexpr size_t NATPMP_GETEXTERNAL_REQUEST_SIZE = NATPMP_REQUEST_HDR_SIZE + 0;
+//! GETEXTERNAL response size in bytes, including header (RFC6886 3.2).
+constexpr size_t NATPMP_GETEXTERNAL_RESPONSE_SIZE = NATPMP_RESPONSE_HDR_SIZE + 4;
+//! MAP request size in bytes, including header (RFC6886 3.3).
+constexpr size_t NATPMP_MAP_REQUEST_SIZE = NATPMP_REQUEST_HDR_SIZE + 10;
+//! MAP response size in bytes, including header (RFC6886 3.3).
+constexpr size_t NATPMP_MAP_RESPONSE_SIZE = NATPMP_RESPONSE_HDR_SIZE + 8;
+
+// Shared header offsets (RFC6886 3.2, 3.3), relative to start of packet.
+//! Offset of version field in packets.
+constexpr size_t NATPMP_HDR_VERSION_OFS = 0;
+//! Offset of opcode field in packets
+constexpr size_t NATPMP_HDR_OP_OFS = 1;
+//! Offset of result code in packets. Result codes are 16 bit in NAT-PMP instead of 8 bit in PCP.
+constexpr size_t NATPMP_RESPONSE_HDR_RESULT_OFS = 2;
+
+// GETEXTERNAL response offsets (RFC6886 3.2), relative to start of packet.
+//! Returned external address
+constexpr size_t NATPMP_GETEXTERNAL_RESPONSE_IP_OFS = 8;
+
+// MAP request offsets (RFC6886 3.3), relative to start of packet.
+//! Internal port to be mapped.
+constexpr size_t NATPMP_MAP_REQUEST_INTERNAL_PORT_OFS = 4;
+//! Suggested external port for mapping.
+constexpr size_t NATPMP_MAP_REQUEST_EXTERNAL_PORT_OFS = 6;
+//! Requested port mapping lifetime in seconds.
+constexpr size_t NATPMP_MAP_REQUEST_LIFETIME_OFS = 8;
+
+// MAP response offsets (RFC6886 3.3), relative to start of packet.
+//! Internal port for mapping (will match internal port of request).
+constexpr size_t NATPMP_MAP_RESPONSE_INTERNAL_PORT_OFS = 8;
+//! External port for mapping.
+constexpr size_t NATPMP_MAP_RESPONSE_EXTERNAL_PORT_OFS = 10;
+//! Created port mapping lifetime in seconds.
+constexpr size_t NATPMP_MAP_RESPONSE_LIFETIME_OFS = 12;
+
+// Relevant NETPMP result codes (RFC6886 3.5).
+//! Result code representing success status.
+constexpr uint8_t NATPMP_RESULT_SUCCESS = 0;
+//! Result code representing unsupported version.
+constexpr uint8_t NATPMP_RESULT_UNSUPP_VERSION = 1;
+//! Result code representing lack of resources.
+constexpr uint8_t NATPMP_RESULT_NO_RESOURCES = 4;
+
+//! Mapping of NATPMP result code to string (RFC6886 3.5). Result codes <=2 match PCP.
+const std::map<uint8_t, std::string> NATPMP_RESULT_STR{
+ {0, "SUCCESS"},
+ {1, "UNSUPP_VERSION"},
+ {2, "NOT_AUTHORIZED"},
+ {3, "NETWORK_FAILURE"},
+ {4, "NO_RESOURCES"},
+ {5, "UNSUPP_OPCODE"},
+};
+
+// PCP (v2) protocol constants.
+//! Maximum packet size in bytes (RFC6887 section 7).
+constexpr size_t PCP_MAX_SIZE = 1100;
+//! PCP uses a fixed server port number (RFC6887 section 19.1). Shared with NAT-PMP.
+constexpr uint16_t PCP_SERVER_PORT = NATPMP_SERVER_PORT;
+//! Version byte. 0 is NAT-PMP (RFC6886), 1 is forbidden, 2 for PCP (RFC6887).
+constexpr uint8_t PCP_VERSION = 2;
+//! PCP Request Header. See RFC6887 section 7.1. Shared with NAT-PMP.
+constexpr uint8_t PCP_REQUEST = NATPMP_REQUEST; // R = 0
+//! PCP Response Header. See RFC6887 section 7.2. Shared with NAT-PMP.
+constexpr uint8_t PCP_RESPONSE = NATPMP_RESPONSE; // R = 1
+//! Map opcode. See RFC6887 section 19.2
+constexpr uint8_t PCP_OP_MAP = 0x01;
+//! TCP protocol number (IANA).
+constexpr uint16_t PCP_PROTOCOL_TCP = 6;
+//! Request and response header size in bytes (RFC6887 section 7.1).
+constexpr size_t PCP_HDR_SIZE = 24;
+//! Map request and response size in bytes (RFC6887 section 11.1).
+constexpr size_t PCP_MAP_SIZE = 36;
+
+// Header offsets shared between request and responses (RFC6887 7.1, 7.2), relative to start of packet.
+//! Version field (1 byte).
+constexpr size_t PCP_HDR_VERSION_OFS = NATPMP_HDR_VERSION_OFS;
+//! Opcode field (1 byte).
+constexpr size_t PCP_HDR_OP_OFS = NATPMP_HDR_OP_OFS;
+//! Requested lifetime (request), granted lifetime (response) (4 bytes).
+constexpr size_t PCP_HDR_LIFETIME_OFS = 4;
+
+// Request header offsets (RFC6887 7.1), relative to start of packet.
+//! PCP client's IP address (16 bytes).
+constexpr size_t PCP_REQUEST_HDR_IP_OFS = 8;
+
+// Response header offsets (RFC6887 7.2), relative to start of packet.
+//! Result code (1 byte).
+constexpr size_t PCP_RESPONSE_HDR_RESULT_OFS = 3;
+
+// MAP request/response offsets (RFC6887 11.1), relative to start of opcode-specific data.
+//! Mapping nonce (12 bytes).
+constexpr size_t PCP_MAP_NONCE_OFS = 0;
+//! Protocol (1 byte).
+constexpr size_t PCP_MAP_PROTOCOL_OFS = 12;
+//! Internal port for mapping (2 bytes).
+constexpr size_t PCP_MAP_INTERNAL_PORT_OFS = 16;
+//! Suggested external port (request), assigned external port (response) (2 bytes).
+constexpr size_t PCP_MAP_EXTERNAL_PORT_OFS = 18;
+//! Suggested external IP (request), assigned external IP (response) (16 bytes).
+constexpr size_t PCP_MAP_EXTERNAL_IP_OFS = 20;
+
+//! Result code representing success (RFC6887 7.4), shared with NAT-PMP.
+constexpr uint8_t PCP_RESULT_SUCCESS = NATPMP_RESULT_SUCCESS;
+//! Result code representing lack of resources (RFC6887 7.4).
+constexpr uint8_t PCP_RESULT_NO_RESOURCES = 8;
+
+//! Mapping of PCP result code to string (RFC6887 7.4). Result codes <=2 match NAT-PMP.
+const std::map<uint8_t, std::string> PCP_RESULT_STR{
+ {0, "SUCCESS"},
+ {1, "UNSUPP_VERSION"},
+ {2, "NOT_AUTHORIZED"},
+ {3, "MALFORMED_REQUEST"},
+ {4, "UNSUPP_OPCODE"},
+ {5, "UNSUPP_OPTION"},
+ {6, "MALFORMED_OPTION"},
+ {7, "NETWORK_FAILURE"},
+ {8, "NO_RESOURCES"},
+ {9, "UNSUPP_PROTOCOL"},
+ {10, "USER_EX_QUOTA"},
+ {11, "CANNOT_PROVIDE_EXTERNAL"},
+ {12, "ADDRESS_MISMATCH"},
+ {13, "EXCESSIVE_REMOTE_PEER"},
+};
+
+//! Return human-readable string from NATPMP result code.
+std::string NATPMPResultString(uint8_t result_code)
+{
+ auto result_i = NATPMP_RESULT_STR.find(result_code);
+ return strprintf("%s (code %d)", result_i == NATPMP_RESULT_STR.end() ? "(unknown)" : result_i->second, result_code);
+}
+
+//! Return human-readable string from PCP result code.
+std::string PCPResultString(uint8_t result_code)
+{
+ auto result_i = PCP_RESULT_STR.find(result_code);
+ return strprintf("%s (code %d)", result_i == PCP_RESULT_STR.end() ? "(unknown)" : result_i->second, result_code);
+}
+
+//! Wrap address in IPv6 according to RFC6887. wrapped_addr needs to be able to store 16 bytes.
+[[nodiscard]] bool PCPWrapAddress(Span<uint8_t> wrapped_addr, const CNetAddr &addr)
+{
+ Assume(wrapped_addr.size() == ADDR_IPV6_SIZE);
+ if (addr.IsIPv4()) {
+ struct in_addr addr4;
+ if (!addr.GetInAddr(&addr4)) return false;
+ // Section 5: "When the address field holds an IPv4 address, an IPv4-mapped IPv6 address [RFC4291] is used (::ffff:0:0/96)."
+ std::memcpy(wrapped_addr.data(), IPV4_IN_IPV6_PREFIX.data(), IPV4_IN_IPV6_PREFIX.size());
+ std::memcpy(wrapped_addr.data() + IPV4_IN_IPV6_PREFIX.size(), &addr4, ADDR_IPV4_SIZE);
+ return true;
+ } else if (addr.IsIPv6()) {
+ struct in6_addr addr6;
+ if (!addr.GetIn6Addr(&addr6)) return false;
+ std::memcpy(wrapped_addr.data(), &addr6, ADDR_IPV6_SIZE);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+//! Unwrap PCP-encoded address according to RFC6887.
+CNetAddr PCPUnwrapAddress(Span<const uint8_t> wrapped_addr)
+{
+ Assume(wrapped_addr.size() == ADDR_IPV6_SIZE);
+ if (util::HasPrefix(wrapped_addr, IPV4_IN_IPV6_PREFIX)) {
+ struct in_addr addr4;
+ std::memcpy(&addr4, wrapped_addr.data() + IPV4_IN_IPV6_PREFIX.size(), ADDR_IPV4_SIZE);
+ return CNetAddr(addr4);
+ } else {
+ struct in6_addr addr6;
+ std::memcpy(&addr6, wrapped_addr.data(), ADDR_IPV6_SIZE);
+ return CNetAddr(addr6);
+ }
+}
+
+//! PCP or NAT-PMP send-receive loop.
+std::optional<std::vector<uint8_t>> PCPSendRecv(Sock &sock, const std::string &protocol, Span<const uint8_t> request, int num_tries,
+ std::chrono::milliseconds timeout_per_try,
+ std::function<bool(Span<const uint8_t>)> check_packet)
+{
+ using namespace std::chrono;
+ // UDP is a potentially lossy protocol, so we try to send again a few times.
+ uint8_t response[PCP_MAX_SIZE];
+ bool got_response = false;
+ int recvsz = 0;
+ for (int ntry = 0; !got_response && ntry < num_tries; ++ntry) {
+ if (ntry > 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "%s: Retrying (%d)\n", protocol, ntry);
+ }
+ // Dispatch packet to gateway.
+ if (sock.Send(request.data(), request.size(), 0) != static_cast<ssize_t>(request.size())) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "%s: Could not send request: %s\n", protocol, NetworkErrorString(WSAGetLastError()));
+ return std::nullopt; // Network-level error, probably no use retrying.
+ }
+
+ // Wait for response(s) until we get a valid response, a network error, or time out.
+ auto cur_time = time_point_cast<milliseconds>(steady_clock::now());
+ auto deadline = cur_time + timeout_per_try;
+ while ((cur_time = time_point_cast<milliseconds>(steady_clock::now())) < deadline) {
+ Sock::Event occurred = 0;
+ if (!sock.Wait(deadline - cur_time, Sock::RECV, &occurred)) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "%s: Could not wait on socket: %s\n", protocol, NetworkErrorString(WSAGetLastError()));
+ return std::nullopt; // Network-level error, probably no use retrying.
+ }
+ if (!occurred) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "%s: Timeout\n", protocol);
+ break; // Retry.
+ }
+
+ // Receive response.
+ recvsz = sock.Recv(response, sizeof(response), MSG_DONTWAIT);
+ if (recvsz < 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "%s: Could not receive response: %s\n", protocol, NetworkErrorString(WSAGetLastError()));
+ return std::nullopt; // Network-level error, probably no use retrying.
+ }
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "%s: Received response of %d bytes: %s\n", protocol, recvsz, HexStr(Span(response, recvsz)));
+
+ if (check_packet(Span<uint8_t>(response, recvsz))) {
+ got_response = true; // Got expected response, break from receive loop as well as from retry loop.
+ break;
+ }
+ }
+ }
+ if (!got_response) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "%s: Giving up after %d tries\n", protocol, num_tries);
+ return std::nullopt;
+ }
+ return std::vector<uint8_t>(response, response + recvsz);
+}
+
+}
+
+std::variant<MappingResult, MappingError> NATPMPRequestPortMap(const CNetAddr &gateway, uint16_t port, uint32_t lifetime, int num_tries, std::chrono::milliseconds timeout_per_try)
+{
+ struct sockaddr_storage dest_addr;
+ socklen_t dest_addrlen = sizeof(struct sockaddr_storage);
+
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "natpmp: Requesting port mapping port %d from gateway %s\n", port, gateway.ToStringAddr());
+
+ // Validate gateway, make sure it's IPv4. NAT-PMP does not support IPv6.
+ if (!CService(gateway, PCP_SERVER_PORT).GetSockAddr((struct sockaddr*)&dest_addr, &dest_addrlen)) return MappingError::NETWORK_ERROR;
+ if (dest_addr.ss_family != AF_INET) return MappingError::NETWORK_ERROR;
+
+ // Create IPv4 UDP socket
+ auto sock{CreateSock(AF_INET, SOCK_DGRAM, IPPROTO_UDP)};
+ if (!sock) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Could not create UDP socket: %s\n", NetworkErrorString(WSAGetLastError()));
+ return MappingError::NETWORK_ERROR;
+ }
+
+ // Associate UDP socket to gateway.
+ if (sock->Connect((struct sockaddr*)&dest_addr, dest_addrlen) != 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Could not connect to gateway: %s\n", NetworkErrorString(WSAGetLastError()));
+ return MappingError::NETWORK_ERROR;
+ }
+
+ // Use getsockname to get the address toward the default gateway (the internal address).
+ struct sockaddr_in internal;
+ socklen_t internal_addrlen = sizeof(struct sockaddr_in);
+ if (sock->GetSockName((struct sockaddr*)&internal, &internal_addrlen) != 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Could not get sock name: %s\n", NetworkErrorString(WSAGetLastError()));
+ return MappingError::NETWORK_ERROR;
+ }
+
+ // Request external IP address (RFC6886 section 3.2).
+ std::vector<uint8_t> request(NATPMP_GETEXTERNAL_REQUEST_SIZE);
+ request[NATPMP_HDR_VERSION_OFS] = NATPMP_VERSION;
+ request[NATPMP_HDR_OP_OFS] = NATPMP_REQUEST | NATPMP_OP_GETEXTERNAL;
+
+ auto recv_res = PCPSendRecv(*sock, "natpmp", request, num_tries, timeout_per_try,
+ [&](const Span<const uint8_t> response) -> bool {
+ if (response.size() < NATPMP_GETEXTERNAL_RESPONSE_SIZE) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Response too small\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ if (response[NATPMP_HDR_VERSION_OFS] != NATPMP_VERSION || response[NATPMP_HDR_OP_OFS] != (NATPMP_RESPONSE | NATPMP_OP_GETEXTERNAL)) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Response to wrong command\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ return true;
+ });
+
+ struct in_addr external_addr;
+ if (recv_res) {
+ const std::span<const uint8_t> response = *recv_res;
+
+ Assume(response.size() >= NATPMP_GETEXTERNAL_RESPONSE_SIZE);
+ uint16_t result_code = ReadBE16(response.data() + NATPMP_RESPONSE_HDR_RESULT_OFS);
+ if (result_code != NATPMP_RESULT_SUCCESS) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Getting external address failed with result %s\n", NATPMPResultString(result_code));
+ return MappingError::PROTOCOL_ERROR;
+ }
+
+ std::memcpy(&external_addr, response.data() + NATPMP_GETEXTERNAL_RESPONSE_IP_OFS, ADDR_IPV4_SIZE);
+ } else {
+ return MappingError::NETWORK_ERROR;
+ }
+
+ // Create TCP mapping request (RFC6886 section 3.3).
+ request = std::vector<uint8_t>(NATPMP_MAP_REQUEST_SIZE);
+ request[NATPMP_HDR_VERSION_OFS] = NATPMP_VERSION;
+ request[NATPMP_HDR_OP_OFS] = NATPMP_REQUEST | NATPMP_OP_MAP_TCP;
+ WriteBE16(request.data() + NATPMP_MAP_REQUEST_INTERNAL_PORT_OFS, port);
+ WriteBE16(request.data() + NATPMP_MAP_REQUEST_EXTERNAL_PORT_OFS, port);
+ WriteBE32(request.data() + NATPMP_MAP_REQUEST_LIFETIME_OFS, lifetime);
+
+ recv_res = PCPSendRecv(*sock, "natpmp", request, num_tries, timeout_per_try,
+ [&](const Span<const uint8_t> response) -> bool {
+ if (response.size() < NATPMP_MAP_RESPONSE_SIZE) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Response too small\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ if (response[0] != NATPMP_VERSION || response[1] != (NATPMP_RESPONSE | NATPMP_OP_MAP_TCP)) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Response to wrong command\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ uint16_t internal_port = ReadBE16(response.data() + NATPMP_MAP_RESPONSE_INTERNAL_PORT_OFS);
+ if (internal_port != port) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Response port doesn't match request\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ return true;
+ });
+
+ if (recv_res) {
+ const std::span<uint8_t> response = *recv_res;
+
+ Assume(response.size() >= NATPMP_MAP_RESPONSE_SIZE);
+ uint16_t result_code = ReadBE16(response.data() + NATPMP_RESPONSE_HDR_RESULT_OFS);
+ if (result_code != NATPMP_RESULT_SUCCESS) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "natpmp: Port mapping failed with result %s\n", NATPMPResultString(result_code));
+ if (result_code == NATPMP_RESULT_NO_RESOURCES) {
+ return MappingError::NO_RESOURCES;
+ }
+ return MappingError::PROTOCOL_ERROR;
+ }
+
+ uint32_t lifetime_ret = ReadBE32(response.data() + NATPMP_MAP_RESPONSE_LIFETIME_OFS);
+ uint16_t external_port = ReadBE16(response.data() + NATPMP_MAP_RESPONSE_EXTERNAL_PORT_OFS);
+ return MappingResult(NATPMP_VERSION, CService(internal.sin_addr, port), CService(external_addr, external_port), lifetime_ret);
+ } else {
+ return MappingError::NETWORK_ERROR;
+ }
+}
+
+std::variant<MappingResult, MappingError> PCPRequestPortMap(const PCPMappingNonce &nonce, const CNetAddr &gateway, const CNetAddr &bind, uint16_t port, uint32_t lifetime, int num_tries, std::chrono::milliseconds timeout_per_try)
+{
+ struct sockaddr_storage dest_addr, bind_addr;
+ socklen_t dest_addrlen = sizeof(struct sockaddr_storage), bind_addrlen = sizeof(struct sockaddr_storage);
+
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "pcp: Requesting port mapping for addr %s port %d from gateway %s\n", bind.ToStringAddr(), port, gateway.ToStringAddr());
+
+ // Validate addresses, make sure they're the same network family.
+ if (!CService(gateway, PCP_SERVER_PORT).GetSockAddr((struct sockaddr*)&dest_addr, &dest_addrlen)) return MappingError::NETWORK_ERROR;
+ if (!CService(bind, 0).GetSockAddr((struct sockaddr*)&bind_addr, &bind_addrlen)) return MappingError::NETWORK_ERROR;
+ if (dest_addr.ss_family != bind_addr.ss_family) return MappingError::NETWORK_ERROR;
+
+ // Create UDP socket (IPv4 or IPv6 based on provided gateway).
+ auto sock{CreateSock(dest_addr.ss_family, SOCK_DGRAM, IPPROTO_UDP)};
+ if (!sock) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Could not create UDP socket: %s\n", NetworkErrorString(WSAGetLastError()));
+ return MappingError::NETWORK_ERROR;
+ }
+
+ // Make sure that we send from requested destination address, anything else will be
+ // rejected by a security-conscious router.
+ if (sock->Bind((struct sockaddr*)&bind_addr, bind_addrlen) != 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Could not bind to address: %s\n", NetworkErrorString(WSAGetLastError()));
+ return MappingError::NETWORK_ERROR;
+ }
+
+ // Associate UDP socket to gateway.
+ if (sock->Connect((struct sockaddr*)&dest_addr, dest_addrlen) != 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Could not connect to gateway: %s\n", NetworkErrorString(WSAGetLastError()));
+ return MappingError::NETWORK_ERROR;
+ }
+
+ // Use getsockname to get the address toward the default gateway (the internal address),
+ // in case we don't know what address to map
+ // (this is only needed if bind is INADDR_ANY, but it doesn't hurt as an extra check).
+ struct sockaddr_storage internal_addr;
+ socklen_t internal_addrlen = sizeof(struct sockaddr_storage);
+ if (sock->GetSockName((struct sockaddr*)&internal_addr, &internal_addrlen) != 0) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Could not get sock name: %s\n", NetworkErrorString(WSAGetLastError()));
+ return MappingError::NETWORK_ERROR;
+ }
+ CService internal;
+ if (!internal.SetSockAddr((struct sockaddr*)&internal_addr)) return MappingError::NETWORK_ERROR;
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "pcp: Internal address after connect: %s\n", internal.ToStringAddr());
+
+ // Build request packet. Make sure the packet is zeroed so that reserved fields are zero
+ // as required by the spec (and not potentially leak data).
+ // Make sure there's space for the request header and MAP specific request data.
+ std::vector<uint8_t> request(PCP_HDR_SIZE + PCP_MAP_SIZE);
+ // Fill in request header, See RFC6887 Figure 2.
+ size_t ofs = 0;
+ request[ofs + PCP_HDR_VERSION_OFS] = PCP_VERSION;
+ request[ofs + PCP_HDR_OP_OFS] = PCP_REQUEST | PCP_OP_MAP;
+ WriteBE32(request.data() + ofs + PCP_HDR_LIFETIME_OFS, lifetime);
+ if (!PCPWrapAddress(Span(request).subspan(ofs + PCP_REQUEST_HDR_IP_OFS, ADDR_IPV6_SIZE), internal)) return MappingError::NETWORK_ERROR;
+
+ ofs += PCP_HDR_SIZE;
+
+ // Fill in MAP request packet, See RFC6887 Figure 9.
+ // Randomize mapping nonce (this is repeated in the response, to be able to
+ // correlate requests and responses, and used to authenticate changes to the mapping).
+ std::memcpy(request.data() + ofs + PCP_MAP_NONCE_OFS, nonce.data(), PCP_MAP_NONCE_SIZE);
+ request[ofs + PCP_MAP_PROTOCOL_OFS] = PCP_PROTOCOL_TCP;
+ WriteBE16(request.data() + ofs + PCP_MAP_INTERNAL_PORT_OFS, port);
+ WriteBE16(request.data() + ofs + PCP_MAP_EXTERNAL_PORT_OFS, port);
+ if (!PCPWrapAddress(Span(request).subspan(ofs + PCP_MAP_EXTERNAL_IP_OFS, ADDR_IPV6_SIZE), bind)) return MappingError::NETWORK_ERROR;
+
+ ofs += PCP_MAP_SIZE;
+ Assume(ofs == request.size());
+
+ // Receive loop.
+ bool is_natpmp = false;
+ auto recv_res = PCPSendRecv(*sock, "pcp", request, num_tries, timeout_per_try,
+ [&](const Span<const uint8_t> response) -> bool {
+ // Unsupported version according to RFC6887 appendix A and RFC6886 section 3.5, can fall back to NAT-PMP.
+ if (response.size() == NATPMP_RESPONSE_HDR_SIZE && response[PCP_HDR_VERSION_OFS] == NATPMP_VERSION && response[PCP_RESPONSE_HDR_RESULT_OFS] == NATPMP_RESULT_UNSUPP_VERSION) {
+ is_natpmp = true;
+ return true; // Let it through to caller.
+ }
+ if (response.size() < (PCP_HDR_SIZE + PCP_MAP_SIZE)) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Response too small\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ if (response[PCP_HDR_VERSION_OFS] != PCP_VERSION || response[PCP_HDR_OP_OFS] != (PCP_RESPONSE | PCP_OP_MAP)) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Response to wrong command\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ // Handle MAP opcode response. See RFC6887 Figure 10.
+ // Check that returned mapping nonce matches our request.
+ if (!std::ranges::equal(response.subspan(PCP_HDR_SIZE + PCP_MAP_NONCE_OFS, PCP_MAP_NONCE_SIZE), nonce)) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Mapping nonce mismatch\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ uint8_t protocol = response[PCP_HDR_SIZE + 12];
+ uint16_t internal_port = ReadBE16(response.data() + PCP_HDR_SIZE + 16);
+ if (protocol != PCP_PROTOCOL_TCP || internal_port != port) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Response protocol or port doesn't match request\n");
+ return false; // Wasn't response to what we expected, try receiving next packet.
+ }
+ return true;
+ });
+
+ if (!recv_res) {
+ return MappingError::NETWORK_ERROR;
+ }
+ if (is_natpmp) {
+ return MappingError::UNSUPP_VERSION;
+ }
+
+ const std::span<const uint8_t> response = *recv_res;
+ // If we get here, we got a valid MAP response to our request.
+ // Check to see if we got the result we expected.
+ Assume(response.size() >= (PCP_HDR_SIZE + PCP_MAP_SIZE));
+ uint8_t result_code = response[PCP_RESPONSE_HDR_RESULT_OFS];
+ uint32_t lifetime_ret = ReadBE32(response.data() + PCP_HDR_LIFETIME_OFS);
+ uint16_t external_port = ReadBE16(response.data() + PCP_HDR_SIZE + PCP_MAP_EXTERNAL_PORT_OFS);
+ CNetAddr external_addr{PCPUnwrapAddress(response.subspan(PCP_HDR_SIZE + PCP_MAP_EXTERNAL_IP_OFS, ADDR_IPV6_SIZE))};
+ if (result_code != PCP_RESULT_SUCCESS) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "pcp: Mapping failed with result %s\n", PCPResultString(result_code));
+ if (result_code == PCP_RESULT_NO_RESOURCES) {
+ return MappingError::NO_RESOURCES;
+ }
+ return MappingError::PROTOCOL_ERROR;
+ }
+
+ return MappingResult(PCP_VERSION, CService(internal, port), CService(external_addr, external_port), lifetime_ret);
+}
+
+std::string MappingResult::ToString()
+{
+ Assume(version == NATPMP_VERSION || version == PCP_VERSION);
+ return strprintf("%s:%s -> %s (for %ds)",
+ version == NATPMP_VERSION ? "natpmp" : "pcp",
+ external.ToStringAddrPort(),
+ internal.ToStringAddrPort(),
+ lifetime
+ );
+}
diff --git a/src/common/pcp.h b/src/common/pcp.h
new file mode 100644
index 0000000000..ce2273e140
--- /dev/null
+++ b/src/common/pcp.h
@@ -0,0 +1,68 @@
+// Copyright (c) 2024 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_COMMON_PCP_H
+#define BITCOIN_COMMON_PCP_H
+
+#include <netaddress.h>
+
+#include <variant>
+
+// RFC6886 NAT-PMP and RFC6887 Port Control Protocol (PCP) implementation.
+// NAT-PMP and PCP use network byte order (big-endian).
+
+//! Mapping nonce size in bytes (see RFC6887 section 11.1).
+constexpr size_t PCP_MAP_NONCE_SIZE = 12;
+
+//! PCP mapping nonce. Arbitrary data chosen by the client to identify a mapping.
+typedef std::array<uint8_t, PCP_MAP_NONCE_SIZE> PCPMappingNonce;
+
+//! Unsuccessful response to a port mapping.
+enum class MappingError {
+ NETWORK_ERROR, ///< Any kind of network-level error.
+ PROTOCOL_ERROR, ///< Any kind of protocol-level error, except unsupported version or no resources.
+ UNSUPP_VERSION, ///< Unsupported protocol version.
+ NO_RESOURCES, ///< No resources available (port probably already mapped).
+};
+
+//! Successful response to a port mapping.
+struct MappingResult {
+ MappingResult(uint8_t version, const CService &internal_in, const CService &external_in, uint32_t lifetime_in):
+ version(version), internal(internal_in), external(external_in), lifetime(lifetime_in) {}
+ //! Protocol version, one of NATPMP_VERSION or PCP_VERSION.
+ uint8_t version;
+ //! Internal host:port.
+ CService internal;
+ //! External host:port.
+ CService external;
+ //! Granted lifetime of binding (seconds).
+ uint32_t lifetime;
+
+ //! Format mapping as string for logging.
+ std::string ToString();
+};
+
+//! Try to open a port using RFC 6886 NAT-PMP. IPv4 only.
+//!
+//! * gateway: Destination address for PCP requests (usually the default gateway).
+//! * port: Internal port, and desired external port.
+//! * lifetime: Requested lifetime in seconds for mapping. The server may assign as shorter or longer lifetime. A lifetime of 0 deletes the mapping.
+//! * num_tries: Number of tries in case of no response.
+//!
+//! Returns the external_ip:external_port of the mapping if successful, otherwise a MappingError.
+std::variant<MappingResult, MappingError> NATPMPRequestPortMap(const CNetAddr &gateway, uint16_t port, uint32_t lifetime, int num_tries = 3, std::chrono::milliseconds timeout_per_try = std::chrono::milliseconds(1000));
+
+//! Try to open a port using RFC 6887 Port Control Protocol (PCP). Handles IPv4 and IPv6.
+//!
+//! * nonce: Mapping cookie. Keep this the same over renewals.
+//! * gateway: Destination address for PCP requests (usually the default gateway).
+//! * bind: Specific local bind address for IPv6 pinholing. Set this as INADDR_ANY for IPv4.
+//! * port: Internal port, and desired external port.
+//! * lifetime: Requested lifetime in seconds for mapping. The server may assign as shorter or longer lifetime. A lifetime of 0 deletes the mapping.
+//! * num_tries: Number of tries in case of no response.
+//!
+//! Returns the external_ip:external_port of the mapping if successful, otherwise a MappingError.
+std::variant<MappingResult, MappingError> PCPRequestPortMap(const PCPMappingNonce &nonce, const CNetAddr &gateway, const CNetAddr &bind, uint16_t port, uint32_t lifetime, int num_tries = 3, std::chrono::milliseconds timeout_per_try = std::chrono::milliseconds(1000));
+
+#endif // BITCOIN_COMMON_PCP_H
diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h
index 384f70bc10..cffe9cdafd 100644
--- a/src/consensus/consensus.h
+++ b/src/consensus/consensus.h
@@ -27,4 +27,11 @@ static const size_t MIN_SERIALIZABLE_TRANSACTION_WEIGHT = WITNESS_SCALE_FACTOR *
/** Interpret sequence numbers as relative lock-time constraints. */
static constexpr unsigned int LOCKTIME_VERIFY_SEQUENCE = (1 << 0);
+/**
+ * Maximum number of seconds that the timestamp of the first
+ * block of a difficulty adjustment period is allowed to
+ * be earlier than the last block of the previous period (BIP94).
+ */
+static constexpr int64_t MAX_TIMEWARP = 600;
+
#endif // BITCOIN_CONSENSUS_CONSENSUS_H
diff --git a/src/consensus/params.h b/src/consensus/params.h
index 25f53eb620..dd29b9408e 100644
--- a/src/consensus/params.h
+++ b/src/consensus/params.h
@@ -108,6 +108,11 @@ struct Params {
/** Proof of work parameters */
uint256 powLimit;
bool fPowAllowMinDifficultyBlocks;
+ /**
+ * Enforce BIP94 timewarp attack mitigation. On testnet4 this also enforces
+ * the block storm mitigation.
+ */
+ bool enforce_BIP94;
bool fPowNoRetargeting;
int64_t nPowTargetSpacing;
int64_t nPowTargetTimespan;
diff --git a/src/core_io.h b/src/core_io.h
index 4405f5c8f8..9305bb7239 100644
--- a/src/core_io.h
+++ b/src/core_io.h
@@ -37,15 +37,6 @@ std::string ScriptToAsmStr(const CScript& script, const bool fAttemptSighashDeco
[[nodiscard]] bool DecodeHexBlk(CBlock&, const std::string& strHexBlk);
bool DecodeHexBlockHeader(CBlockHeader&, const std::string& hex_header);
-/**
- * Parse a hex string into 256 bits
- * @param[in] strHex a hex-formatted, 64-character string
- * @param[out] result the result of the parsing
- * @returns true if successful, false if not
- *
- * @see ParseHashV for an RPC-oriented version of this
- */
-bool ParseHashStr(const std::string& strHex, uint256& result);
[[nodiscard]] util::Result<int> SighashFromStr(const std::string& sighash);
// core_write.cpp
diff --git a/src/core_read.cpp b/src/core_read.cpp
index 114f92fc45..23f341c230 100644
--- a/src/core_read.cpp
+++ b/src/core_read.cpp
@@ -234,18 +234,9 @@ bool DecodeHexBlk(CBlock& block, const std::string& strHexBlk)
return true;
}
-bool ParseHashStr(const std::string& strHex, uint256& result)
-{
- if ((strHex.size() != 64) || !IsHex(strHex))
- return false;
-
- result.SetHex(strHex);
- return true;
-}
-
util::Result<int> SighashFromStr(const std::string& sighash)
{
- static std::map<std::string, int> map_sighash_values = {
+ static const std::map<std::string, int> map_sighash_values = {
{std::string("DEFAULT"), int(SIGHASH_DEFAULT)},
{std::string("ALL"), int(SIGHASH_ALL)},
{std::string("ALL|ANYONECANPAY"), int(SIGHASH_ALL|SIGHASH_ANYONECANPAY)},
diff --git a/src/crypto/CMakeLists.txt b/src/crypto/CMakeLists.txt
new file mode 100644
index 0000000000..03c6972dca
--- /dev/null
+++ b/src/crypto/CMakeLists.txt
@@ -0,0 +1,68 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(bitcoin_crypto STATIC EXCLUDE_FROM_ALL
+ aes.cpp
+ chacha20.cpp
+ chacha20poly1305.cpp
+ hex_base.cpp
+ hkdf_sha256_32.cpp
+ hmac_sha256.cpp
+ hmac_sha512.cpp
+ muhash.cpp
+ poly1305.cpp
+ ripemd160.cpp
+ sha1.cpp
+ sha256.cpp
+ sha256_sse4.cpp
+ sha3.cpp
+ sha512.cpp
+ siphash.cpp
+ ../support/cleanse.cpp
+)
+
+target_link_libraries(bitcoin_crypto
+ PRIVATE
+ core_interface
+)
+
+if(HAVE_SSE41)
+ add_library(bitcoin_crypto_sse41 STATIC EXCLUDE_FROM_ALL
+ sha256_sse41.cpp
+ )
+ target_compile_definitions(bitcoin_crypto_sse41 PUBLIC ENABLE_SSE41)
+ target_compile_options(bitcoin_crypto_sse41 PRIVATE ${SSE41_CXXFLAGS})
+ target_link_libraries(bitcoin_crypto_sse41 PRIVATE core_interface)
+ target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_sse41)
+endif()
+
+if(HAVE_AVX2)
+ add_library(bitcoin_crypto_avx2 STATIC EXCLUDE_FROM_ALL
+ sha256_avx2.cpp
+ )
+ target_compile_definitions(bitcoin_crypto_avx2 PUBLIC ENABLE_AVX2)
+ target_compile_options(bitcoin_crypto_avx2 PRIVATE ${AVX2_CXXFLAGS})
+ target_link_libraries(bitcoin_crypto_avx2 PRIVATE core_interface)
+ target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_avx2)
+endif()
+
+if(HAVE_SSE41 AND HAVE_X86_SHANI)
+ add_library(bitcoin_crypto_x86_shani STATIC EXCLUDE_FROM_ALL
+ sha256_x86_shani.cpp
+ )
+ target_compile_definitions(bitcoin_crypto_x86_shani PUBLIC ENABLE_SSE41 ENABLE_X86_SHANI)
+ target_compile_options(bitcoin_crypto_x86_shani PRIVATE ${X86_SHANI_CXXFLAGS})
+ target_link_libraries(bitcoin_crypto_x86_shani PRIVATE core_interface)
+ target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_x86_shani)
+endif()
+
+if(HAVE_ARM_SHANI)
+ add_library(bitcoin_crypto_arm_shani STATIC EXCLUDE_FROM_ALL
+ sha256_arm_shani.cpp
+ )
+ target_compile_definitions(bitcoin_crypto_arm_shani PUBLIC ENABLE_ARM_SHANI)
+ target_compile_options(bitcoin_crypto_arm_shani PRIVATE ${ARM_SHANI_CXXFLAGS})
+ target_link_libraries(bitcoin_crypto_arm_shani PRIVATE core_interface)
+ target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_arm_shani)
+endif()
diff --git a/src/crypto/common.h b/src/crypto/common.h
index 1dc4f3f55c..d45459b1f6 100644
--- a/src/crypto/common.h
+++ b/src/crypto/common.h
@@ -70,6 +70,12 @@ uint64_t static inline ReadBE64(const unsigned char* ptr)
return be64toh_internal(x);
}
+void static inline WriteBE16(unsigned char* ptr, uint16_t x)
+{
+ uint16_t v = htobe16_internal(x);
+ memcpy(ptr, &v, 2);
+}
+
void static inline WriteBE32(unsigned char* ptr, uint32_t x)
{
uint32_t v = htobe32_internal(x);
diff --git a/src/crypto/muhash.h b/src/crypto/muhash.h
index cb53e1743e..222b866b6d 100644
--- a/src/crypto/muhash.h
+++ b/src/crypto/muhash.h
@@ -97,7 +97,7 @@ private:
public:
/* The empty set. */
- MuHash3072() noexcept {};
+ MuHash3072() noexcept = default;
/* A singleton with variable sized data in it. */
explicit MuHash3072(Span<const unsigned char> in) noexcept;
diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp
index c883bd2f03..deedc0a6d1 100644
--- a/src/crypto/sha256.cpp
+++ b/src/crypto/sha256.cpp
@@ -7,8 +7,9 @@
#include <crypto/sha256.h>
#include <crypto/common.h>
-#include <assert.h>
-#include <string.h>
+#include <algorithm>
+#include <cassert>
+#include <cstring>
#if !defined(DISABLE_OPTIMIZED_SHA256)
#include <compat/cpuid.h>
@@ -621,7 +622,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
}
}
-#if defined(ENABLE_X86_SHANI)
+#if defined(ENABLE_SSE41) && defined(ENABLE_X86_SHANI)
if (have_x86_shani) {
Transform = sha256_x86_shani::Transform;
TransformD64 = TransformD64Wrapper<sha256_x86_shani::Transform>;
diff --git a/src/crypto/sha256_x86_shani.cpp b/src/crypto/sha256_x86_shani.cpp
index 79871bfcc1..7471828193 100644
--- a/src/crypto/sha256_x86_shani.cpp
+++ b/src/crypto/sha256_x86_shani.cpp
@@ -6,7 +6,7 @@
// Written and placed in public domain by Jeffrey Walton.
// Based on code from Intel, and by Sean Gulley for the miTLS project.
-#ifdef ENABLE_X86_SHANI
+#if defined(ENABLE_SSE41) && defined(ENABLE_X86_SHANI)
#include <stdint.h>
#include <immintrin.h>
diff --git a/src/crypto/sha3.h b/src/crypto/sha3.h
index e8e91f1ee4..a28c5311ff 100644
--- a/src/crypto/sha3.h
+++ b/src/crypto/sha3.h
@@ -32,7 +32,7 @@ private:
public:
static constexpr size_t OUTPUT_SIZE = 32;
- SHA3_256() {}
+ SHA3_256() = default;
SHA3_256& Write(Span<const unsigned char> data);
SHA3_256& Finalize(Span<unsigned char> output);
SHA3_256& Reset();
diff --git a/src/cuckoocache.h b/src/cuckoocache.h
index df320ed465..8370179395 100644
--- a/src/cuckoocache.h
+++ b/src/cuckoocache.h
@@ -14,7 +14,6 @@
#include <cstring>
#include <limits>
#include <memory>
-#include <optional>
#include <utility>
#include <vector>
@@ -360,16 +359,15 @@ public:
* structure
* @returns A pair of the maximum number of elements storable (see setup()
* documentation for more detail) and the approximate total size of these
- * elements in bytes or std::nullopt if the size requested is too large.
+ * elements in bytes.
*/
- std::optional<std::pair<uint32_t, size_t>> setup_bytes(size_t bytes)
+ std::pair<uint32_t, size_t> setup_bytes(size_t bytes)
{
- size_t requested_num_elems = bytes / sizeof(Element);
- if (std::numeric_limits<uint32_t>::max() < requested_num_elems) {
- return std::nullopt;
- }
+ uint32_t requested_num_elems(std::min<size_t>(
+ bytes / sizeof(Element),
+ std::numeric_limits<uint32_t>::max()));
- auto num_elems = setup(bytes/sizeof(Element));
+ auto num_elems = setup(requested_num_elems);
size_t approx_size_bytes = num_elems * sizeof(Element);
return std::make_pair(num_elems, approx_size_bytes);
diff --git a/src/dbwrapper.cpp b/src/dbwrapper.cpp
index 775496e21b..e0f153fd61 100644
--- a/src/dbwrapper.cpp
+++ b/src/dbwrapper.cpp
@@ -100,7 +100,7 @@ public:
assert(p <= limit);
base[std::min(bufsize - 1, (int)(p - base))] = '\0';
- LogPrintLevel(BCLog::LEVELDB, BCLog::Level::Debug, "%s", base); // NOLINT(bitcoin-unterminated-logprintf)
+ LogDebug(BCLog::LEVELDB, "%s\n", util::RemoveSuffixView(base, "\n"));
if (base != buffer) {
delete[] base;
}
@@ -130,7 +130,7 @@ static void SetMaxOpenFiles(leveldb::Options *options) {
options->max_open_files = 64;
}
#endif
- LogPrint(BCLog::LEVELDB, "LevelDB using max_open_files=%d (default=%d)\n",
+ LogDebug(BCLog::LEVELDB, "LevelDB using max_open_files=%d (default=%d)\n",
options->max_open_files, default_open_files);
}
@@ -299,7 +299,7 @@ bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync)
HandleError(status);
if (log_memory) {
double mem_after = DynamicMemoryUsage() / 1024.0 / 1024;
- LogPrint(BCLog::LEVELDB, "WriteBatch memory usage: db=%s, before=%.1fMiB, after=%.1fMiB\n",
+ LogDebug(BCLog::LEVELDB, "WriteBatch memory usage: db=%s, before=%.1fMiB, after=%.1fMiB\n",
m_name, mem_before, mem_after);
}
return true;
@@ -310,7 +310,7 @@ size_t CDBWrapper::DynamicMemoryUsage() const
std::string memory;
std::optional<size_t> parsed;
if (!DBContext().pdb->GetProperty("leveldb.approximate-memory-usage", &memory) || !(parsed = ToIntegral<size_t>(memory))) {
- LogPrint(BCLog::LEVELDB, "Failed to get approximate-memory-usage property\n");
+ LogDebug(BCLog::LEVELDB, "Failed to get approximate-memory-usage property\n");
return 0;
}
return parsed.value();
diff --git a/src/external_signer.cpp b/src/external_signer.cpp
index ff159a2aa5..1810f45bc8 100644
--- a/src/external_signer.cpp
+++ b/src/external_signer.cpp
@@ -80,10 +80,10 @@ bool ExternalSigner::SignTransaction(PartiallySignedTransaction& psbtx, std::str
// Check if signer fingerprint matches any input master key fingerprint
auto matches_signer_fingerprint = [&](const PSBTInput& input) {
for (const auto& entry : input.hd_keypaths) {
- if (parsed_m_fingerprint == MakeUCharSpan(entry.second.fingerprint)) return true;
+ if (std::ranges::equal(parsed_m_fingerprint, entry.second.fingerprint)) return true;
}
for (const auto& entry : input.m_tap_bip32_paths) {
- if (parsed_m_fingerprint == MakeUCharSpan(entry.second.second.fingerprint)) return true;
+ if (std::ranges::equal(parsed_m_fingerprint, entry.second.second.fingerprint)) return true;
}
return false;
};
diff --git a/src/flatfile.cpp b/src/flatfile.cpp
index 2bff663d8b..388b30efae 100644
--- a/src/flatfile.cpp
+++ b/src/flatfile.cpp
@@ -30,7 +30,7 @@ fs::path FlatFileSeq::FileName(const FlatFilePos& pos) const
return m_dir / fs::u8path(strprintf("%s%05u.dat", m_prefix, pos.nFile));
}
-FILE* FlatFileSeq::Open(const FlatFilePos& pos, bool read_only)
+FILE* FlatFileSeq::Open(const FlatFilePos& pos, bool read_only) const
{
if (pos.IsNull()) {
return nullptr;
@@ -52,7 +52,7 @@ FILE* FlatFileSeq::Open(const FlatFilePos& pos, bool read_only)
return file;
}
-size_t FlatFileSeq::Allocate(const FlatFilePos& pos, size_t add_size, bool& out_of_space)
+size_t FlatFileSeq::Allocate(const FlatFilePos& pos, size_t add_size, bool& out_of_space) const
{
out_of_space = false;
@@ -66,7 +66,7 @@ size_t FlatFileSeq::Allocate(const FlatFilePos& pos, size_t add_size, bool& out_
if (CheckDiskSpace(m_dir, inc_size)) {
FILE *file = Open(pos);
if (file) {
- LogPrint(BCLog::VALIDATION, "Pre-allocating up to position 0x%x in %s%05u.dat\n", new_size, m_prefix, pos.nFile);
+ LogDebug(BCLog::VALIDATION, "Pre-allocating up to position 0x%x in %s%05u.dat\n", new_size, m_prefix, pos.nFile);
AllocateFileRange(file, pos.nPos, inc_size);
fclose(file);
return inc_size;
@@ -78,7 +78,7 @@ size_t FlatFileSeq::Allocate(const FlatFilePos& pos, size_t add_size, bool& out_
return 0;
}
-bool FlatFileSeq::Flush(const FlatFilePos& pos, bool finalize)
+bool FlatFileSeq::Flush(const FlatFilePos& pos, bool finalize) const
{
FILE* file = Open(FlatFilePos(pos.nFile, 0)); // Avoid fseek to nPos
if (!file) {
diff --git a/src/flatfile.h b/src/flatfile.h
index 26b466db71..3edb0b85da 100644
--- a/src/flatfile.h
+++ b/src/flatfile.h
@@ -18,7 +18,7 @@ struct FlatFilePos
SERIALIZE_METHODS(FlatFilePos, obj) { READWRITE(VARINT_MODE(obj.nFile, VarIntMode::NONNEGATIVE_SIGNED), VARINT(obj.nPos)); }
- FlatFilePos() {}
+ FlatFilePos() = default;
FlatFilePos(int nFileIn, unsigned int nPosIn) :
nFile(nFileIn),
@@ -63,7 +63,7 @@ public:
fs::path FileName(const FlatFilePos& pos) const;
/** Open a handle to the file at the given position. */
- FILE* Open(const FlatFilePos& pos, bool read_only = false);
+ FILE* Open(const FlatFilePos& pos, bool read_only = false) const;
/**
* Allocate additional space in a file after the given starting position. The amount allocated
@@ -74,7 +74,7 @@ public:
* @param[out] out_of_space Whether the allocation failed due to insufficient disk space.
* @return The number of bytes successfully allocated.
*/
- size_t Allocate(const FlatFilePos& pos, size_t add_size, bool& out_of_space);
+ size_t Allocate(const FlatFilePos& pos, size_t add_size, bool& out_of_space) const;
/**
* Commit a file to disk, and optionally truncate off extra pre-allocated bytes if final.
@@ -83,7 +83,7 @@ public:
* @param[in] finalize True if no more data will be written to this file.
* @return true on success, false on failure.
*/
- bool Flush(const FlatFilePos& pos, bool finalize = false);
+ bool Flush(const FlatFilePos& pos, bool finalize = false) const;
};
#endif // BITCOIN_FLATFILE_H
diff --git a/src/headerssync.cpp b/src/headerssync.cpp
index e14de004f5..b134ef6452 100644
--- a/src/headerssync.cpp
+++ b/src/headerssync.cpp
@@ -13,11 +13,11 @@
// contrib/devtools/headerssync-params.py.
//! Store one header commitment per HEADER_COMMITMENT_PERIOD blocks.
-constexpr size_t HEADER_COMMITMENT_PERIOD{606};
+constexpr size_t HEADER_COMMITMENT_PERIOD{615};
//! Only feed headers to validation once this many headers on top have been
//! received and validated against commitments.
-constexpr size_t REDOWNLOAD_BUFFER_SIZE{14441}; // 14441/606 = ~23.8 commitments
+constexpr size_t REDOWNLOAD_BUFFER_SIZE{14621}; // 14621/615 = ~23.8 commitments
// Our memory analysis assumes 48 bytes for a CompressedHeader (so we should
// re-calculate parameters if we compress further)
@@ -25,7 +25,7 @@ static_assert(sizeof(CompressedHeader) == 48);
HeadersSyncState::HeadersSyncState(NodeId id, const Consensus::Params& consensus_params,
const CBlockIndex* chain_start, const arith_uint256& minimum_required_work) :
- m_commit_offset(GetRand<unsigned>(HEADER_COMMITMENT_PERIOD)),
+ m_commit_offset(FastRandomContext().randrange<unsigned>(HEADER_COMMITMENT_PERIOD)),
m_id(id), m_consensus_params(consensus_params),
m_chain_start(chain_start),
m_minimum_required_work(minimum_required_work),
@@ -43,7 +43,7 @@ HeadersSyncState::HeadersSyncState(NodeId id, const Consensus::Params& consensus
// could try again, if necessary, to sync a longer chain).
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());
+ LogDebug(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());
}
/** Free any memory in use, and mark this object as no longer usable. This is
@@ -93,7 +93,7 @@ HeadersSyncState::ProcessingResult HeadersSyncState::ProcessNextHeaders(const
// If we're in PRESYNC and we get a non-full headers
// message, then the peer's chain has ended and definitely doesn't
// have enough work, so we can stop our sync.
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: incomplete headers message at height=%i (presync phase)\n", m_id, m_current_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: incomplete headers message at height=%i (presync phase)\n", m_id, m_current_height);
}
}
} else if (m_download_state == State::REDOWNLOAD) {
@@ -119,7 +119,7 @@ HeadersSyncState::ProcessingResult HeadersSyncState::ProcessNextHeaders(const
// If we hit our target blockhash, then all remaining headers will be
// returned and we can clear any leftover internal state.
if (m_redownloaded_headers.empty() && m_process_all_remaining_headers) {
- LogPrint(BCLog::NET, "Initial headers sync complete with peer=%d: releasing all at height=%i (redownload phase)\n", m_id, m_redownload_buffer_last_height);
+ LogDebug(BCLog::NET, "Initial headers sync complete with peer=%d: releasing all at height=%i (redownload phase)\n", m_id, m_redownload_buffer_last_height);
} else if (full_headers_message) {
// If the headers message is full, we need to request more.
ret.request_more = true;
@@ -128,7 +128,7 @@ HeadersSyncState::ProcessingResult HeadersSyncState::ProcessNextHeaders(const
// declining to serve us that full chain again. Give up.
// Note that there's no more processing to be done with these
// headers, so we can still return success.
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: incomplete headers message at height=%i (redownload phase)\n", m_id, m_redownload_buffer_last_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: incomplete headers message at height=%i (redownload phase)\n", m_id, m_redownload_buffer_last_height);
}
}
}
@@ -151,7 +151,7 @@ bool HeadersSyncState::ValidateAndStoreHeadersCommitments(const std::vector<CBlo
// This might be benign -- perhaps our peer reorged away from the chain
// they were on. Give up on this sync for now (likely we will start a
// new sync with a new starting point).
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: non-continuous headers at height=%i (presync phase)\n", m_id, m_current_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: non-continuous headers at height=%i (presync phase)\n", m_id, m_current_height);
return false;
}
@@ -170,7 +170,7 @@ bool HeadersSyncState::ValidateAndStoreHeadersCommitments(const std::vector<CBlo
m_redownload_buffer_last_hash = m_chain_start->GetBlockHash();
m_redownload_chain_work = m_chain_start->nChainWork;
m_download_state = State::REDOWNLOAD;
- LogPrint(BCLog::NET, "Initial headers sync transition with peer=%d: reached sufficient work at height=%i, redownloading from height=%i\n", m_id, m_current_height, m_redownload_buffer_last_height);
+ LogDebug(BCLog::NET, "Initial headers sync transition with peer=%d: reached sufficient work at height=%i, redownloading from height=%i\n", m_id, m_current_height, m_redownload_buffer_last_height);
}
return true;
}
@@ -189,7 +189,7 @@ bool HeadersSyncState::ValidateAndProcessSingleHeader(const CBlockHeader& curren
// adjustment maximum.
if (!PermittedDifficultyTransition(m_consensus_params, next_height,
m_last_header_received.nBits, current.nBits)) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: invalid difficulty transition at height=%i (presync phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: invalid difficulty transition at height=%i (presync phase)\n", m_id, next_height);
return false;
}
@@ -201,7 +201,7 @@ bool HeadersSyncState::ValidateAndProcessSingleHeader(const CBlockHeader& curren
// It's possible the chain grew since we started the sync; so
// potentially we could succeed in syncing the peer's chain if we
// try again later.
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: exceeded max commitments at height=%i (presync phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: exceeded max commitments at height=%i (presync phase)\n", m_id, next_height);
return false;
}
}
@@ -223,7 +223,7 @@ bool HeadersSyncState::ValidateAndStoreRedownloadedHeader(const CBlockHeader& he
// Ensure that we're working on a header that connects to the chain we're
// downloading.
if (header.hashPrevBlock != m_redownload_buffer_last_hash) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: non-continuous headers at height=%i (redownload phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: non-continuous headers at height=%i (redownload phase)\n", m_id, next_height);
return false;
}
@@ -237,7 +237,7 @@ bool HeadersSyncState::ValidateAndStoreRedownloadedHeader(const CBlockHeader& he
if (!PermittedDifficultyTransition(m_consensus_params, next_height,
previous_nBits, header.nBits)) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: invalid difficulty transition at height=%i (redownload phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: invalid difficulty transition at height=%i (redownload phase)\n", m_id, next_height);
return false;
}
@@ -256,7 +256,7 @@ bool HeadersSyncState::ValidateAndStoreRedownloadedHeader(const CBlockHeader& he
// target blockhash just because we ran out of commitments.
if (!m_process_all_remaining_headers && next_height % HEADER_COMMITMENT_PERIOD == m_commit_offset) {
if (m_header_commitments.size() == 0) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: commitment overrun at height=%i (redownload phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: commitment overrun at height=%i (redownload phase)\n", m_id, next_height);
// Somehow our peer managed to feed us a different chain and
// we've run out of commitments.
return false;
@@ -265,7 +265,7 @@ bool HeadersSyncState::ValidateAndStoreRedownloadedHeader(const CBlockHeader& he
bool expected_commitment = m_header_commitments.front();
m_header_commitments.pop_front();
if (commitment != expected_commitment) {
- LogPrint(BCLog::NET, "Initial headers sync aborted with peer=%d: commitment mismatch at height=%i (redownload phase)\n", m_id, next_height);
+ LogDebug(BCLog::NET, "Initial headers sync aborted with peer=%d: commitment mismatch at height=%i (redownload phase)\n", m_id, next_height);
return false;
}
}
diff --git a/src/headerssync.h b/src/headerssync.h
index e93f67e6da..5e399eb861 100644
--- a/src/headerssync.h
+++ b/src/headerssync.h
@@ -100,7 +100,7 @@ struct CompressedHeader {
class HeadersSyncState {
public:
- ~HeadersSyncState() {}
+ ~HeadersSyncState() = default;
enum class State {
/** PRESYNC means the peer has not yet demonstrated their chain has
diff --git a/src/httprpc.cpp b/src/httprpc.cpp
index af809eaf38..69dd821dc0 100644
--- a/src/httprpc.cpp
+++ b/src/httprpc.cpp
@@ -314,8 +314,9 @@ static bool InitRPCAuthentication()
LogPrintf("Config options rpcuser and rpcpassword will soon be deprecated. Locally-run instances may remove rpcuser to use cookie-based auth, or may be replaced with rpcauth. Please see share/rpcauth for rpcauth auth generation.\n");
strRPCUserColonPass = gArgs.GetArg("-rpcuser", "") + ":" + gArgs.GetArg("-rpcpassword", "");
}
- if (gArgs.GetArg("-rpcauth", "") != "") {
- LogPrintf("Using rpcauth authentication.\n");
+
+ if (!gArgs.GetArgs("-rpcauth").empty()) {
+ LogInfo("Using rpcauth authentication.\n");
for (const std::string& rpcauth : gArgs.GetArgs("-rpcauth")) {
std::vector<std::string> fields{SplitString(rpcauth, ':')};
const std::vector<std::string> salt_hmac{SplitString(fields.back(), '$')};
@@ -357,7 +358,7 @@ static bool InitRPCAuthentication()
bool StartHTTPRPC(const std::any& context)
{
- LogPrint(BCLog::RPC, "Starting HTTP RPC server\n");
+ LogDebug(BCLog::RPC, "Starting HTTP RPC server\n");
if (!InitRPCAuthentication())
return false;
@@ -375,12 +376,12 @@ bool StartHTTPRPC(const std::any& context)
void InterruptHTTPRPC()
{
- LogPrint(BCLog::RPC, "Interrupting HTTP RPC server\n");
+ LogDebug(BCLog::RPC, "Interrupting HTTP RPC server\n");
}
void StopHTTPRPC()
{
- LogPrint(BCLog::RPC, "Stopping HTTP RPC server\n");
+ LogDebug(BCLog::RPC, "Stopping HTTP RPC server\n");
UnregisterHTTPHandler("/", true);
if (g_wallet_init_interface.HasWalletSupport()) {
UnregisterHTTPHandler("/wallet/", false);
diff --git a/src/httpserver.cpp b/src/httpserver.cpp
index b6c6db8b35..ffc53fbd9c 100644
--- a/src/httpserver.cpp
+++ b/src/httpserver.cpp
@@ -8,6 +8,7 @@
#include <chainparamsbase.h>
#include <common/args.h>
+#include <common/messages.h>
#include <compat/compat.h>
#include <logging.h>
#include <netbase.h>
@@ -43,6 +44,8 @@
#include <support/events.h>
+using common::InvalidPortErrMsg;
+
/** Maximum size of http request (request line + headers) */
static const size_t MAX_HEADERS_SIZE = 8192;
@@ -235,7 +238,7 @@ static bool InitHTTPAllowList()
std::string strAllowed;
for (const CSubNet& subnet : rpc_allow_subnets)
strAllowed += subnet.ToString() + " ";
- LogPrint(BCLog::HTTP, "Allowing HTTP connections from: %s\n", strAllowed);
+ LogDebug(BCLog::HTTP, "Allowing HTTP connections from: %s\n", strAllowed);
return true;
}
@@ -287,7 +290,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
// Early address-based allow check
if (!ClientAllowed(hreq->GetPeer())) {
- LogPrint(BCLog::HTTP, "HTTP request from %s rejected: Client network is not allowed RPC access\n",
+ LogDebug(BCLog::HTTP, "HTTP request from %s rejected: Client network is not allowed RPC access\n",
hreq->GetPeer().ToStringAddrPort());
hreq->WriteReply(HTTP_FORBIDDEN);
return;
@@ -295,13 +298,13 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
// Early reject unknown HTTP methods
if (hreq->GetRequestMethod() == HTTPRequest::UNKNOWN) {
- LogPrint(BCLog::HTTP, "HTTP request from %s rejected: Unknown HTTP request method\n",
+ LogDebug(BCLog::HTTP, "HTTP request from %s rejected: Unknown HTTP request method\n",
hreq->GetPeer().ToStringAddrPort());
hreq->WriteReply(HTTP_BAD_METHOD);
return;
}
- LogPrint(BCLog::HTTP, "Received a %s request for %s from %s\n",
+ LogDebug(BCLog::HTTP, "Received a %s request for %s from %s\n",
RequestMethodString(hreq->GetRequestMethod()), SanitizeString(hreq->GetURI(), SAFE_CHARS_URI).substr(0, 100), hreq->GetPeer().ToStringAddrPort());
// Find registered handler for prefix
@@ -315,7 +318,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
if (i->exactMatch)
match = (strURI == i->prefix);
else
- match = (strURI.substr(0, i->prefix.size()) == i->prefix);
+ match = strURI.starts_with(i->prefix);
if (match) {
path = strURI.substr(i->prefix.size());
break;
@@ -340,7 +343,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
/** Callback to reject HTTP requests after shutdown. */
static void http_reject_request_cb(struct evhttp_request* req, void*)
{
- LogPrint(BCLog::HTTP, "Rejecting request while shutting down\n");
+ LogDebug(BCLog::HTTP, "Rejecting request while shutting down\n");
evhttp_send_error(req, HTTP_SERVUNAVAIL, nullptr);
}
@@ -348,10 +351,10 @@ static void http_reject_request_cb(struct evhttp_request* req, void*)
static void ThreadHTTP(struct event_base* base)
{
util::ThreadRename("http");
- LogPrint(BCLog::HTTP, "Entering http event loop\n");
+ LogDebug(BCLog::HTTP, "Entering http event loop\n");
event_base_dispatch(base);
// Event loop will be interrupted by InterruptHTTPServer()
- LogPrint(BCLog::HTTP, "Exited http event loop\n");
+ LogDebug(BCLog::HTTP, "Exited http event loop\n");
}
/** Bind HTTP server to specified addresses */
@@ -374,7 +377,10 @@ static bool HTTPBindAddresses(struct evhttp* http)
for (const std::string& strRPCBind : gArgs.GetArgs("-rpcbind")) {
uint16_t port{http_port};
std::string host;
- SplitHostPort(strRPCBind, port, host);
+ if (!SplitHostPort(strRPCBind, port, host)) {
+ LogError("%s\n", InvalidPortErrMsg("-rpcbind", strRPCBind).original);
+ return false;
+ }
endpoints.emplace_back(host, port);
}
}
@@ -388,6 +394,12 @@ static bool HTTPBindAddresses(struct evhttp* http)
if (i->first.empty() || (addr.has_value() && addr->IsBindAny())) {
LogPrintf("WARNING: the RPC server is not safe to expose to untrusted networks such as the public internet\n");
}
+ // Set the no-delay option (disable Nagle's algorithm) on the TCP socket.
+ evutil_socket_t fd = evhttp_bound_socket_get_fd(bind_handle);
+ int one = 1;
+ if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (sockopt_arg_type)&one, sizeof(one)) == SOCKET_ERROR) {
+ LogInfo("WARNING: Unable to set TCP_NODELAY on RPC server socket, continuing anyway\n");
+ }
boundSockets.push_back(bind_handle);
} else {
LogPrintf("Binding RPC on address %s port %i failed.\n", i->first, i->second);
@@ -460,7 +472,7 @@ bool InitHTTPServer(const util::SignalInterrupt& interrupt)
return false;
}
- LogPrint(BCLog::HTTP, "Initialized HTTP server\n");
+ LogDebug(BCLog::HTTP, "Initialized HTTP server\n");
int workQueueDepth = std::max((long)gArgs.GetIntArg("-rpcworkqueue", DEFAULT_HTTP_WORKQUEUE), 1L);
LogDebug(BCLog::HTTP, "creating work queue of depth %d\n", workQueueDepth);
@@ -495,7 +507,7 @@ void StartHTTPServer()
void InterruptHTTPServer()
{
- LogPrint(BCLog::HTTP, "Interrupting HTTP server\n");
+ LogDebug(BCLog::HTTP, "Interrupting HTTP server\n");
if (eventHTTP) {
// Reject requests on current connections
evhttp_set_gencb(eventHTTP, http_reject_request_cb, nullptr);
@@ -507,9 +519,9 @@ void InterruptHTTPServer()
void StopHTTPServer()
{
- LogPrint(BCLog::HTTP, "Stopping HTTP server\n");
+ LogDebug(BCLog::HTTP, "Stopping HTTP server\n");
if (g_work_queue) {
- LogPrint(BCLog::HTTP, "Waiting for HTTP worker threads to exit\n");
+ LogDebug(BCLog::HTTP, "Waiting for HTTP worker threads to exit\n");
for (auto& thread : g_thread_http_workers) {
thread.join();
}
@@ -523,7 +535,7 @@ void StopHTTPServer()
boundSockets.clear();
{
if (const auto n_connections{g_requests.CountActiveConnections()}; n_connections != 0) {
- LogPrint(BCLog::HTTP, "Waiting for %d connections to stop HTTP server\n", n_connections);
+ LogDebug(BCLog::HTTP, "Waiting for %d connections to stop HTTP server\n", n_connections);
}
g_requests.WaitUntilEmpty();
}
@@ -537,13 +549,13 @@ void StopHTTPServer()
}, nullptr, nullptr);
}
if (eventBase) {
- LogPrint(BCLog::HTTP, "Waiting for HTTP event thread to exit\n");
+ LogDebug(BCLog::HTTP, "Waiting for HTTP event thread to exit\n");
if (g_thread_http.joinable()) g_thread_http.join();
event_base_free(eventBase);
eventBase = nullptr;
}
g_work_queue.reset();
- LogPrint(BCLog::HTTP, "Stopped HTTP server\n");
+ LogDebug(BCLog::HTTP, "Stopped HTTP server\n");
}
struct event_base* EventBase()
@@ -742,7 +754,7 @@ std::optional<std::string> GetQueryParameterFromUri(const char* uri, const std::
void RegisterHTTPHandler(const std::string &prefix, bool exactMatch, const HTTPRequestHandler &handler)
{
- LogPrint(BCLog::HTTP, "Registering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
+ LogDebug(BCLog::HTTP, "Registering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
LOCK(g_httppathhandlers_mutex);
pathHandlers.emplace_back(prefix, exactMatch, handler);
}
@@ -757,7 +769,7 @@ void UnregisterHTTPHandler(const std::string &prefix, bool exactMatch)
break;
if (i != iend)
{
- LogPrint(BCLog::HTTP, "Unregistering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
+ LogDebug(BCLog::HTTP, "Unregistering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
pathHandlers.erase(i);
}
}
diff --git a/src/httpserver.h b/src/httpserver.h
index 991081bab8..33216a0119 100644
--- a/src/httpserver.h
+++ b/src/httpserver.h
@@ -131,7 +131,7 @@ public:
*/
void WriteReply(int nStatus, std::string_view reply = "")
{
- WriteReply(nStatus, std::as_bytes(std::span{reply.data(), reply.size()}));
+ WriteReply(nStatus, std::as_bytes(std::span{reply}));
}
void WriteReply(int nStatus, std::span<const std::byte> reply);
};
@@ -156,7 +156,7 @@ class HTTPClosure
{
public:
virtual void operator()() = 0;
- virtual ~HTTPClosure() {}
+ virtual ~HTTPClosure() = default;
};
/** Event class. This can be used either as a cross-thread trigger or as a timer.
diff --git a/src/index/base.cpp b/src/index/base.cpp
index 955d7b67c9..810358394a 100644
--- a/src/index/base.cpp
+++ b/src/index/base.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2017-2022 The Bitcoin Core developers
+// Copyright (c) 2017-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.
@@ -14,6 +14,7 @@
#include <node/database_args.h>
#include <node/interface_ui.h>
#include <tinyformat.h>
+#include <util/string.h>
#include <util/thread.h>
#include <util/translation.h>
#include <validation.h> // For g_chainman
@@ -27,7 +28,7 @@ constexpr auto SYNC_LOG_INTERVAL{30s};
constexpr auto SYNC_LOCATOR_WRITE_INTERVAL{30s};
template <typename... Args>
-void BaseIndex::FatalErrorf(const char* fmt, const Args&... args)
+void BaseIndex::FatalErrorf(util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args)
{
auto message = tfm::format(fmt, args...);
node::AbortNode(m_chain->context()->shutdown, m_chain->context()->exit_status, Untranslated(message), m_chain->context()->warnings.get());
@@ -112,7 +113,7 @@ bool BaseIndex::Init()
// Child init
const CBlockIndex* start_block = m_best_block_index.load();
- if (!CustomInit(start_block ? std::make_optional(interfaces::BlockKey{start_block->GetBlockHash(), start_block->nHeight}) : std::nullopt)) {
+ if (!CustomInit(start_block ? std::make_optional(interfaces::BlockRef{start_block->GetBlockHash(), start_block->nHeight}) : std::nullopt)) {
return false;
}
diff --git a/src/index/base.h b/src/index/base.h
index 0eb1d9ca3b..fbd9069a51 100644
--- a/src/index/base.h
+++ b/src/index/base.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2017-2022 The Bitcoin Core developers
+// Copyright (c) 2017-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.
@@ -7,6 +7,8 @@
#include <dbwrapper.h>
#include <interfaces/chain.h>
+#include <interfaces/types.h>
+#include <util/string.h>
#include <util/threadinterrupt.h>
#include <validationinterface.h>
@@ -94,7 +96,7 @@ private:
virtual bool AllowPrune() const = 0;
template <typename... Args>
- void FatalErrorf(const char* fmt, const Args&... args);
+ void FatalErrorf(util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args);
protected:
std::unique_ptr<interfaces::Chain> m_chain;
@@ -106,7 +108,7 @@ protected:
void ChainStateFlushed(ChainstateRole role, const CBlockLocator& locator) override;
/// Initialize internal state from the database and block index.
- [[nodiscard]] virtual bool CustomInit(const std::optional<interfaces::BlockKey>& block) { return true; }
+ [[nodiscard]] virtual bool CustomInit(const std::optional<interfaces::BlockRef>& block) { return true; }
/// Write update index entries for a newly connected block.
[[nodiscard]] virtual bool CustomAppend(const interfaces::BlockInfo& block) { return true; }
@@ -117,7 +119,7 @@ protected:
/// Rewind index to an earlier chain tip during a chain reorg. The tip must
/// be an ancestor of the current best block.
- [[nodiscard]] virtual bool CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip) { return true; }
+ [[nodiscard]] virtual bool CustomRewind(const interfaces::BlockRef& current_tip, const interfaces::BlockRef& new_tip) { return true; }
virtual DB& GetDB() const = 0;
diff --git a/src/index/blockfilterindex.cpp b/src/index/blockfilterindex.cpp
index 41bdca9df5..a808cc9085 100644
--- a/src/index/blockfilterindex.cpp
+++ b/src/index/blockfilterindex.cpp
@@ -112,7 +112,7 @@ BlockFilterIndex::BlockFilterIndex(std::unique_ptr<interfaces::Chain> chain, Blo
m_filter_fileseq = std::make_unique<FlatFileSeq>(std::move(path), "fltr", FLTR_FILE_CHUNK_SIZE);
}
-bool BlockFilterIndex::CustomInit(const std::optional<interfaces::BlockKey>& block)
+bool BlockFilterIndex::CustomInit(const std::optional<interfaces::BlockRef>& block)
{
if (!m_db->Read(DB_FILTER_POS, m_next_filter_pos)) {
// Check that the cause of the read failure is that the key does not exist. Any other errors
@@ -151,7 +151,7 @@ bool BlockFilterIndex::CustomCommit(CDBBatch& batch)
LogError("%s: Failed to open filter file %d\n", __func__, pos.nFile);
return false;
}
- if (!FileCommit(file.Get())) {
+ if (!file.Commit()) {
LogError("%s: Failed to commit filter file %d\n", __func__, pos.nFile);
return false;
}
@@ -201,11 +201,11 @@ size_t BlockFilterIndex::WriteFilterToDisk(FlatFilePos& pos, const BlockFilter&
LogPrintf("%s: Failed to open filter file %d\n", __func__, pos.nFile);
return 0;
}
- if (!TruncateFile(last_file.Get(), pos.nPos)) {
+ if (!last_file.Truncate(pos.nPos)) {
LogPrintf("%s: Failed to truncate filter file %d\n", __func__, pos.nFile);
return 0;
}
- if (!FileCommit(last_file.Get())) {
+ if (!last_file.Commit()) {
LogPrintf("%s: Failed to commit filter file %d\n", __func__, pos.nFile);
return 0;
}
@@ -316,7 +316,7 @@ bool BlockFilterIndex::Write(const BlockFilter& filter, uint32_t block_height, c
return true;
}
-bool BlockFilterIndex::CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip)
+bool BlockFilterIndex::CustomRewind(const interfaces::BlockRef& current_tip, const interfaces::BlockRef& new_tip)
{
CDBBatch batch(*m_db);
std::unique_ptr<CDBIterator> db_it(m_db->NewIterator());
diff --git a/src/index/blockfilterindex.h b/src/index/blockfilterindex.h
index cdb9563fb8..ccb4845ef5 100644
--- a/src/index/blockfilterindex.h
+++ b/src/index/blockfilterindex.h
@@ -52,13 +52,13 @@ private:
std::optional<uint256> ReadFilterHeader(int height, const uint256& expected_block_hash);
protected:
- bool CustomInit(const std::optional<interfaces::BlockKey>& block) override;
+ bool CustomInit(const std::optional<interfaces::BlockRef>& block) override;
bool CustomCommit(CDBBatch& batch) override;
bool CustomAppend(const interfaces::BlockInfo& block) override;
- bool CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip) override;
+ bool CustomRewind(const interfaces::BlockRef& current_tip, const interfaces::BlockRef& new_tip) override;
BaseIndex::DB& GetDB() const LIFETIMEBOUND override { return *m_db; }
diff --git a/src/index/coinstatsindex.cpp b/src/index/coinstatsindex.cpp
index dff8e50a4e..c950a18f3f 100644
--- a/src/index/coinstatsindex.cpp
+++ b/src/index/coinstatsindex.cpp
@@ -265,7 +265,7 @@ bool CoinStatsIndex::CustomAppend(const interfaces::BlockInfo& block)
return true;
}
-bool CoinStatsIndex::CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip)
+bool CoinStatsIndex::CustomRewind(const interfaces::BlockRef& current_tip, const interfaces::BlockRef& new_tip)
{
CDBBatch batch(*m_db);
std::unique_ptr<CDBIterator> db_it(m_db->NewIterator());
@@ -304,7 +304,7 @@ bool CoinStatsIndex::CustomRewind(const interfaces::BlockKey& current_tip, const
return true;
}
-static bool LookUpOne(const CDBWrapper& db, const interfaces::BlockKey& block, DBVal& result)
+static bool LookUpOne(const CDBWrapper& db, const interfaces::BlockRef& block, DBVal& result)
{
// First check if the result is stored under the height index and the value
// there matches the block hash. This should be the case if the block is on
@@ -350,7 +350,7 @@ std::optional<CCoinsStats> CoinStatsIndex::LookUpStats(const CBlockIndex& block_
return stats;
}
-bool CoinStatsIndex::CustomInit(const std::optional<interfaces::BlockKey>& block)
+bool CoinStatsIndex::CustomInit(const std::optional<interfaces::BlockRef>& block)
{
if (!m_db->Read(DB_MUHASH, m_muhash)) {
// Check that the cause of the read failure is that the key does not
diff --git a/src/index/coinstatsindex.h b/src/index/coinstatsindex.h
index d6322bfa7c..885b9e0a86 100644
--- a/src/index/coinstatsindex.h
+++ b/src/index/coinstatsindex.h
@@ -43,13 +43,13 @@ private:
bool AllowPrune() const override { return true; }
protected:
- bool CustomInit(const std::optional<interfaces::BlockKey>& block) override;
+ bool CustomInit(const std::optional<interfaces::BlockRef>& block) override;
bool CustomCommit(CDBBatch& batch) override;
bool CustomAppend(const interfaces::BlockInfo& block) override;
- bool CustomRewind(const interfaces::BlockKey& current_tip, const interfaces::BlockKey& new_tip) override;
+ bool CustomRewind(const interfaces::BlockRef& current_tip, const interfaces::BlockRef& new_tip) override;
BaseIndex::DB& GetDB() const override { return *m_db; }
diff --git a/src/index/disktxpos.h b/src/index/disktxpos.h
index 1004f7ae87..a03638469e 100644
--- a/src/index/disktxpos.h
+++ b/src/index/disktxpos.h
@@ -20,7 +20,7 @@ struct CDiskTxPos : public FlatFilePos
CDiskTxPos(const FlatFilePos &blockIn, unsigned int nTxOffsetIn) : FlatFilePos(blockIn.nFile, blockIn.nPos), nTxOffset(nTxOffsetIn) {
}
- CDiskTxPos() {}
+ CDiskTxPos() = default;
};
#endif // BITCOIN_INDEX_DISKTXPOS_H
diff --git a/src/index/txindex.cpp b/src/index/txindex.cpp
index 80f615ed0e..425a7f00a0 100644
--- a/src/index/txindex.cpp
+++ b/src/index/txindex.cpp
@@ -87,10 +87,7 @@ bool TxIndex::FindTx(const uint256& tx_hash, uint256& block_hash, CTransactionRe
CBlockHeader header;
try {
file >> header;
- if (fseek(file.Get(), postx.nTxOffset, SEEK_CUR)) {
- LogError("%s: fseek(...) failed\n", __func__);
- return false;
- }
+ file.seek(postx.nTxOffset, SEEK_CUR);
file >> TX_WITH_WITNESS(tx);
} catch (const std::exception& e) {
LogError("%s: Deserialize or I/O error - %s\n", __func__, e.what());
diff --git a/src/init.cpp b/src/init.cpp
index 44c256d203..3b8474dd46 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -8,8 +8,6 @@
#include <init.h>
#include <kernel/checks.h>
-#include <kernel/mempool_persist.h>
-#include <kernel/validation_cache_sizes.h>
#include <addrman.h>
#include <banman.h>
@@ -31,6 +29,7 @@
#include <init/common.h>
#include <interfaces/chain.h>
#include <interfaces/init.h>
+#include <interfaces/ipc.h>
#include <interfaces/mining.h>
#include <interfaces/node.h>
#include <kernel/context.h>
@@ -51,10 +50,10 @@
#include <node/interface_ui.h>
#include <node/kernel_notifications.h>
#include <node/mempool_args.h>
+#include <node/mempool_persist.h>
#include <node/mempool_persist_args.h>
#include <node/miner.h>
#include <node/peerman_args.h>
-#include <node/validation_cache_args.h>
#include <policy/feerate.h>
#include <policy/fees.h>
#include <policy/fees_args.h>
@@ -119,23 +118,24 @@
using common::AmountErrMsg;
using common::InvalidPortErrMsg;
using common::ResolveErrMsg;
-using kernel::DumpMempool;
-using kernel::LoadMempool;
-using kernel::ValidationCacheSizes;
using node::ApplyArgsManOptions;
using node::BlockManager;
using node::CacheSizes;
using node::CalculateCacheSizes;
+using node::ChainstateLoadResult;
+using node::ChainstateLoadStatus;
using node::DEFAULT_PERSIST_MEMPOOL;
-using node::DEFAULT_PRINTPRIORITY;
+using node::DEFAULT_PRINT_MODIFIED_FEE;
using node::DEFAULT_STOPATHEIGHT;
+using node::DumpMempool;
+using node::ImportBlocks;
using node::KernelNotifications;
using node::LoadChainstate;
+using node::LoadMempool;
using node::MempoolPath;
using node::NodeContext;
using node::ShouldPersistMempool;
-using node::ImportBlocks;
using node::VerifyLoadedChainstate;
using util::Join;
using util::ReplaceAll;
@@ -150,11 +150,12 @@ static constexpr bool DEFAULT_STOPAFTERBLOCKIMPORT{false};
// Win32 LevelDB doesn't use filedescriptors, and the ones used for
// accessing block files don't count towards the fd_set size limit
// anyway.
-#define MIN_CORE_FILEDESCRIPTORS 0
+#define MIN_LEVELDB_FDS 0
#else
-#define MIN_CORE_FILEDESCRIPTORS 150
+#define MIN_LEVELDB_FDS 150
#endif
+static constexpr int MIN_CORE_FDS = MIN_LEVELDB_FDS + NUM_FDS_MESSAGE_CAPTURE;
static const char* DEFAULT_ASMAP_FILENAME="ip_asn.map";
/**
@@ -285,7 +286,7 @@ void Shutdown(NodeContext& node)
StopHTTPRPC();
StopREST();
- StopRPC();
+ StopRPC(&node);
StopHTTPServer();
for (const auto& client : node.chain_clients) {
client->flush();
@@ -299,10 +300,11 @@ void Shutdown(NodeContext& node)
StopTorControl();
+ if (node.background_init_thread.joinable()) node.background_init_thread.join();
// After everything has been shut down, but before things get flushed, stop the
- // scheduler and load block thread.
+ // the scheduler. After this point, SyncWithValidationInterfaceQueue() should not be called anymore
+ // as this would prevent the shutdown from completing.
if (node.scheduler) node.scheduler->stop();
- if (node.chainman && node.chainman->m_thread_load.joinable()) node.chainman->m_thread_load.join();
// After the threads that potentially access these pointers have been stopped,
// destruct and reset all to nullptr.
@@ -429,21 +431,7 @@ static void registerSignalHandler(int signal, void(*handler)(int))
}
#endif
-static boost::signals2::connection rpc_notify_block_change_connection;
-static void OnRPCStarted()
-{
- rpc_notify_block_change_connection = uiInterface.NotifyBlockTip_connect(std::bind(RPCNotifyBlockChange, std::placeholders::_2));
-}
-
-static void OnRPCStopped()
-{
- rpc_notify_block_change_connection.disconnect();
- RPCNotifyBlockChange(nullptr);
- g_best_block_cv.notify_all();
- LogPrint(BCLog::RPC, "RPC stopped.\n");
-}
-
-void SetupServerArgs(ArgsManager& argsman)
+void SetupServerArgs(ArgsManager& argsman, bool can_listen_ipc)
{
SetupHelpOptions(argsman);
argsman.AddArg("-help-debug", "Print help message with debugging options and exit", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); // server-only for now
@@ -452,10 +440,12 @@ void SetupServerArgs(ArgsManager& argsman)
const auto defaultBaseParams = CreateBaseChainParams(ChainType::MAIN);
const auto testnetBaseParams = CreateBaseChainParams(ChainType::TESTNET);
+ const auto testnet4BaseParams = CreateBaseChainParams(ChainType::TESTNET4);
const auto signetBaseParams = CreateBaseChainParams(ChainType::SIGNET);
const auto regtestBaseParams = CreateBaseChainParams(ChainType::REGTEST);
const auto defaultChainParams = CreateChainParams(argsman, ChainType::MAIN);
const auto testnetChainParams = CreateChainParams(argsman, ChainType::TESTNET);
+ const auto testnet4ChainParams = CreateChainParams(argsman, ChainType::TESTNET4);
const auto signetChainParams = CreateChainParams(argsman, ChainType::SIGNET);
const auto regtestChainParams = CreateChainParams(argsman, ChainType::REGTEST);
@@ -469,8 +459,15 @@ void SetupServerArgs(ArgsManager& argsman)
#if HAVE_SYSTEM
argsman.AddArg("-alertnotify=<cmd>", "Execute command when an alert is raised (%s in cmd is replaced by message)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
#endif
- argsman.AddArg("-assumevalid=<hex>", strprintf("If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: %s, testnet: %s, signet: %s)", defaultChainParams->GetConsensus().defaultAssumeValid.GetHex(), testnetChainParams->GetConsensus().defaultAssumeValid.GetHex(), signetChainParams->GetConsensus().defaultAssumeValid.GetHex()), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
+ argsman.AddArg("-assumevalid=<hex>", strprintf("If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: %s, testnet3: %s, testnet4: %s, signet: %s)", defaultChainParams->GetConsensus().defaultAssumeValid.GetHex(), testnetChainParams->GetConsensus().defaultAssumeValid.GetHex(), testnet4ChainParams->GetConsensus().defaultAssumeValid.GetHex(), signetChainParams->GetConsensus().defaultAssumeValid.GetHex()), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-blocksdir=<dir>", "Specify directory to hold blocks subdirectory for *.dat files (default: <datadir>)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
+ argsman.AddArg("-blocksxor",
+ strprintf("Whether an XOR-key applies to blocksdir *.dat files. "
+ "The created XOR-key will be zeros for an existing blocksdir or when `-blocksxor=0` is "
+ "set, and random for a freshly initialized blocksdir. "
+ "(default: %u)",
+ kernel::DEFAULT_XOR_BLOCKSDIR),
+ ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-fastprune", "Use smaller block files and lower minimum prune height for testing purposes", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
#if HAVE_SYSTEM
argsman.AddArg("-blocknotify=<cmd>", "Execute command when the best block changes (%s in cmd is replaced by block hash)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
@@ -481,14 +478,14 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-conf=<file>", strprintf("Specify path to read-only configuration file. Relative paths will be prefixed by datadir location (only useable from command line, not configuration file) (default: %s)", BITCOIN_CONF_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-dbbatchsize", strprintf("Maximum database write batch size in bytes (default: %u)", nDefaultDbBatchSize), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
- argsman.AddArg("-dbcache=<n>", strprintf("Maximum database cache size <n> MiB (%d to %d, default: %d). In addition, unused mempool memory is shared for this cache (see -maxmempool).", nMinDbCache, nMaxDbCache, nDefaultDbCache), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
+ argsman.AddArg("-dbcache=<n>", strprintf("Maximum database cache size <n> MiB (minimum %d, default: %d). Make sure you have enough RAM. In addition, unused memory allocated to the mempool is shared with this cache (see -maxmempool).", nMinDbCache, nDefaultDbCache), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-includeconf=<file>", "Specify additional configuration file, relative to the -datadir path (only useable from configuration file, not command line)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-allowignoredconf", strprintf("For backwards compatibility, treat an unused %s file in the datadir as a warning, not an error.", BITCOIN_CONF_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-loadblock=<file>", "Imports blocks from external file on startup", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-maxmempool=<n>", strprintf("Keep the transaction memory pool below <n> megabytes (default: %u)", DEFAULT_MAX_MEMPOOL_SIZE_MB), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-maxorphantx=<n>", strprintf("Keep at most <n> unconnectable transactions in memory (default: %u)", DEFAULT_MAX_ORPHAN_TRANSACTIONS), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-mempoolexpiry=<n>", strprintf("Do not keep transactions in the mempool longer than <n> hours (default: %u)", DEFAULT_MEMPOOL_EXPIRY_HOURS), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-minimumchainwork=<hex>", strprintf("Minimum work assumed to exist on a valid chain in hex (default: %s, testnet: %s, signet: %s)", defaultChainParams->GetConsensus().nMinimumChainWork.GetHex(), testnetChainParams->GetConsensus().nMinimumChainWork.GetHex(), signetChainParams->GetConsensus().nMinimumChainWork.GetHex()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
+ argsman.AddArg("-minimumchainwork=<hex>", strprintf("Minimum work assumed to exist on a valid chain in hex (default: %s, testnet3: %s, testnet4: %s, signet: %s)", defaultChainParams->GetConsensus().nMinimumChainWork.GetHex(), testnetChainParams->GetConsensus().nMinimumChainWork.GetHex(), testnet4ChainParams->GetConsensus().nMinimumChainWork.GetHex(), signetChainParams->GetConsensus().nMinimumChainWork.GetHex()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
argsman.AddArg("-par=<n>", strprintf("Set the number of script verification threads (0 = auto, up to %d, <0 = leave that many cores free, default: %d)",
MAX_SCRIPTCHECK_THREADS, DEFAULT_SCRIPTCHECK_THREADS), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-persistmempool", strprintf("Whether to save the mempool on shutdown and load on restart (default: %u)", DEFAULT_PERSIST_MEMPOOL), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
@@ -517,7 +514,7 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-addnode=<ip>", strprintf("Add a node to connect to and attempt to keep the connection open (see the addnode RPC help for more info). This option can be specified multiple times to add multiple nodes; connections are limited to %u at a time and are counted separately from the -maxconnections limit.", MAX_ADDNODE_CONNECTIONS), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
argsman.AddArg("-asmap=<file>", strprintf("Specify asn mapping used for bucketing of the peers (default: %s). Relative paths will be prefixed by the net-specific datadir location.", DEFAULT_ASMAP_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-bantime=<n>", strprintf("Default duration (in seconds) of manually configured bans (default: %u)", DEFAULT_MISBEHAVING_BANTIME), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
- argsman.AddArg("-bind=<addr>[:<port>][=onion]", strprintf("Bind to given address and always listen on it (default: 0.0.0.0). Use [host]:port notation for IPv6. Append =onion to tag any incoming connections to that address and port as incoming Tor connections (default: 127.0.0.1:%u=onion, testnet: 127.0.0.1:%u=onion, signet: 127.0.0.1:%u=onion, regtest: 127.0.0.1:%u=onion)", defaultBaseParams->OnionServiceTargetPort(), testnetBaseParams->OnionServiceTargetPort(), signetBaseParams->OnionServiceTargetPort(), regtestBaseParams->OnionServiceTargetPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
+ argsman.AddArg("-bind=<addr>[:<port>][=onion]", strprintf("Bind to given address and always listen on it (default: 0.0.0.0). Use [host]:port notation for IPv6. Append =onion to tag any incoming connections to that address and port as incoming Tor connections (default: 127.0.0.1:%u=onion, testnet3: 127.0.0.1:%u=onion, testnet4: 127.0.0.1:%u=onion, signet: 127.0.0.1:%u=onion, regtest: 127.0.0.1:%u=onion)", defaultBaseParams->OnionServiceTargetPort(), testnetBaseParams->OnionServiceTargetPort(), testnet4BaseParams->OnionServiceTargetPort(), signetBaseParams->OnionServiceTargetPort(), regtestBaseParams->OnionServiceTargetPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
argsman.AddArg("-cjdnsreachable", "If set, then this host is configured for CJDNS (connecting to fc00::/8 addresses would lead us to the CJDNS network, see doc/cjdns.md) (default: 0)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-connect=<ip>", "Connect only to the specified node; -noconnect disables automatic connections (the rules for this peer are the same as for -addnode). This option can be specified multiple times to connect to multiple nodes.", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
argsman.AddArg("-discover", "Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
@@ -544,7 +541,7 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-peerbloomfilters", strprintf("Support filtering of blocks and transaction with bloom filters (default: %u)", DEFAULT_PEERBLOOMFILTERS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-peerblockfilters", strprintf("Serve compact block filters to peers per BIP 157 (default: %u)", DEFAULT_PEERBLOCKFILTERS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-txreconciliation", strprintf("Enable transaction reconciliations per BIP 330 (default: %d)", DEFAULT_TXRECONCILIATION_ENABLE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CONNECTION);
- argsman.AddArg("-port=<port>", strprintf("Listen for connections on <port> (default: %u, testnet: %u, signet: %u, regtest: %u). Not relevant for I2P (see doc/i2p.md).", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
+ argsman.AddArg("-port=<port>", strprintf("Listen for connections on <port> (default: %u, testnet3: %u, testnet4: %u, signet: %u, regtest: %u). Not relevant for I2P (see doc/i2p.md).", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), testnet4ChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
#ifdef HAVE_SOCKADDR_UN
argsman.AddArg("-proxy=<ip:port|path>", "Connect through SOCKS5 proxy, set -noproxy to disable (default: disabled). May be a local file path prefixed with 'unix:' if the proxy supports it.", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION);
#else
@@ -562,11 +559,7 @@ void SetupServerArgs(ArgsManager& argsman)
#else
hidden_args.emplace_back("-upnp");
#endif
-#ifdef USE_NATPMP
- argsman.AddArg("-natpmp", strprintf("Use NAT-PMP to map the listening port (default: %u)", DEFAULT_NATPMP), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
-#else
- hidden_args.emplace_back("-natpmp");
-#endif // USE_NATPMP
+ argsman.AddArg("-natpmp", strprintf("Use PCP or NAT-PMP to map the listening port (default: %u)", DEFAULT_NATPMP), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-whitebind=<[permissions@]addr>", "Bind to the given address and add permission flags to the peers connecting to it. "
"Use [host]:port notation for IPv6. Allowed permissions: " + Join(NET_PERMISSIONS_DOC, ", ") + ". "
"Specify multiple permissions separated by commas (default: download,noban,mempool,relay). Can be specified multiple times.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
@@ -619,12 +612,12 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-test=<option>", "Pass a test-only option. Options include : " + Join(TEST_OPTIONS_DOC, ", ") + ".", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-capturemessages", "Capture all P2P messages to disk", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + " (default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
- argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_BYTES >> 20), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
+ argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_VALIDATION_CACHE_BYTES >> 20), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-maxtipage=<n>",
strprintf("Maximum tip age in seconds to consider node in initial block download (default: %u)",
Ticks<std::chrono::seconds>(DEFAULT_MAX_TIP_AGE)),
ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
- argsman.AddArg("-printpriority", strprintf("Log transaction fee rate in " + CURRENCY_UNIT + "/kvB when mining blocks (default: %u)", DEFAULT_PRINTPRIORITY), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
+ argsman.AddArg("-printpriority", strprintf("Log transaction fee rate in " + CURRENCY_UNIT + "/kvB when mining blocks (default: %u)", DEFAULT_PRINT_MODIFIED_FEE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-uacomment=<cmt>", "Append comment to the user agent string", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
SetupChainParamsBaseOptions(argsman);
@@ -640,7 +633,7 @@ void SetupServerArgs(ArgsManager& argsman)
"is of this size or less (default: %u)",
MAX_OP_RETURN_RELAY),
ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
- argsman.AddArg("-mempoolfullrbf", strprintf("Accept transaction replace-by-fee without requiring replaceability signaling (default: %u)", DEFAULT_MEMPOOL_FULL_RBF), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
+ argsman.AddArg("-mempoolfullrbf", strprintf("(DEPRECATED) Accept transaction replace-by-fee without requiring replaceability signaling (default: %u)", DEFAULT_MEMPOOL_FULL_RBF), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
argsman.AddArg("-permitbaremultisig", strprintf("Relay transactions creating non-P2SH multisig outputs (default: %u)", DEFAULT_PERMIT_BAREMULTISIG), ArgsManager::ALLOW_ANY,
OptionsCategory::NODE_RELAY);
argsman.AddArg("-minrelaytxfee=<amt>", strprintf("Fees (in %s/kvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)",
@@ -661,7 +654,7 @@ 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("-rpccookieperms=<readable-by>", strprintf("Set permissions on the RPC auth cookie file so that it is readable by [owner|group|all] (default: owner [via umask 0077])"), 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("-rpcport=<port>", strprintf("Listen for JSON-RPC connections on <port> (default: %u, testnet3: %u, testnet4: %u, signet: %u, regtest: %u)", defaultBaseParams->RPCPort(), testnetBaseParams->RPCPort(), testnet4BaseParams->RPCPort(), signetBaseParams->RPCPort(), regtestBaseParams->RPCPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, 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);
@@ -669,6 +662,9 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-rpcwhitelistdefault", "Sets default behavior for rpc whitelisting. Unless rpcwhitelistdefault is set to 0, if any -rpcwhitelist is set, the rpc server acts as if all rpc users are subject to empty-unless-otherwise-specified whitelists. If rpcwhitelistdefault is set to 1 and no -rpcwhitelist is set, rpc server acts as if all rpc users are subject to empty whitelists.", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
argsman.AddArg("-rpcworkqueue=<n>", strprintf("Set the depth of the work queue to service RPC calls (default: %d)", DEFAULT_HTTP_WORKQUEUE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::RPC);
argsman.AddArg("-server", "Accept command line and JSON-RPC commands", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
+ if (can_listen_ipc) {
+ argsman.AddArg("-ipcbind=<address>", "Bind to Unix socket address and listen for incoming connections. Valid address values are \"unix\" to listen on the default path, <datadir>/node.sock, or \"unix:/custom/path\" to specify a custom path. Can be specified multiple times to listen on multiple paths. Default behavior is not to listen on any path. If relative paths are specified, they are interpreted relative to the network data directory. If paths include any parent directory components and the parent directories do not exist, they will be created.", ArgsManager::ALLOW_ANY, OptionsCategory::IPC);
+ }
#if HAVE_DECL_FORK
argsman.AddArg("-daemon", strprintf("Run in the background as a daemon and accept commands (default: %d)", DEFAULT_DAEMON), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
@@ -711,8 +707,6 @@ static void StartupNotify(const ArgsManager& args)
static bool AppInitServers(NodeContext& node)
{
const ArgsManager& args = *Assert(node.args);
- RPCServer::OnStarted(&OnRPCStarted);
- RPCServer::OnStopped(&OnRPCStopped);
if (!InitHTTPServer(*Assert(node.shutdown))) {
return false;
}
@@ -827,8 +821,7 @@ void InitLogging(const ArgsManager& args)
namespace { // Variables internal to initialization process only
int nMaxConnections;
-int nUserMaxConnections;
-int nFD;
+int available_fds;
ServiceFlags nLocalServices = ServiceFlags(NODE_NETWORK_LIMITED | NODE_WITNESS);
int64_t peer_connect_timeout;
std::set<BlockFilterType> g_enabled_filter_types;
@@ -908,6 +901,11 @@ bool AppInitParameterInteraction(const ArgsManager& args)
return InitError(errors);
}
+ // Testnet3 deprecation warning
+ if (chain == ChainType::TESTNET) {
+ LogInfo("Warning: Support for testnet3 is deprecated and will be removed in an upcoming release. Consider switching to testnet4.\n");
+ }
+
// Warn if unrecognized section name are present in the config file.
bilingual_str warnings;
for (const auto& section : args.GetUnrecognizedSections()) {
@@ -975,27 +973,33 @@ bool AppInitParameterInteraction(const ArgsManager& args)
return InitError(Untranslated("Cannot set -listen=0 together with -listenonion=1"));
}
- // Make sure enough file descriptors are available
- int nBind = std::max(nUserBind, size_t(1));
- nUserMaxConnections = args.GetIntArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS);
- nMaxConnections = std::max(nUserMaxConnections, 0);
-
- nFD = RaiseFileDescriptorLimit(nMaxConnections + MIN_CORE_FILEDESCRIPTORS + MAX_ADDNODE_CONNECTIONS + nBind + NUM_FDS_MESSAGE_CAPTURE);
+ // Make sure enough file descriptors are available. We need to reserve enough FDs to account for the bare minimum,
+ // plus all manual connections and all bound interfaces. Any remainder will be available for connection sockets
-#ifdef USE_POLL
- int fd_max = nFD;
-#else
- int fd_max = FD_SETSIZE;
+ // Number of bound interfaces (we have at least one)
+ int nBind = std::max(nUserBind, size_t(1));
+ // Maximum number of connections with other nodes, this accounts for all types of outbounds and inbounds except for manual
+ int user_max_connection = args.GetIntArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS);
+ if (user_max_connection < 0) {
+ return InitError(Untranslated("-maxconnections must be greater or equal than zero"));
+ }
+ // Reserve enough FDs to account for the bare minimum, plus any manual connections, plus the bound interfaces
+ int min_required_fds = MIN_CORE_FDS + MAX_ADDNODE_CONNECTIONS + nBind;
+
+ // Try raising the FD limit to what we need (available_fds may be smaller than the requested amount if this fails)
+ available_fds = RaiseFileDescriptorLimit(user_max_connection + min_required_fds);
+ // If we are using select instead of poll, our actual limit may be even smaller
+#ifndef USE_POLL
+ available_fds = std::min(FD_SETSIZE, available_fds);
#endif
+ if (available_fds < min_required_fds)
+ return InitError(strprintf(_("Not enough file descriptors available. %d available, %d required."), available_fds, min_required_fds));
+
// Trim requested connection counts, to fit into system limitations
- // <int> in std::min<int>(...) to work around FreeBSD compilation issue described in #2695
- nMaxConnections = std::max(std::min<int>(nMaxConnections, fd_max - nBind - MIN_CORE_FILEDESCRIPTORS - MAX_ADDNODE_CONNECTIONS - NUM_FDS_MESSAGE_CAPTURE), 0);
- if (nFD < MIN_CORE_FILEDESCRIPTORS)
- return InitError(_("Not enough file descriptors available."));
- nMaxConnections = std::min(nFD - MIN_CORE_FILEDESCRIPTORS - MAX_ADDNODE_CONNECTIONS - NUM_FDS_MESSAGE_CAPTURE, nMaxConnections);
+ nMaxConnections = std::min(available_fds - min_required_fds, user_max_connection);
- if (nMaxConnections < nUserMaxConnections)
- InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections));
+ if (nMaxConnections < user_max_connection)
+ InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), user_max_connection, nMaxConnections));
// ********************************************************* Step 3: parameter-to-internal-flags
if (auto result{init::SetLoggingCategories(args)}; !result) return InitError(util::ErrorString(result));
@@ -1066,6 +1070,13 @@ bool AppInitParameterInteraction(const ArgsManager& args)
if (!blockman_result) {
return InitError(util::ErrorString(blockman_result));
}
+ CTxMemPool::Options mempool_opts{
+ .check_ratio = chainparams.DefaultConsistencyChecks() ? 1 : 0,
+ };
+ auto mempool_result{ApplyArgsManOptions(args, chainparams, mempool_opts)};
+ if (!mempool_result) {
+ return InitError(util::ErrorString(mempool_result));
+ }
}
return true;
@@ -1123,6 +1134,151 @@ bool AppInitInterfaces(NodeContext& node)
return true;
}
+bool CheckHostPortOptions(const ArgsManager& args) {
+ for (const std::string port_option : {
+ "-port",
+ "-rpcport",
+ }) {
+ if (args.IsArgSet(port_option)) {
+ const std::string port = args.GetArg(port_option, "");
+ uint16_t n;
+ if (!ParseUInt16(port, &n) || n == 0) {
+ return InitError(InvalidPortErrMsg(port_option, port));
+ }
+ }
+ }
+
+ for ([[maybe_unused]] const auto& [arg, unix] : std::vector<std::pair<std::string, bool>>{
+ // arg name UNIX socket support
+ {"-i2psam", false},
+ {"-onion", true},
+ {"-proxy", true},
+ {"-rpcbind", false},
+ {"-torcontrol", false},
+ {"-whitebind", false},
+ {"-zmqpubhashblock", true},
+ {"-zmqpubhashtx", true},
+ {"-zmqpubrawblock", true},
+ {"-zmqpubrawtx", true},
+ {"-zmqpubsequence", true},
+ }) {
+ for (const std::string& socket_addr : args.GetArgs(arg)) {
+ std::string host_out;
+ uint16_t port_out{0};
+ if (!SplitHostPort(socket_addr, port_out, host_out)) {
+#ifdef HAVE_SOCKADDR_UN
+ // Allow unix domain sockets for some options e.g. unix:/some/file/path
+ if (!unix || !socket_addr.starts_with(ADDR_PREFIX_UNIX)) {
+ return InitError(InvalidPortErrMsg(arg, socket_addr));
+ }
+#else
+ return InitError(InvalidPortErrMsg(arg, socket_addr));
+#endif
+ }
+ }
+ }
+
+ return true;
+}
+
+// A GUI user may opt to retry once if there is a failure during chainstate initialization.
+// The function therefore has to support re-entry.
+static ChainstateLoadResult InitAndLoadChainstate(
+ NodeContext& node,
+ bool do_reindex,
+ const bool do_reindex_chainstate,
+ CacheSizes& cache_sizes,
+ const ArgsManager& args)
+{
+ const CChainParams& chainparams = Params();
+ CTxMemPool::Options mempool_opts{
+ .check_ratio = chainparams.DefaultConsistencyChecks() ? 1 : 0,
+ .signals = node.validation_signals.get(),
+ };
+ Assert(ApplyArgsManOptions(args, chainparams, mempool_opts)); // no error can happen, already checked in AppInitParameterInteraction
+ bilingual_str mempool_error;
+ node.mempool = std::make_unique<CTxMemPool>(mempool_opts, mempool_error);
+ if (!mempool_error.empty()) {
+ return {ChainstateLoadStatus::FAILURE_FATAL, mempool_error};
+ }
+ LogPrintf("* Using %.1f MiB for in-memory UTXO set (plus up to %.1f MiB of unused mempool space)\n", cache_sizes.coins * (1.0 / 1024 / 1024), mempool_opts.max_size_bytes * (1.0 / 1024 / 1024));
+ ChainstateManager::Options chainman_opts{
+ .chainparams = chainparams,
+ .datadir = args.GetDataDirNet(),
+ .notifications = *node.notifications,
+ .signals = node.validation_signals.get(),
+ };
+ Assert(ApplyArgsManOptions(args, chainman_opts)); // no error can happen, already checked in AppInitParameterInteraction
+ BlockManager::Options blockman_opts{
+ .chainparams = chainman_opts.chainparams,
+ .blocks_dir = args.GetBlocksDirPath(),
+ .notifications = chainman_opts.notifications,
+ };
+ Assert(ApplyArgsManOptions(args, blockman_opts)); // no error can happen, already checked in AppInitParameterInteraction
+ try {
+ node.chainman = std::make_unique<ChainstateManager>(*Assert(node.shutdown), chainman_opts, blockman_opts);
+ } catch (std::exception& e) {
+ return {ChainstateLoadStatus::FAILURE_FATAL, strprintf(Untranslated("Failed to initialize ChainstateManager: %s"), e.what())};
+ }
+ ChainstateManager& chainman = *node.chainman;
+ // This is defined and set here instead of inline in validation.h to avoid a hard
+ // dependency between validation and index/base, since the latter is not in
+ // libbitcoinkernel.
+ chainman.snapshot_download_completed = [&node]() {
+ if (!node.chainman->m_blockman.IsPruneMode()) {
+ LogPrintf("[snapshot] re-enabling NODE_NETWORK services\n");
+ node.connman->AddLocalServices(NODE_NETWORK);
+ }
+ LogPrintf("[snapshot] restarting indexes\n");
+ // Drain the validation interface queue to ensure that the old indexes
+ // don't have any pending work.
+ Assert(node.validation_signals)->SyncWithValidationInterfaceQueue();
+ for (auto* index : node.indexes) {
+ index->Interrupt();
+ index->Stop();
+ if (!(index->Init() && index->StartBackgroundSync())) {
+ LogPrintf("[snapshot] WARNING failed to restart index %s on snapshot chain\n", index->GetName());
+ }
+ }
+ };
+ node::ChainstateLoadOptions options;
+ options.mempool = Assert(node.mempool.get());
+ options.wipe_block_tree_db = do_reindex;
+ options.wipe_chainstate_db = do_reindex || do_reindex_chainstate;
+ options.prune = chainman.m_blockman.IsPruneMode();
+ options.check_blocks = args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS);
+ options.check_level = args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL);
+ options.require_full_verification = args.IsArgSet("-checkblocks") || args.IsArgSet("-checklevel");
+ options.coins_error_cb = [] {
+ uiInterface.ThreadSafeMessageBox(
+ _("Error reading from database, shutting down."),
+ "", CClientUIInterface::MSG_ERROR);
+ };
+ uiInterface.InitMessage(_("Loading block index…").translated);
+ const auto load_block_index_start_time{SteadyClock::now()};
+ auto catch_exceptions = [](auto&& f) {
+ try {
+ return f();
+ } catch (const std::exception& e) {
+ LogError("%s\n", e.what());
+ return std::make_tuple(node::ChainstateLoadStatus::FAILURE, _("Error opening block database"));
+ }
+ };
+ auto [status, error] = catch_exceptions([&] { return LoadChainstate(chainman, cache_sizes, options); });
+ if (status == node::ChainstateLoadStatus::SUCCESS) {
+ uiInterface.InitMessage(_("Verifying blocks…").translated);
+ if (chainman.m_blockman.m_have_pruned && options.check_blocks > MIN_BLOCKS_TO_KEEP) {
+ 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); });
+ if (status == node::ChainstateLoadStatus::SUCCESS) {
+ LogPrintf(" block index %15dms\n", Ticks<std::chrono::milliseconds>(SteadyClock::now() - load_block_index_start_time));
+ }
+ }
+ return {status, error};
+};
+
bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
{
const ArgsManager& args = *Assert(node.args);
@@ -1143,7 +1299,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
return false;
}
- LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD);
+ LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, available_fds);
// Warn about relative -datadir path.
if (args.IsArgSet("-datadir") && !args.GetPathArg("-datadir").is_absolute()) {
@@ -1154,14 +1310,6 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
args.GetArg("-datadir", ""), fs::PathToString(fs::current_path()));
}
- ValidationCacheSizes validation_cache_sizes{};
- ApplyArgsManOptions(args, validation_cache_sizes);
- if (!InitSignatureCache(validation_cache_sizes.signature_cache_bytes)
- || !InitScriptExecutionCache(validation_cache_sizes.script_execution_cache_bytes))
- {
- return InitError(strprintf(_("Unable to allocate memory for -maxsigcachesize: '%s' MiB"), args.GetIntArg("-maxsigcachesize", DEFAULT_MAX_SIG_CACHE_BYTES >> 20)));
- }
-
assert(!node.scheduler);
node.scheduler = std::make_unique<CScheduler>();
auto& scheduler = *node.scheduler;
@@ -1196,6 +1344,17 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
g_wallet_init_interface.Construct(node);
uiInterface.InitWallet();
+ if (interfaces::Ipc* ipc = node.init->ipc()) {
+ for (std::string address : gArgs.GetArgs("-ipcbind")) {
+ try {
+ ipc->listenAddress(address);
+ } catch (const std::exception& e) {
+ return InitError(strprintf(Untranslated("Unable to bind to IPC address '%s'. %s"), address, e.what()));
+ }
+ LogPrintf("Listening for IPC requests on address %s\n", address);
+ }
+ }
+
/* Register RPC commands regardless of -server setting so they will be
* available in the GUI RPC console even if external calls are disabled.
*/
@@ -1207,6 +1366,9 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
RegisterZMQRPCCommands(tableRPC);
#endif
+ // Check port numbers
+ if (!CheckHostPortOptions(args)) return false;
+
/* Start the RPC server already. It will be started in "warmup" mode
* and not really process calls already (but it will signify connections
* that the server is there and will be ready later). Warmup mode will
@@ -1273,11 +1435,12 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
node.addrman = std::move(*addrman);
}
+ FastRandomContext rng;
assert(!node.banman);
node.banman = std::make_unique<BanMan>(args.GetDataDirNet() / "banlist", &uiInterface, args.GetIntArg("-bantime", DEFAULT_MISBEHAVING_BANTIME));
assert(!node.connman);
- node.connman = std::make_unique<CConnman>(GetRand<uint64_t>(),
- GetRand<uint64_t>(),
+ node.connman = std::make_unique<CConnman>(rng.rand64(),
+ rng.rand64(),
*node.addrman, *node.netgroupman, chainparams, args.GetBoolArg("-networkactive", true));
assert(!node.fee_estimator);
@@ -1296,50 +1459,6 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
validation_signals.RegisterValidationInterface(fee_estimator);
}
- // Check port numbers
- for (const std::string port_option : {
- "-port",
- "-rpcport",
- }) {
- if (args.IsArgSet(port_option)) {
- const std::string port = args.GetArg(port_option, "");
- uint16_t n;
- if (!ParseUInt16(port, &n) || n == 0) {
- return InitError(InvalidPortErrMsg(port_option, port));
- }
- }
- }
-
- for ([[maybe_unused]] const auto& [arg, unix] : std::vector<std::pair<std::string, bool>>{
- // arg name UNIX socket support
- {"-i2psam", false},
- {"-onion", true},
- {"-proxy", true},
- {"-rpcbind", false},
- {"-torcontrol", false},
- {"-whitebind", false},
- {"-zmqpubhashblock", true},
- {"-zmqpubhashtx", true},
- {"-zmqpubrawblock", true},
- {"-zmqpubrawtx", true},
- {"-zmqpubsequence", true},
- }) {
- for (const std::string& socket_addr : args.GetArgs(arg)) {
- std::string host_out;
- uint16_t port_out{0};
- if (!SplitHostPort(socket_addr, port_out, host_out)) {
-#ifdef HAVE_SOCKADDR_UN
- // Allow unix domain sockets for some options e.g. unix:/some/file/path
- if (!unix || socket_addr.find(ADDR_PREFIX_UNIX) != 0) {
- return InitError(InvalidPortErrMsg(arg, socket_addr));
- }
-#else
- return InitError(InvalidPortErrMsg(arg, socket_addr));
-#endif
- }
- }
- }
-
for (const std::string& socket_addr : args.GetArgs("-bind")) {
std::string host_out;
uint16_t port_out{0};
@@ -1491,20 +1610,6 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
node.notifications = std::make_unique<KernelNotifications>(*Assert(node.shutdown), node.exit_status, *Assert(node.warnings));
ReadNotificationArgs(args, *node.notifications);
- ChainstateManager::Options chainman_opts{
- .chainparams = chainparams,
- .datadir = args.GetDataDirNet(),
- .notifications = *node.notifications,
- .signals = &validation_signals,
- };
- Assert(ApplyArgsManOptions(args, chainman_opts)); // no error can happen, already checked in AppInitParameterInteraction
-
- BlockManager::Options blockman_opts{
- .chainparams = chainman_opts.chainparams,
- .blocks_dir = args.GetBlocksDirPath(),
- .notifications = chainman_opts.notifications,
- };
- Assert(ApplyArgsManOptions(args, blockman_opts)); // no error can happen, already checked in AppInitParameterInteraction
// cache size calculations
CacheSizes cache_sizes = CalculateCacheSizes(args, g_enabled_filter_types.size());
@@ -1523,110 +1628,39 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
assert(!node.mempool);
assert(!node.chainman);
- CTxMemPool::Options mempool_opts{
- .check_ratio = chainparams.DefaultConsistencyChecks() ? 1 : 0,
- .signals = &validation_signals,
- };
- auto result{ApplyArgsManOptions(args, chainparams, mempool_opts)};
- if (!result) {
- return InitError(util::ErrorString(result));
- }
-
bool do_reindex{args.GetBoolArg("-reindex", false)};
const bool do_reindex_chainstate{args.GetBoolArg("-reindex-chainstate", false)};
- for (bool fLoaded = false; !fLoaded && !ShutdownRequested(node);) {
- bilingual_str mempool_error;
- node.mempool = std::make_unique<CTxMemPool>(mempool_opts, mempool_error);
- if (!mempool_error.empty()) {
- return InitError(mempool_error);
- }
- LogPrintf("* Using %.1f MiB for in-memory UTXO set (plus up to %.1f MiB of unused mempool space)\n", cache_sizes.coins * (1.0 / 1024 / 1024), mempool_opts.max_size_bytes * (1.0 / 1024 / 1024));
-
- node.chainman = std::make_unique<ChainstateManager>(*Assert(node.shutdown), chainman_opts, blockman_opts);
- ChainstateManager& chainman = *node.chainman;
-
- // This is defined and set here instead of inline in validation.h to avoid a hard
- // dependency between validation and index/base, since the latter is not in
- // libbitcoinkernel.
- chainman.restart_indexes = [&node]() {
- LogPrintf("[snapshot] restarting indexes\n");
-
- // Drain the validation interface queue to ensure that the old indexes
- // don't have any pending work.
- Assert(node.validation_signals)->SyncWithValidationInterfaceQueue();
-
- for (auto* index : node.indexes) {
- index->Interrupt();
- index->Stop();
- if (!(index->Init() && index->StartBackgroundSync())) {
- LogPrintf("[snapshot] WARNING failed to restart index %s on snapshot chain\n", index->GetName());
- }
- }
- };
-
- node::ChainstateLoadOptions options;
- options.mempool = Assert(node.mempool.get());
- options.wipe_block_tree_db = do_reindex;
- options.wipe_chainstate_db = do_reindex || do_reindex_chainstate;
- options.prune = chainman.m_blockman.IsPruneMode();
- options.check_blocks = args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS);
- options.check_level = args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL);
- options.require_full_verification = args.IsArgSet("-checkblocks") || args.IsArgSet("-checklevel");
- options.coins_error_cb = [] {
- uiInterface.ThreadSafeMessageBox(
- _("Error reading from database, shutting down."),
- "", CClientUIInterface::MSG_ERROR);
- };
-
- uiInterface.InitMessage(_("Loading block index…").translated);
- const auto load_block_index_start_time{SteadyClock::now()};
- auto catch_exceptions = [](auto&& f) {
- try {
- return f();
- } catch (const std::exception& e) {
- LogError("%s\n", e.what());
- return std::make_tuple(node::ChainstateLoadStatus::FAILURE, _("Error opening block database"));
- }
- };
- auto [status, error] = catch_exceptions([&]{ return LoadChainstate(chainman, cache_sizes, options); });
- if (status == node::ChainstateLoadStatus::SUCCESS) {
- uiInterface.InitMessage(_("Verifying blocks…").translated);
- if (chainman.m_blockman.m_have_pruned && options.check_blocks > MIN_BLOCKS_TO_KEEP) {
- 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);});
- if (status == node::ChainstateLoadStatus::SUCCESS) {
- fLoaded = true;
- LogPrintf(" block index %15dms\n", Ticks<std::chrono::milliseconds>(SteadyClock::now() - load_block_index_start_time));
- }
- }
-
- if (status == node::ChainstateLoadStatus::FAILURE_FATAL || status == node::ChainstateLoadStatus::FAILURE_INCOMPATIBLE_DB || status == node::ChainstateLoadStatus::FAILURE_INSUFFICIENT_DBCACHE) {
- return InitError(error);
+ // Chainstate initialization and loading may be retried once with reindexing by GUI users
+ auto [status, error] = InitAndLoadChainstate(
+ node,
+ do_reindex,
+ do_reindex_chainstate,
+ cache_sizes,
+ args);
+ if (status == ChainstateLoadStatus::FAILURE && !do_reindex && !ShutdownRequested(node)) {
+ // suggest a reindex
+ bool do_retry = uiInterface.ThreadSafeQuestion(
+ error + Untranslated(".\n\n") + _("Do you want to rebuild the block database now?"),
+ error.original + ".\nPlease restart with -reindex or -reindex-chainstate to recover.",
+ "", CClientUIInterface::MSG_ERROR | CClientUIInterface::BTN_ABORT);
+ if (!do_retry) {
+ LogError("Aborted block database rebuild. Exiting.\n");
+ return false;
}
-
- if (!fLoaded && !ShutdownRequested(node)) {
- // first suggest a reindex
- if (!do_reindex) {
- bool fRet = uiInterface.ThreadSafeQuestion(
- error + Untranslated(".\n\n") + _("Do you want to rebuild the block database now?"),
- error.original + ".\nPlease restart with -reindex or -reindex-chainstate to recover.",
- "", CClientUIInterface::MSG_ERROR | CClientUIInterface::BTN_ABORT);
- if (fRet) {
- do_reindex = true;
- if (!Assert(node.shutdown)->reset()) {
- LogError("Internal error: failed to reset shutdown signal.\n");
- }
- } else {
- LogError("Aborted block database rebuild. Exiting.\n");
- return false;
- }
- } else {
- return InitError(error);
- }
+ do_reindex = true;
+ if (!Assert(node.shutdown)->reset()) {
+ LogError("Internal error: failed to reset shutdown signal.\n");
}
+ std::tie(status, error) = InitAndLoadChainstate(
+ node,
+ do_reindex,
+ do_reindex_chainstate,
+ cache_sizes,
+ args);
+ }
+ if (status != ChainstateLoadStatus::SUCCESS && status != ChainstateLoadStatus::INTERRUPTED) {
+ return InitError(error);
}
// As LoadBlockIndex can take several minutes, it's possible the user
@@ -1686,8 +1720,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
}
}
} else {
- LogPrintf("Setting NODE_NETWORK on non-prune mode\n");
- nLocalServices = ServiceFlags(nLocalServices | NODE_NETWORK);
+ // Prior to setting NODE_NETWORK, check if we can provide historical blocks.
+ if (!WITH_LOCK(chainman.GetMutex(), return chainman.BackgroundSyncInProgress())) {
+ LogPrintf("Setting NODE_NETWORK on non-prune mode\n");
+ nLocalServices = ServiceFlags(nLocalServices | NODE_NETWORK);
+ } else {
+ LogPrintf("Running node in NODE_NETWORK_LIMITED mode until snapshot background sync completes\n");
+ }
}
// ********************************************************* Step 11: import blocks
@@ -1749,7 +1788,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
vImportFiles.push_back(fs::PathFromString(strFile));
}
- chainman.m_thread_load = std::thread(&util::TraceThread, "initload", [=, &chainman, &args, &node] {
+ node.background_init_thread = std::thread(&util::TraceThread, "initload", [=, &chainman, &args, &node] {
ScheduleBatchPriority();
// Import blocks
ImportBlocks(chainman, vImportFiles);
@@ -1812,7 +1851,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
LogPrintf("nBestHeight = %d\n", 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.
+ // Map ports with UPnP or NAT-PMP
StartMapPort(args.GetBoolArg("-upnp", DEFAULT_UPNP), args.GetBoolArg("-natpmp", DEFAULT_NATPMP));
CConnman::Options connOptions;
@@ -1890,6 +1929,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
CService onion_service_target;
if (!connOptions.onion_binds.empty()) {
onion_service_target = connOptions.onion_binds.front();
+ } else if (!connOptions.vBinds.empty()) {
+ onion_service_target = connOptions.vBinds.front();
} else {
onion_service_target = DefaultOnionServiceTarget();
connOptions.onion_binds.push_back(onion_service_target);
@@ -1969,11 +2010,6 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// cannot yet be called. Before we make it callable, we need to make sure
// that the RPC's view of the best block is valid and consistent with
// ChainstateManager's active tip.
- //
- // If we do not do this, RPC's view of the best block will be height=0 and
- // hash=0x0. This will lead to erroroneous responses for things like
- // waitforblockheight.
- RPCNotifyBlockChange(WITH_LOCK(chainman.GetMutex(), return chainman.ActiveTip()));
SetRPCWarmupFinished();
uiInterface.InitMessage(_("Done loading").translated);
diff --git a/src/init.h b/src/init.h
index ead5f5e0d2..6d8a35d80e 100644
--- a/src/init.h
+++ b/src/init.h
@@ -6,9 +6,7 @@
#ifndef BITCOIN_INIT_H
#define BITCOIN_INIT_H
-#include <any>
-#include <memory>
-#include <string>
+#include <atomic>
//! Default value for -daemon option
static constexpr bool DEFAULT_DAEMON = false;
@@ -76,7 +74,7 @@ bool AppInitMain(node::NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip
/**
* Register all arguments with the ArgsManager
*/
-void SetupServerArgs(ArgsManager& argsman);
+void SetupServerArgs(ArgsManager& argsman, bool can_listen_ipc=false);
/** Validates requirements to run the indexes and spawns each index initial sync thread */
bool StartIndexBackgroundSync(node::NodeContext& node);
diff --git a/src/init/bitcoin-gui.cpp b/src/init/bitcoin-gui.cpp
index aceff1e40f..eae30bc995 100644
--- a/src/init/bitcoin-gui.cpp
+++ b/src/init/bitcoin-gui.cpp
@@ -34,6 +34,11 @@ public:
}
std::unique_ptr<interfaces::Echo> makeEcho() override { return interfaces::MakeEcho(); }
interfaces::Ipc* ipc() override { return m_ipc.get(); }
+ // bitcoin-gui accepts -ipcbind option even though it does not use it
+ // directly. It just returns true here to accept the option because
+ // bitcoin-node accepts the option, and bitcoin-gui accepts all bitcoin-node
+ // options and will start the node with those options.
+ bool canListenIpc() override { return true; }
node::NodeContext m_node;
std::unique_ptr<interfaces::Ipc> m_ipc;
};
diff --git a/src/init/bitcoin-node.cpp b/src/init/bitcoin-node.cpp
index 00a3822791..3f8c50b8d6 100644
--- a/src/init/bitcoin-node.cpp
+++ b/src/init/bitcoin-node.cpp
@@ -37,6 +37,7 @@ public:
}
std::unique_ptr<interfaces::Echo> makeEcho() override { return interfaces::MakeEcho(); }
interfaces::Ipc* ipc() override { return m_ipc.get(); }
+ bool canListenIpc() override { return true; }
node::NodeContext& m_node;
std::unique_ptr<interfaces::Ipc> m_ipc;
};
diff --git a/src/init/common.cpp b/src/init/common.cpp
index 00ef879dc1..36142c2b9a 100644
--- a/src/init/common.cpp
+++ b/src/init/common.cpp
@@ -27,9 +27,9 @@ void AddLoggingArgs(ArgsManager& argsman)
{
argsman.AddArg("-debuglogfile=<file>", strprintf("Specify location of debug log file (default: %s). Relative paths will be prefixed by a net-specific datadir location. Pass -nodebuglogfile to disable writing the log to a file.", DEFAULT_DEBUGLOGFILE), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-debug=<category>", "Output debug and trace logging (default: -nodebug, supplying <category> is optional). "
- "If <category> is not supplied or if <category> = 1, output all debug and trace logging. <category> can be: " + LogInstance().LogCategoriesString() + ". This option can be specified multiple times to output multiple categories.",
+ "If <category> is not supplied or if <category> is 1 or \"all\", output all debug logging. If <category> is 0 or \"none\", any other categories are ignored. Other valid values for <category> are: " + LogInstance().LogCategoriesString() + ". This option can be specified multiple times to output multiple categories.",
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("-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. This takes priority over \"-debug\"", 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. 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);
diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h
index 9da5cb9637..4e858d1f89 100644
--- a/src/interfaces/chain.h
+++ b/src/interfaces/chain.h
@@ -41,12 +41,6 @@ namespace interfaces {
class Handler;
class Wallet;
-//! Hash/height pair to help track and identify blocks.
-struct BlockKey {
- uint256 hash;
- int height = -1;
-};
-
//! Helper for findBlock to selectively return pieces of block data. If block is
//! found, data will be returned by setting specified output variables. If block
//! is not found, output variables will keep their previous values.
@@ -96,6 +90,17 @@ struct BlockInfo {
BlockInfo(const uint256& hash LIFETIMEBOUND) : hash(hash) {}
};
+//! The action to be taken after updating a settings value.
+//! WRITE indicates that the updated value must be written to disk,
+//! while SKIP_WRITE indicates that the change will be kept in memory-only
+//! without persisting it.
+enum class SettingsAction {
+ WRITE,
+ SKIP_WRITE
+};
+
+using SettingsUpdate = std::function<std::optional<interfaces::SettingsAction>(common::SettingsValue&)>;
+
//! Interface giving clients (wallet processes, maybe other analysis tools in
//! the future) ability to access to the chain state, receive notifications,
//! estimate fees, and submit transactions.
@@ -123,7 +128,7 @@ struct BlockInfo {
class Chain
{
public:
- virtual ~Chain() {}
+ virtual ~Chain() = default;
//! Get current chain height, not including genesis block (returns 0 if
//! chain only contains genesis block, nullopt if chain does not contain
@@ -309,7 +314,7 @@ public:
class Notifications
{
public:
- virtual ~Notifications() {}
+ virtual ~Notifications() = default;
virtual void transactionAddedToMempool(const CTransactionRef& tx) {}
virtual void transactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason) {}
virtual void blockConnected(ChainstateRole role, const BlockInfo& block) {}
@@ -344,9 +349,23 @@ public:
//! Return <datadir>/settings.json setting value.
virtual common::SettingsValue getRwSetting(const std::string& name) = 0;
- //! Write a setting to <datadir>/settings.json. Optionally just update the
- //! setting in memory and do not write the file.
- virtual bool updateRwSetting(const std::string& name, const common::SettingsValue& value, bool write=true) = 0;
+ //! Updates a setting in <datadir>/settings.json.
+ //! Null can be passed to erase the setting. There is intentionally no
+ //! support for writing null values to settings.json.
+ //! Depending on the action returned by the update function, this will either
+ //! update the setting in memory or write the updated settings to disk.
+ virtual bool updateRwSetting(const std::string& name, const SettingsUpdate& update_function) = 0;
+
+ //! Replace a setting in <datadir>/settings.json with a new value.
+ //! Null can be passed to erase the setting.
+ //! This method provides a simpler alternative to updateRwSetting when
+ //! atomically reading and updating the setting is not required.
+ virtual bool overwriteRwSetting(const std::string& name, common::SettingsValue value, SettingsAction action = SettingsAction::WRITE) = 0;
+
+ //! Delete a given setting in <datadir>/settings.json.
+ //! This method provides a simpler alternative to overwriteRwSetting when
+ //! erasing a setting, for ease of use and readability.
+ virtual bool deleteRwSettings(const std::string& name, SettingsAction action = SettingsAction::WRITE) = 0;
//! Synchronously send transactionAddedToMempool notifications about all
//! current mempool transactions to the specified handler and return after
@@ -371,7 +390,7 @@ public:
class ChainClient
{
public:
- virtual ~ChainClient() {}
+ virtual ~ChainClient() = default;
//! Register rpcs.
virtual void registerRpcs() = 0;
diff --git a/src/interfaces/echo.h b/src/interfaces/echo.h
index 5578d9d9e6..964dbb02fa 100644
--- a/src/interfaces/echo.h
+++ b/src/interfaces/echo.h
@@ -13,7 +13,7 @@ namespace interfaces {
class Echo
{
public:
- virtual ~Echo() {}
+ virtual ~Echo() = default;
//! Echo provided string.
virtual std::string echo(const std::string& echo) = 0;
diff --git a/src/interfaces/handler.h b/src/interfaces/handler.h
index 7751d82347..6fc14ed0b4 100644
--- a/src/interfaces/handler.h
+++ b/src/interfaces/handler.h
@@ -22,7 +22,7 @@ namespace interfaces {
class Handler
{
public:
- virtual ~Handler() {}
+ virtual ~Handler() = default;
//! Disconnect the handler.
virtual void disconnect() = 0;
diff --git a/src/interfaces/init.h b/src/interfaces/init.h
index 094ead399d..b496ada05f 100644
--- a/src/interfaces/init.h
+++ b/src/interfaces/init.h
@@ -37,6 +37,7 @@ public:
virtual std::unique_ptr<WalletLoader> makeWalletLoader(Chain& chain) { return nullptr; }
virtual std::unique_ptr<Echo> makeEcho() { return nullptr; }
virtual Ipc* ipc() { return nullptr; }
+ virtual bool canListenIpc() { return false; }
};
//! Return implementation of Init interface for the node process. If the argv
diff --git a/src/interfaces/ipc.h b/src/interfaces/ipc.h
index 963649fc9a..fb340552c5 100644
--- a/src/interfaces/ipc.h
+++ b/src/interfaces/ipc.h
@@ -41,6 +41,11 @@ class Init;
//! to make other proxy objects calling other remote interfaces. It can also
//! destroy the initial interfaces::Init object to close the connection and
//! shut down the spawned process.
+//!
+//! When connecting to an existing process, the steps are similar to spawning a
+//! new process, except a socket is created instead of a socketpair, and
+//! destroying an Init interface doesn't end the process, since there can be
+//! multiple connections.
class Ipc
{
public:
@@ -54,6 +59,17 @@ public:
//! true. If this is not a spawned child process, return false.
virtual bool startSpawnedProcess(int argc, char* argv[], int& exit_status) = 0;
+ //! Connect to a socket address and make a client interface proxy object
+ //! using provided callback. connectAddress returns an interface pointer if
+ //! the connection was established, returns null if address is empty ("") or
+ //! disabled ("0") or if a connection was refused but not required ("auto"),
+ //! and throws an exception if there was an unexpected error.
+ virtual std::unique_ptr<Init> connectAddress(std::string& address) = 0;
+
+ //! Connect to a socket address and make a client interface proxy object
+ //! using provided callback. Throws an exception if there was an error.
+ virtual void listenAddress(std::string& address) = 0;
+
//! Add cleanup callback to remote interface that will run when the
//! interface is deleted.
template<typename Interface>
diff --git a/src/interfaces/mining.h b/src/interfaces/mining.h
index 7d71a01450..421c5ba762 100644
--- a/src/interfaces/mining.h
+++ b/src/interfaces/mining.h
@@ -5,28 +5,51 @@
#ifndef BITCOIN_INTERFACES_MINING_H
#define BITCOIN_INTERFACES_MINING_H
-#include <memory>
-#include <optional>
-#include <uint256.h>
+#include <consensus/amount.h> // for CAmount
+#include <interfaces/types.h> // for BlockRef
+#include <node/types.h> // for BlockCreateOptions
+#include <primitives/block.h> // for CBlock, CBlockHeader
+#include <primitives/transaction.h> // for CTransactionRef
+#include <stdint.h> // for int64_t
+#include <uint256.h> // for uint256
+#include <util/time.h> // for MillisecondsDouble
+
+#include <memory> // for unique_ptr, shared_ptr
+#include <optional> // for optional
+#include <vector> // for vector
namespace node {
-struct CBlockTemplate;
struct NodeContext;
} // namespace node
class BlockValidationState;
-class CBlock;
class CScript;
namespace interfaces {
+//! Block template interface
+class BlockTemplate
+{
+public:
+ virtual ~BlockTemplate() = default;
+
+ virtual CBlockHeader getBlockHeader() = 0;
+ virtual CBlock getBlock() = 0;
+
+ virtual std::vector<CAmount> getTxFees() = 0;
+ virtual std::vector<int64_t> getTxSigops() = 0;
+
+ virtual CTransactionRef getCoinbaseTx() = 0;
+ virtual std::vector<unsigned char> getCoinbaseCommitment() = 0;
+ virtual int getWitnessCommitmentIndex() = 0;
+};
+
//! Interface giving clients (RPC, Stratum v2 Template Provider in the future)
//! ability to create block templates.
-
class Mining
{
public:
- virtual ~Mining() {}
+ virtual ~Mining() = default;
//! If this chain is exclusively used for testing
virtual bool isTestChain() = 0;
@@ -34,17 +57,28 @@ public:
//! Returns whether IBD is still in progress.
virtual bool isInitialBlockDownload() = 0;
- //! Returns the hash for the tip of this chain
- virtual std::optional<uint256> getTipHash() = 0;
+ //! Returns the hash and height for the tip of this chain
+ virtual std::optional<BlockRef> getTip() = 0;
+
+ /**
+ * Waits for the tip to change
+ *
+ * @param[in] current_tip block hash of the current chain tip. Function waits
+ * for the chain tip to change if this matches, otherwise
+ * it returns right away.
+ * @param[in] timeout how long to wait for a new tip
+ * @returns Hash and height of the current chain tip after this call.
+ */
+ virtual BlockRef waitTipChanged(uint256 current_tip, MillisecondsDouble timeout = MillisecondsDouble::max()) = 0;
/**
* Construct a new block template
*
* @param[in] script_pub_key the coinbase output
- * @param[in] use_mempool set false to omit mempool transactions
+ * @param[in] options options for creating the block
* @returns a block template
*/
- virtual std::unique_ptr<node::CBlockTemplate> createNewBlock(const CScript& script_pub_key, bool use_mempool = true) = 0;
+ virtual std::unique_ptr<BlockTemplate> createNewBlock(const CScript& script_pub_key, const node::BlockCreateOptions& options = {}) = 0;
/**
* Processes new block. A valid new block is automatically relayed to peers.
diff --git a/src/interfaces/node.h b/src/interfaces/node.h
index 2bb895dd47..91a623a65d 100644
--- a/src/interfaces/node.h
+++ b/src/interfaces/node.h
@@ -7,6 +7,7 @@
#include <common/settings.h>
#include <consensus/amount.h> // For CAmount
+#include <logging.h> // For BCLog::CategoryMask
#include <net.h> // For NodeId
#include <net_types.h> // For banmap_t
#include <netaddress.h> // For Network
@@ -59,7 +60,7 @@ struct BlockAndHeaderTipInfo
class ExternalSigner
{
public:
- virtual ~ExternalSigner() {};
+ virtual ~ExternalSigner() = default;
//! Get signer display name
virtual std::string getName() = 0;
@@ -69,7 +70,7 @@ public:
class Node
{
public:
- virtual ~Node() {}
+ virtual ~Node() = default;
//! Init logging.
virtual void initLogging() = 0;
@@ -84,7 +85,7 @@ public:
virtual int getExitStatus() = 0;
// Get log flags.
- virtual uint32_t getLogCategories() = 0;
+ virtual BCLog::CategoryMask getLogCategories() = 0;
//! Initialize app dependencies.
virtual bool baseInitialize() = 0;
@@ -120,7 +121,7 @@ public:
virtual void resetSettings() = 0;
//! Map port.
- virtual void mapPort(bool use_upnp, bool use_natpmp) = 0;
+ virtual void mapPort(bool use_upnp, bool use_pcp) = 0;
//! Get proxy.
virtual bool getProxy(Network net, Proxy& proxy_info) = 0;
@@ -162,12 +163,18 @@ public:
//! Get mempool dynamic usage.
virtual size_t getMempoolDynamicUsage() = 0;
+ //! Get mempool maximum memory usage.
+ virtual size_t getMempoolMaxUsage() = 0;
+
//! Get header tip height and time.
virtual bool getHeaderTip(int& height, int64_t& block_time) = 0;
//! Get num blocks.
virtual int getNumBlocks() = 0;
+ //! Get network local addresses.
+ virtual std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses() = 0;
+
//! Get best block hash.
virtual uint256 getBestBlockHash() = 0;
diff --git a/src/interfaces/types.h b/src/interfaces/types.h
new file mode 100644
index 0000000000..e5edd301a7
--- /dev/null
+++ b/src/interfaces/types.h
@@ -0,0 +1,20 @@
+// 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.
+
+#ifndef BITCOIN_INTERFACES_TYPES_H
+#define BITCOIN_INTERFACES_TYPES_H
+
+#include <uint256.h>
+
+namespace interfaces {
+
+//! Hash/height pair to help track and identify blocks.
+struct BlockRef {
+ uint256 hash;
+ int height = -1;
+};
+
+} // namespace interfaces
+
+#endif // BITCOIN_INTERFACES_TYPES_H
diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h
index f7bcca58cf..df1ced48a7 100644
--- a/src/interfaces/wallet.h
+++ b/src/interfaces/wallet.h
@@ -65,7 +65,7 @@ using WalletValueMap = std::map<std::string, std::string>;
class Wallet
{
public:
- virtual ~Wallet() {}
+ virtual ~Wallet() = default;
//! Encrypt wallet.
virtual bool encryptWallet(const SecureString& wallet_passphrase) = 0;
@@ -342,8 +342,11 @@ public:
//! Migrate a wallet
virtual util::Result<WalletMigrationResult> migrateWallet(const std::string& name, const SecureString& passphrase) = 0;
+ //! Returns true if wallet stores encryption keys
+ virtual bool isEncrypted(const std::string& wallet_name) = 0;
+
//! Return available wallets in wallet directory.
- virtual std::vector<std::string> listWalletDir() = 0;
+ virtual std::vector<std::pair<std::string, std::string>> listWalletDir() = 0;
//! Return interfaces for accessing wallets (if any).
virtual std::vector<std::unique_ptr<Wallet>> getWallets() = 0;
diff --git a/src/ipc/CMakeLists.txt b/src/ipc/CMakeLists.txt
new file mode 100644
index 0000000000..904d72f56e
--- /dev/null
+++ b/src/ipc/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(bitcoin_ipc STATIC EXCLUDE_FROM_ALL
+ capnp/mining.cpp
+ capnp/protocol.cpp
+ interfaces.cpp
+ process.cpp
+)
+
+target_capnp_sources(bitcoin_ipc ${PROJECT_SOURCE_DIR}
+ capnp/common.capnp
+ capnp/echo.capnp
+ capnp/init.capnp
+ capnp/mining.capnp
+)
+
+target_link_libraries(bitcoin_ipc
+ PRIVATE
+ core_interface
+ univalue
+)
diff --git a/src/ipc/capnp/.gitignore b/src/ipc/capnp/.gitignore
deleted file mode 100644
index 036df1430c..0000000000
--- a/src/ipc/capnp/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# capnp generated files
-*.capnp.*
diff --git a/src/ipc/capnp/common-types.h b/src/ipc/capnp/common-types.h
index 39e368491b..51af6a5f0a 100644
--- a/src/ipc/capnp/common-types.h
+++ b/src/ipc/capnp/common-types.h
@@ -6,6 +6,9 @@
#define BITCOIN_IPC_CAPNP_COMMON_TYPES_H
#include <clientversion.h>
+#include <interfaces/types.h>
+#include <primitives/transaction.h>
+#include <serialize.h>
#include <streams.h>
#include <univalue.h>
@@ -16,33 +19,24 @@
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;
-};
+//! Construct a ParamStream wrapping a data stream with serialization parameters
+//! needed to pass transaction objects between bitcoin processes.
+//! In the future, more params may be added here to serialize other objects that
+//! require serialization parameters. Params should just be chosen to serialize
+//! objects completely and ensure that serializing and deserializing objects
+//! with the specified parameters produces equivalent objects. It's also
+//! harmless to specify serialization parameters here that are not used.
+template <typename S>
+auto Wrap(S& s)
+{
+ return ParamsStream{s, TX_WITH_WITNESS};
+}
-//! Use SFINAE to define Unserializeable<T> trait which is true if type T has
-//! an Unserialize(stream) method, false otherwise.
+//! Detect if type has a deserialize_type constructor, which is
+//! used to deserialize types like CTransaction that can't be unserialized into
+//! existing objects because they are immutable.
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;
-};
+concept Deserializable = std::is_constructible_v<T, ::deserialize_type, ::DataStream&>;
} // namespace capnp
} // namespace ipc
@@ -50,42 +44,78 @@ public:
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
+//! capnproto 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)
+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.
+requires Serializable<LocalType, DataStream> && std::is_same_v<LocalType, std::remove_cv_t<std::remove_reference_t<LocalType>>>
{
DataStream stream;
- value.Serialize(stream);
+ auto wrapper{ipc::capnp::Wrap(stream)};
+ value.Serialize(wrapper);
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
+//! returned from capnproto 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)
+decltype(auto) CustomReadField(TypeList<LocalType>, Priority<1>, InvokeContext& invoke_context, Input&& input, ReadDest&& read_dest)
+requires Unserializable<LocalType, DataStream> && (!ipc::capnp::Deserializable<LocalType>)
{
return read_dest.update([&](auto& value) {
if (!input.has()) return;
auto data = input.get();
SpanReader stream({data.begin(), data.end()});
- value.Unserialize(stream);
+ auto wrapper{ipc::capnp::Wrap(stream)};
+ value.Unserialize(wrapper);
});
}
+//! Overload multiprocess library's CustomReadField hook to allow any object
+//! with a deserialize constructor to be read from a capnproto Data field or
+//! returned from capnproto 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)
+requires ipc::capnp::Deserializable<LocalType>
+{
+ assert(input.has());
+ auto data = input.get();
+ SpanReader stream({data.begin(), data.end()});
+ auto wrapper{ipc::capnp::Wrap(stream)};
+ return read_dest.construct(::deserialize, wrapper);
+}
+
+//! Overload CustomBuildField and CustomReadField to serialize std::chrono
+//! parameters and return values as numbers.
+template <class Rep, class Period, typename Value, typename Output>
+void CustomBuildField(TypeList<std::chrono::duration<Rep, Period>>, Priority<1>, InvokeContext& invoke_context, Value&& value,
+ Output&& output)
+{
+ static_assert(std::numeric_limits<decltype(output.get())>::lowest() <= std::numeric_limits<Rep>::lowest(),
+ "capnp type does not have enough range to hold lowest std::chrono::duration value");
+ static_assert(std::numeric_limits<decltype(output.get())>::max() >= std::numeric_limits<Rep>::max(),
+ "capnp type does not have enough range to hold highest std::chrono::duration value");
+ output.set(value.count());
+}
+
+template <class Rep, class Period, typename Input, typename ReadDest>
+decltype(auto) CustomReadField(TypeList<std::chrono::duration<Rep, Period>>, Priority<1>, InvokeContext& invoke_context,
+ Input&& input, ReadDest&& read_dest)
+{
+ return read_dest.construct(input.get());
+}
+
+//! Overload CustomBuildField and CustomReadField to serialize UniValue
+//! parameters and return values as JSON strings.
template <typename Value, typename Output>
void CustomBuildField(TypeList<UniValue>, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output)
{
@@ -103,6 +133,33 @@ decltype(auto) CustomReadField(TypeList<UniValue>, Priority<1>, InvokeContext& i
value.read(std::string_view{data.begin(), data.size()});
});
}
+
+//! Generic ::capnp::Data field builder for any C++ type that can be converted
+//! to a span of bytes, like std::vector<char> or std::array<uint8_t>, or custom
+//! blob types like uint256 or PKHash with data() and size() methods pointing to
+//! bytes.
+//!
+//! Note: it might make sense to move this function into libmultiprocess, since
+//! it is fairly generic. However this would require decreasing its priority so
+//! it can be overridden, which would require more changes inside
+//! libmultiprocess to avoid conflicting with the Priority<1> CustomBuildField
+//! function it already provides for std::vector. Also, it might make sense to
+//! provide a CustomReadField counterpart to this function, which could be
+//! called to read C++ types that can be constructed from spans of bytes from
+//! ::capnp::Data fields. But so far there hasn't been a need for this.
+template <typename LocalType, typename Value, typename Output>
+void CustomBuildField(TypeList<LocalType>, Priority<2>, InvokeContext& invoke_context, Value&& value, Output&& output)
+requires
+ (std::is_same_v<decltype(output.get()), ::capnp::Data::Builder>) &&
+ (std::convertible_to<Value, std::span<const std::byte>> ||
+ std::convertible_to<Value, std::span<const char>> ||
+ std::convertible_to<Value, std::span<const unsigned char>> ||
+ std::convertible_to<Value, std::span<const signed char>>)
+{
+ auto data = std::span{value};
+ auto result = output.init(data.size());
+ memcpy(result.begin(), data.data(), data.size());
+}
} // namespace mp
#endif // BITCOIN_IPC_CAPNP_COMMON_TYPES_H
diff --git a/src/ipc/capnp/common.capnp b/src/ipc/capnp/common.capnp
new file mode 100644
index 0000000000..b3359f3f07
--- /dev/null
+++ b/src/ipc/capnp/common.capnp
@@ -0,0 +1,16 @@
+# 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.
+
+@0xcd2c6232cb484a28;
+
+using Cxx = import "/capnp/c++.capnp";
+$Cxx.namespace("ipc::capnp::messages");
+
+using Proxy = import "/mp/proxy.capnp";
+$Proxy.includeTypes("ipc/capnp/common-types.h");
+
+struct BlockRef $Proxy.wrap("interfaces::BlockRef") {
+ hash @0 :Data;
+ height @1 :Int32;
+}
diff --git a/src/ipc/capnp/init-types.h b/src/ipc/capnp/init-types.h
index 42031441b5..c3ddca27c0 100644
--- a/src/ipc/capnp/init-types.h
+++ b/src/ipc/capnp/init-types.h
@@ -6,5 +6,6 @@
#define BITCOIN_IPC_CAPNP_INIT_TYPES_H
#include <ipc/capnp/echo.capnp.proxy-types.h>
+#include <ipc/capnp/mining.capnp.proxy-types.h>
#endif // BITCOIN_IPC_CAPNP_INIT_TYPES_H
diff --git a/src/ipc/capnp/init.capnp b/src/ipc/capnp/init.capnp
index e6d358c665..1001ee5336 100644
--- a/src/ipc/capnp/init.capnp
+++ b/src/ipc/capnp/init.capnp
@@ -10,11 +10,14 @@ $Cxx.namespace("ipc::capnp::messages");
using Proxy = import "/mp/proxy.capnp";
$Proxy.include("interfaces/echo.h");
$Proxy.include("interfaces/init.h");
+$Proxy.include("interfaces/mining.h");
$Proxy.includeTypes("ipc/capnp/init-types.h");
using Echo = import "echo.capnp";
+using Mining = import "mining.capnp";
interface Init $Proxy.wrap("interfaces::Init") {
construct @0 (threadMap: Proxy.ThreadMap) -> (threadMap :Proxy.ThreadMap);
makeEcho @1 (context :Proxy.Context) -> (result :Echo.Echo);
+ makeMining @2 (context :Proxy.Context) -> (result :Mining.Mining);
}
diff --git a/src/ipc/capnp/mining-types.h b/src/ipc/capnp/mining-types.h
new file mode 100644
index 0000000000..2e60b43fcf
--- /dev/null
+++ b/src/ipc/capnp/mining-types.h
@@ -0,0 +1,26 @@
+// 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.
+
+#ifndef BITCOIN_IPC_CAPNP_MINING_TYPES_H
+#define BITCOIN_IPC_CAPNP_MINING_TYPES_H
+
+#include <interfaces/mining.h>
+#include <ipc/capnp/common.capnp.proxy-types.h>
+#include <ipc/capnp/common-types.h>
+#include <ipc/capnp/mining.capnp.proxy.h>
+#include <node/miner.h>
+#include <node/types.h>
+#include <validation.h>
+
+namespace mp {
+// Custom serialization for BlockValidationState.
+void CustomBuildMessage(InvokeContext& invoke_context,
+ const BlockValidationState& src,
+ ipc::capnp::messages::BlockValidationState::Builder&& builder);
+void CustomReadMessage(InvokeContext& invoke_context,
+ const ipc::capnp::messages::BlockValidationState::Reader& reader,
+ BlockValidationState& dest);
+} // namespace mp
+
+#endif // BITCOIN_IPC_CAPNP_MINING_TYPES_H
diff --git a/src/ipc/capnp/mining.capnp b/src/ipc/capnp/mining.capnp
new file mode 100644
index 0000000000..4ea69d16c9
--- /dev/null
+++ b/src/ipc/capnp/mining.capnp
@@ -0,0 +1,50 @@
+# 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.
+
+@0xc77d03df6a41b505;
+
+using Cxx = import "/capnp/c++.capnp";
+$Cxx.namespace("ipc::capnp::messages");
+
+using Common = import "common.capnp";
+using Proxy = import "/mp/proxy.capnp";
+$Proxy.include("interfaces/mining.h");
+$Proxy.includeTypes("ipc/capnp/mining-types.h");
+
+interface Mining $Proxy.wrap("interfaces::Mining") {
+ isTestChain @0 (context :Proxy.Context) -> (result: Bool);
+ isInitialBlockDownload @1 (context :Proxy.Context) -> (result: Bool);
+ getTip @2 (context :Proxy.Context) -> (result: Common.BlockRef, hasResult: Bool);
+ waitTipChanged @3 (context :Proxy.Context, currentTip: Data, timeout: Float64) -> (result: Common.BlockRef);
+ createNewBlock @4 (scriptPubKey: Data, options: BlockCreateOptions) -> (result: BlockTemplate);
+ processNewBlock @5 (context :Proxy.Context, block: Data) -> (newBlock: Bool, result: Bool);
+ getTransactionsUpdated @6 (context :Proxy.Context) -> (result: UInt32);
+ testBlockValidity @7 (context :Proxy.Context, block: Data, checkMerkleRoot: Bool) -> (state: BlockValidationState, result: Bool);
+}
+
+interface BlockTemplate $Proxy.wrap("interfaces::BlockTemplate") {
+ getBlockHeader @0 (context: Proxy.Context) -> (result: Data);
+ getBlock @1 (context: Proxy.Context) -> (result: Data);
+ getTxFees @2 (context: Proxy.Context) -> (result: List(Int64));
+ getTxSigops @3 (context: Proxy.Context) -> (result: List(Int64));
+ getCoinbaseTx @4 (context: Proxy.Context) -> (result: Data);
+ getCoinbaseCommitment @5 (context: Proxy.Context) -> (result: Data);
+ getWitnessCommitmentIndex @6 (context: Proxy.Context) -> (result: Int32);
+}
+
+struct BlockCreateOptions $Proxy.wrap("node::BlockCreateOptions") {
+ useMempool @0 :Bool $Proxy.name("use_mempool");
+ coinbaseMaxAdditionalWeight @1 :UInt64 $Proxy.name("coinbase_max_additional_weight");
+ coinbaseOutputMaxAdditionalSigops @2 :UInt64 $Proxy.name("coinbase_output_max_additional_sigops");
+}
+
+# Note: serialization of the BlockValidationState C++ type is somewhat fragile
+# and using the struct can be awkward. It would be good if testBlockValidity
+# method were changed to return validity information in a simpler format.
+struct BlockValidationState {
+ mode @0 :Int32;
+ result @1 :Int32;
+ rejectReason @2 :Text;
+ debugMessage @3 :Text;
+}
diff --git a/src/ipc/capnp/mining.cpp b/src/ipc/capnp/mining.cpp
new file mode 100644
index 0000000000..0f9533c1c7
--- /dev/null
+++ b/src/ipc/capnp/mining.cpp
@@ -0,0 +1,47 @@
+// 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.
+
+#include <ipc/capnp/mining-types.h>
+#include <ipc/capnp/mining.capnp.proxy-types.h>
+
+#include <mp/proxy-types.h>
+
+namespace mp {
+void CustomBuildMessage(InvokeContext& invoke_context,
+ const BlockValidationState& src,
+ ipc::capnp::messages::BlockValidationState::Builder&& builder)
+{
+ if (src.IsValid()) {
+ builder.setMode(0);
+ } else if (src.IsInvalid()) {
+ builder.setMode(1);
+ } else if (src.IsError()) {
+ builder.setMode(2);
+ } else {
+ assert(false);
+ }
+ builder.setResult(static_cast<int>(src.GetResult()));
+ builder.setRejectReason(src.GetRejectReason());
+ builder.setDebugMessage(src.GetDebugMessage());
+}
+
+void CustomReadMessage(InvokeContext& invoke_context,
+ const ipc::capnp::messages::BlockValidationState::Reader& reader,
+ BlockValidationState& dest)
+{
+ if (reader.getMode() == 0) {
+ assert(reader.getResult() == 0);
+ assert(reader.getRejectReason().size() == 0);
+ assert(reader.getDebugMessage().size() == 0);
+ } else if (reader.getMode() == 1) {
+ dest.Invalid(static_cast<BlockValidationResult>(reader.getResult()), reader.getRejectReason(), reader.getDebugMessage());
+ } else if (reader.getMode() == 2) {
+ assert(reader.getResult() == 0);
+ dest.Error(reader.getRejectReason());
+ assert(reader.getDebugMessage().size() == 0);
+ } else {
+ assert(false);
+ }
+}
+} // namespace mp
diff --git a/src/ipc/capnp/protocol.cpp b/src/ipc/capnp/protocol.cpp
index 37b57a9525..4b67a5bd1e 100644
--- a/src/ipc/capnp/protocol.cpp
+++ b/src/ipc/capnp/protocol.cpp
@@ -23,6 +23,8 @@
#include <mutex>
#include <optional>
#include <string>
+#include <sys/socket.h>
+#include <system_error>
#include <thread>
namespace ipc {
@@ -30,7 +32,7 @@ namespace capnp {
namespace {
void IpcLogFn(bool raise, std::string message)
{
- LogPrint(BCLog::IPC, "%s\n", message);
+ LogDebug(BCLog::IPC, "%s\n", message);
if (raise) throw Exception(message);
}
@@ -51,11 +53,20 @@ public:
startLoop(exe_name);
return mp::ConnectStream<messages::Init>(*m_loop, fd);
}
- void serve(int fd, const char* exe_name, interfaces::Init& init) override
+ void listen(int listen_fd, const char* exe_name, interfaces::Init& init) override
+ {
+ startLoop(exe_name);
+ if (::listen(listen_fd, /*backlog=*/5) != 0) {
+ throw std::system_error(errno, std::system_category());
+ }
+ mp::ListenConnections<messages::Init>(*m_loop, listen_fd, init);
+ }
+ void serve(int fd, const char* exe_name, interfaces::Init& init, const std::function<void()>& ready_fn = {}) override
{
assert(!m_loop);
mp::g_thread_context.thread_name = mp::ThreadName(exe_name);
m_loop.emplace(exe_name, &IpcLogFn, &m_context);
+ if (ready_fn) ready_fn();
mp::ServeStream<messages::Init>(*m_loop, fd, init);
m_loop->loop();
m_loop.reset();
diff --git a/src/ipc/interfaces.cpp b/src/ipc/interfaces.cpp
index e446cc98db..33555f05d4 100644
--- a/src/ipc/interfaces.cpp
+++ b/src/ipc/interfaces.cpp
@@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <common/args.h>
#include <common/system.h>
#include <interfaces/init.h>
#include <interfaces/ipc.h>
@@ -37,11 +38,11 @@ public:
{
int pid;
int fd = m_process->spawn(new_exe_name, m_process_argv0, pid);
- LogPrint(::BCLog::IPC, "Process %s pid %i launched\n", new_exe_name, pid);
+ LogDebug(::BCLog::IPC, "Process %s pid %i launched\n", new_exe_name, pid);
auto init = m_protocol->connect(fd, m_exe_name);
Ipc::addCleanup(*init, [this, new_exe_name, pid] {
int status = m_process->waitSpawned(pid);
- LogPrint(::BCLog::IPC, "Process %s pid %i exited with status %i\n", new_exe_name, pid, status);
+ LogDebug(::BCLog::IPC, "Process %s pid %i exited with status %i\n", new_exe_name, pid, status);
});
return init;
}
@@ -56,6 +57,35 @@ public:
exit_status = EXIT_SUCCESS;
return true;
}
+ std::unique_ptr<interfaces::Init> connectAddress(std::string& address) override
+ {
+ if (address.empty() || address == "0") return nullptr;
+ int fd;
+ if (address == "auto") {
+ // Treat "auto" the same as "unix" except don't treat it an as error
+ // if the connection is not accepted. Just return null so the caller
+ // can work offline without a connection, or spawn a new
+ // bitcoin-node process and connect to it.
+ address = "unix";
+ try {
+ fd = m_process->connect(gArgs.GetDataDirNet(), "bitcoin-node", address);
+ } catch (const std::system_error& e) {
+ // If connection type is auto and socket path isn't accepting connections, or doesn't exist, catch the error and return null;
+ if (e.code() == std::errc::connection_refused || e.code() == std::errc::no_such_file_or_directory) {
+ return nullptr;
+ }
+ throw;
+ }
+ } else {
+ fd = m_process->connect(gArgs.GetDataDirNet(), "bitcoin-node", address);
+ }
+ return m_protocol->connect(fd, m_exe_name);
+ }
+ void listenAddress(std::string& address) override
+ {
+ int fd = m_process->bind(gArgs.GetDataDirNet(), m_exe_name, address);
+ m_protocol->listen(fd, m_exe_name, m_init);
+ }
void addCleanup(std::type_index type, void* iface, std::function<void()> cleanup) override
{
m_protocol->addCleanup(type, iface, std::move(cleanup));
diff --git a/src/ipc/process.cpp b/src/ipc/process.cpp
index 9657dcd092..432c365d8f 100644
--- a/src/ipc/process.cpp
+++ b/src/ipc/process.cpp
@@ -4,22 +4,28 @@
#include <ipc/process.h>
#include <ipc/protocol.h>
+#include <logging.h>
#include <mp/util.h>
#include <tinyformat.h>
#include <util/fs.h>
#include <util/strencodings.h>
+#include <util/syserror.h>
#include <cstdint>
#include <cstdlib>
+#include <errno.h>
#include <exception>
#include <iostream>
#include <stdexcept>
#include <string.h>
-#include <system_error>
+#include <sys/socket.h>
+#include <sys/un.h>
#include <unistd.h>
#include <utility>
#include <vector>
+using util::RemovePrefixView;
+
namespace ipc {
namespace {
class ProcessImpl : public Process
@@ -54,7 +60,95 @@ public:
}
return true;
}
+ int connect(const fs::path& data_dir,
+ const std::string& dest_exe_name,
+ std::string& address) override;
+ int bind(const fs::path& data_dir, const std::string& exe_name, std::string& address) override;
};
+
+static bool ParseAddress(std::string& address,
+ const fs::path& data_dir,
+ const std::string& dest_exe_name,
+ struct sockaddr_un& addr,
+ std::string& error)
+{
+ if (address.compare(0, 4, "unix") == 0 && (address.size() == 4 || address[4] == ':')) {
+ fs::path path;
+ if (address.size() <= 5) {
+ path = data_dir / fs::PathFromString(strprintf("%s.sock", RemovePrefixView(dest_exe_name, "bitcoin-")));
+ } else {
+ path = data_dir / fs::PathFromString(address.substr(5));
+ }
+ std::string path_str = fs::PathToString(path);
+ address = strprintf("unix:%s", path_str);
+ if (path_str.size() >= sizeof(addr.sun_path)) {
+ error = strprintf("Unix address path %s exceeded maximum socket path length", fs::quoted(fs::PathToString(path)));
+ return false;
+ }
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, path_str.c_str(), sizeof(addr.sun_path)-1);
+ return true;
+ }
+
+ error = strprintf("Unrecognized address '%s'", address);
+ return false;
+}
+
+int ProcessImpl::connect(const fs::path& data_dir,
+ const std::string& dest_exe_name,
+ std::string& address)
+{
+ struct sockaddr_un addr;
+ std::string error;
+ if (!ParseAddress(address, data_dir, dest_exe_name, addr, error)) {
+ throw std::invalid_argument(error);
+ }
+
+ int fd;
+ if ((fd = ::socket(addr.sun_family, SOCK_STREAM, 0)) == -1) {
+ throw std::system_error(errno, std::system_category());
+ }
+ if (::connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) {
+ return fd;
+ }
+ int connect_error = errno;
+ if (::close(fd) != 0) {
+ LogPrintf("Error closing file descriptor %i '%s': %s\n", fd, address, SysErrorString(errno));
+ }
+ throw std::system_error(connect_error, std::system_category());
+}
+
+int ProcessImpl::bind(const fs::path& data_dir, const std::string& exe_name, std::string& address)
+{
+ struct sockaddr_un addr;
+ std::string error;
+ if (!ParseAddress(address, data_dir, exe_name, addr, error)) {
+ throw std::invalid_argument(error);
+ }
+
+ if (addr.sun_family == AF_UNIX) {
+ fs::path path = addr.sun_path;
+ if (path.has_parent_path()) fs::create_directories(path.parent_path());
+ if (fs::symlink_status(path).type() == fs::file_type::socket) {
+ fs::remove(path);
+ }
+ }
+
+ int fd;
+ if ((fd = ::socket(addr.sun_family, SOCK_STREAM, 0)) == -1) {
+ throw std::system_error(errno, std::system_category());
+ }
+
+ if (::bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) {
+ return fd;
+ }
+ int bind_error = errno;
+ if (::close(fd) != 0) {
+ LogPrintf("Error closing file descriptor %i: %s\n", fd, SysErrorString(errno));
+ }
+ throw std::system_error(bind_error, std::system_category());
+}
} // namespace
std::unique_ptr<Process> MakeProcess() { return std::make_unique<ProcessImpl>(); }
diff --git a/src/ipc/process.h b/src/ipc/process.h
index 40f2d2acf6..2ed8b73fab 100644
--- a/src/ipc/process.h
+++ b/src/ipc/process.h
@@ -34,6 +34,16 @@ public:
//! process. If so, return true and a file descriptor for communicating
//! with the parent process.
virtual bool checkSpawned(int argc, char* argv[], int& fd) = 0;
+
+ //! Canonicalize and connect to address, returning socket descriptor.
+ virtual int connect(const fs::path& data_dir,
+ const std::string& dest_exe_name,
+ std::string& address) = 0;
+
+ //! Create listening socket, bind and canonicalize address, and return socket descriptor.
+ virtual int bind(const fs::path& data_dir,
+ const std::string& exe_name,
+ std::string& address) = 0;
};
//! Constructor for Process interface. Implementation will vary depending on
diff --git a/src/ipc/protocol.h b/src/ipc/protocol.h
index 4cd892e411..b2ebf99e8c 100644
--- a/src/ipc/protocol.h
+++ b/src/ipc/protocol.h
@@ -25,12 +25,38 @@ public:
//! Return Init interface that forwards requests over given socket descriptor.
//! Socket communication is handled on a background thread.
+ //!
+ //! @note It could be potentially useful in the future to add
+ //! std::function<void()> on_disconnect callback argument here. But there
+ //! isn't an immediate need, because the protocol implementation can clean
+ //! up its own state (calling ProxyServer destructors, etc) on disconnect,
+ //! and any client calls will just throw ipc::Exception errors after a
+ //! disconnect.
virtual std::unique_ptr<interfaces::Init> connect(int fd, const char* exe_name) = 0;
+ //! Listen for connections on provided socket descriptor, accept them, and
+ //! handle requests on accepted connections. This method doesn't block, and
+ //! performs I/O on a background thread.
+ virtual void listen(int listen_fd, const char* exe_name, interfaces::Init& init) = 0;
+
//! Handle requests on provided socket descriptor, forwarding them to the
//! provided Init interface. Socket communication is handled on the
//! current thread, and this call blocks until the socket is closed.
- virtual void serve(int fd, const char* exe_name, interfaces::Init& init) = 0;
+ //!
+ //! @note: If this method is called, it needs be called before connect() or
+ //! listen() methods, because for ease of implementation it's inflexible and
+ //! always runs the event loop in the foreground thread. It can share its
+ //! event loop with the other methods but can't share an event loop that was
+ //! created by them. This isn't really a problem because serve() is only
+ //! called by spawned child processes that call it immediately to
+ //! communicate back with parent processes.
+ //
+ //! The optional `ready_fn` callback will be called after the event loop is
+ //! created but before it is started. This can be useful in tests to trigger
+ //! client connections from another thread as soon as the event loop is
+ //! available, but should not be neccessary in normal code which starts
+ //! clients and servers independently.
+ virtual void serve(int fd, const char* exe_name, interfaces::Init& init, const std::function<void()>& ready_fn = {}) = 0;
//! Add cleanup callback to interface that will run when the interface is
//! deleted.
diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt
new file mode 100644
index 0000000000..65d753b3af
--- /dev/null
+++ b/src/kernel/CMakeLists.txt
@@ -0,0 +1,146 @@
+# Copyright (c) 2024-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+# TODO: libbitcoinkernel is a work in progress consensus engine
+# library, as more and more modules are decoupled from the
+# consensus engine, this list will shrink to only those
+# which are absolutely necessary.
+add_library(bitcoinkernel
+ bitcoinkernel.cpp
+ chain.cpp
+ checks.cpp
+ chainparams.cpp
+ coinstats.cpp
+ context.cpp
+ cs_main.cpp
+ disconnected_transactions.cpp
+ mempool_removal_reason.cpp
+ ../arith_uint256.cpp
+ ../chain.cpp
+ ../coins.cpp
+ ../compressor.cpp
+ ../consensus/merkle.cpp
+ ../consensus/tx_check.cpp
+ ../consensus/tx_verify.cpp
+ ../core_read.cpp
+ ../dbwrapper.cpp
+ ../deploymentinfo.cpp
+ ../deploymentstatus.cpp
+ ../flatfile.cpp
+ ../hash.cpp
+ ../logging.cpp
+ ../node/blockstorage.cpp
+ ../node/chainstate.cpp
+ ../node/utxo_snapshot.cpp
+ ../policy/feerate.cpp
+ ../policy/packages.cpp
+ ../policy/policy.cpp
+ ../policy/rbf.cpp
+ ../policy/settings.cpp
+ ../policy/truc_policy.cpp
+ ../pow.cpp
+ ../primitives/block.cpp
+ ../primitives/transaction.cpp
+ ../pubkey.cpp
+ ../random.cpp
+ ../randomenv.cpp
+ ../script/interpreter.cpp
+ ../script/script.cpp
+ ../script/script_error.cpp
+ ../script/sigcache.cpp
+ ../script/solver.cpp
+ ../signet.cpp
+ ../streams.cpp
+ ../support/lockedpool.cpp
+ ../sync.cpp
+ ../txdb.cpp
+ ../txmempool.cpp
+ ../uint256.cpp
+ ../util/chaintype.cpp
+ ../util/check.cpp
+ ../util/feefrac.cpp
+ ../util/fs.cpp
+ ../util/fs_helpers.cpp
+ ../util/hasher.cpp
+ ../util/moneystr.cpp
+ ../util/rbf.cpp
+ ../util/serfloat.cpp
+ ../util/signalinterrupt.cpp
+ ../util/strencodings.cpp
+ ../util/string.cpp
+ ../util/syserror.cpp
+ ../util/threadnames.cpp
+ ../util/time.cpp
+ ../util/tokenpipe.cpp
+ ../validation.cpp
+ ../validationinterface.cpp
+ ../versionbits.cpp
+)
+target_link_libraries(bitcoinkernel
+ PRIVATE
+ core_interface
+ bitcoin_clientversion
+ bitcoin_crypto
+ leveldb
+ secp256k1
+ PUBLIC
+ Boost::headers
+)
+
+# libbitcoinkernel requires default symbol visibility, explicitly
+# specify that here so that things still work even when user
+# configures with -DREDUCE_EXPORTS=ON
+#
+# Note this is a quick hack that will be removed as we
+# incrementally define what to export from the library.
+set_target_properties(bitcoinkernel PROPERTIES
+ CXX_VISIBILITY_PRESET default
+)
+
+# When building the static library, install all static libraries the
+# bitcoinkernel depends on.
+if(NOT BUILD_SHARED_LIBS)
+ # Recursively get all the static libraries a target depends on and put them in libs_out
+ function(get_target_static_link_libs target libs_out)
+ get_target_property(linked_libraries ${target} LINK_LIBRARIES)
+ foreach(dep ${linked_libraries})
+ if(TARGET ${dep})
+ get_target_property(dep_type ${dep} TYPE)
+ if(dep_type STREQUAL "STATIC_LIBRARY")
+ list(APPEND ${libs_out} ${dep})
+ get_target_static_link_libs(${dep} ${libs_out})
+ endif()
+ endif()
+ endforeach()
+ set(${libs_out} ${${libs_out}} PARENT_SCOPE)
+ endfunction()
+
+ set(all_kernel_static_link_libs "")
+ get_target_static_link_libs(bitcoinkernel all_kernel_static_link_libs)
+
+ # LIBS_PRIVATE is substituted in the pkg-config file.
+ set(LIBS_PRIVATE "")
+ foreach(lib ${all_kernel_static_link_libs})
+ install(TARGETS ${lib} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+ string(APPEND LIBS_PRIVATE " -l${lib}")
+ endforeach()
+
+ string(STRIP "${LIBS_PRIVATE}" LIBS_PRIVATE)
+endif()
+
+configure_file(${PROJECT_SOURCE_DIR}/libbitcoinkernel.pc.in ${PROJECT_BINARY_DIR}/libbitcoinkernel.pc @ONLY)
+install(FILES ${PROJECT_BINARY_DIR}/libbitcoinkernel.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+
+include(GNUInstallDirs)
+install(TARGETS bitcoinkernel
+ RUNTIME
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
+ COMPONENT Kernel
+ LIBRARY
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ COMPONENT Kernel
+ ARCHIVE
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ COMPONENT Kernel
+)
diff --git a/src/kernel/blockmanager_opts.h b/src/kernel/blockmanager_opts.h
index deeba7e318..261ec3be58 100644
--- a/src/kernel/blockmanager_opts.h
+++ b/src/kernel/blockmanager_opts.h
@@ -14,12 +14,15 @@ class CChainParams;
namespace kernel {
+static constexpr bool DEFAULT_XOR_BLOCKSDIR{true};
+
/**
* An options struct for `BlockManager`, more ergonomically referred to as
* `BlockManager::Options` due to the using-declaration in `BlockManager`.
*/
struct BlockManagerOpts {
const CChainParams& chainparams;
+ bool use_xor{DEFAULT_XOR_BLOCKSDIR};
uint64_t prune_target{0};
bool fast_prune{false};
const fs::path blocks_dir;
diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp
index bf3a340cb8..0f128d4c56 100644
--- a/src/kernel/chainparams.cpp
+++ b/src/kernel/chainparams.cpp
@@ -26,6 +26,18 @@
#include <cstring>
#include <type_traits>
+using namespace util::hex_literals;
+
+// Workaround MSVC bug triggering C7595 when calling consteval constructors in
+// initializer lists.
+// A fix may be on the way:
+// https://developercommunity.visualstudio.com/t/consteval-conversion-function-fails/1579014
+#if defined(_MSC_VER)
+auto consteval_ctor(auto&& input) { return input; }
+#else
+#define consteval_ctor(input) (input)
+#endif
+
static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
CMutableTransaction txNew;
@@ -61,7 +73,7 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
- const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
+ const CScript genesisOutputScript = CScript() << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex << OP_CHECKSIG;
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}
@@ -76,20 +88,21 @@ public:
consensus.signet_challenge.clear();
consensus.nSubsidyHalvingInterval = 210000;
consensus.script_flag_exceptions.emplace( // BIP16 exception
- uint256S("0x00000000000002dc756eebf4f49723ed8d30cc28a5f108eb94b1ba88ac4f9c22"), SCRIPT_VERIFY_NONE);
+ uint256{"00000000000002dc756eebf4f49723ed8d30cc28a5f108eb94b1ba88ac4f9c22"}, SCRIPT_VERIFY_NONE);
consensus.script_flag_exceptions.emplace( // Taproot exception
- uint256S("0x0000000000000000000f14c35b2d841e986ab5441de8c585d5ffe55ea1e395ad"), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS);
+ uint256{"0000000000000000000f14c35b2d841e986ab5441de8c585d5ffe55ea1e395ad"}, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS);
consensus.BIP34Height = 227931;
- consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
+ consensus.BIP34Hash = uint256{"000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"};
consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931
consensus.CSVHeight = 419328; // 000000000000000004a1b34462cb8aeebd5799177f7a29cf28f2d1961716b5b5
consensus.SegwitHeight = 481824; // 0000000000000000001c8018d9cb3b742ef25114f27563e3fc4a1902167f9893
consensus.MinBIP9WarningHeight = 483840; // segwit activation height + miner confirmation window
- consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
+ consensus.powLimit = uint256{"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = false;
+ consensus.enforce_BIP94 = false;
consensus.fPowNoRetargeting = false;
consensus.nRuleChangeActivationThreshold = 1815; // 90% of 2016
consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
@@ -104,8 +117,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("0x000000000000000000000000000000000000000063c4ebd298db40af57541800");
- consensus.defaultAssumeValid = uint256S("0x000000000000000000026811d149d4d261995ec5b3f64f439a0a10e1a464af9a"); // 824000
+ consensus.nMinimumChainWork = uint256{"000000000000000000000000000000000000000088e186b70e0862c193ec44d6"};
+ consensus.defaultAssumeValid = uint256{"000000000000000000011c5890365bdbe5d25b97ce0057589acaef4f1a57263f"}; // 856760
/**
* The message start string is designed to be unlikely to occur in normal data.
@@ -118,13 +131,13 @@ public:
pchMessageStart[3] = 0xd9;
nDefaultPort = 8333;
nPruneAfterHeight = 100000;
- m_assumed_blockchain_size = 600;
- m_assumed_chain_state_size = 10;
+ m_assumed_blockchain_size = 620;
+ m_assumed_chain_state_size = 14;
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
- assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
- assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
+ assert(consensus.hashGenesisBlock == uint256{"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"});
+ assert(genesis.hashMerkleRoot == uint256{"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"});
// Note that of those which support the service bits prefix, most only support a subset of
// possible options.
@@ -134,7 +147,6 @@ public:
vSeeds.emplace_back("seed.bitcoin.sipa.be."); // Pieter Wuille, only supports x1, x5, x9, and xd
vSeeds.emplace_back("dnsseed.bluematt.me."); // Matt Corallo, only supports x9
vSeeds.emplace_back("dnsseed.bitcoin.dashjr-list-of-p2p-nodes.us."); // Luke Dashjr
- vSeeds.emplace_back("seed.bitcoinstats.com."); // Christian Decker, supports x1 - xf
vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch."); // Jonas Schnelli, only supports x1, x5, x9, and xd
vSeeds.emplace_back("seed.btc.petertodd.net."); // Peter Todd, only supports x1, x5, x9, and xd
vSeeds.emplace_back("seed.bitcoin.sprovoost.nl."); // Sjors Provoost
@@ -157,31 +169,36 @@ public:
checkpointData = {
{
- { 11111, uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")},
- { 33333, uint256S("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")},
- { 74000, uint256S("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")},
- {105000, uint256S("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97")},
- {134444, uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")},
- {168000, uint256S("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763")},
- {193000, uint256S("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317")},
- {210000, uint256S("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e")},
- {216116, uint256S("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e")},
- {225430, uint256S("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932")},
- {250000, uint256S("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214")},
- {279000, uint256S("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40")},
- {295000, uint256S("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983")},
+ { 11111, uint256{"0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d"}},
+ { 33333, uint256{"000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6"}},
+ { 74000, uint256{"0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20"}},
+ {105000, uint256{"00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97"}},
+ {134444, uint256{"00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe"}},
+ {168000, uint256{"000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763"}},
+ {193000, uint256{"000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317"}},
+ {210000, uint256{"000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e"}},
+ {216116, uint256{"00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"}},
+ {225430, uint256{"00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"}},
+ {250000, uint256{"000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"}},
+ {279000, uint256{"0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40"}},
+ {295000, uint256{"00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983"}},
}
};
m_assumeutxo_data = {
- // TODO to be specified in a future patch.
+ {
+ .height = 840'000,
+ .hash_serialized = AssumeutxoHash{uint256{"a2a5521b1b5ab65f67818e5e8eccabb7171a517f9e2382208f77687310768f96"}},
+ .m_chain_tx_count = 991032194,
+ .blockhash = consteval_ctor(uint256{"0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5"}),
+ }
};
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 000000000000000000026811d149d4d261995ec5b3f64f439a0a10e1a464af9a
- .nTime = 1704194835,
- .nTxCount = 946728933,
- .dTxRate = 6.569290261471664,
+ // Data from RPC: getchaintxstats 4096 000000000000000000011c5890365bdbe5d25b97ce0057589acaef4f1a57263f
+ .nTime = 1723649144,
+ .tx_count = 1059312821,
+ .dTxRate = 6.721086701157182,
};
}
};
@@ -197,18 +214,19 @@ public:
consensus.signet_challenge.clear();
consensus.nSubsidyHalvingInterval = 210000;
consensus.script_flag_exceptions.emplace( // BIP16 exception
- uint256S("0x00000000dd30457c001f4095d208cc1296b0eed002427aa599874af7a432b105"), SCRIPT_VERIFY_NONE);
+ uint256{"00000000dd30457c001f4095d208cc1296b0eed002427aa599874af7a432b105"}, SCRIPT_VERIFY_NONE);
consensus.BIP34Height = 21111;
- consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");
+ consensus.BIP34Hash = uint256{"0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"};
consensus.BIP65Height = 581885; // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6
consensus.BIP66Height = 330776; // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182
consensus.CSVHeight = 770112; // 00000000025e930139bac5c6c31a403776da130831ab85be56578f3fa75369bb
consensus.SegwitHeight = 834624; // 00000000002b980fcd729daaa248fd9316a5200e9b367f4ff2c42453e84201ca
consensus.MinBIP9WarningHeight = 836640; // segwit activation height + miner confirmation window
- consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
+ consensus.powLimit = uint256{"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = true;
+ consensus.enforce_BIP94 = false;
consensus.fPowNoRetargeting = false;
consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains
consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
@@ -223,8 +241,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("0x000000000000000000000000000000000000000000000c59b14e264ba6c15db9");
- consensus.defaultAssumeValid = uint256S("0x000000000001323071f38f21ea5aae529ece491eadaccce506a59bcc2d968917"); // 2550000
+ consensus.nMinimumChainWork = uint256{"000000000000000000000000000000000000000000000f209695166be8b61fa9"};
+ consensus.defaultAssumeValid = uint256{"000000000000000465b1a66c9f386308e8c75acef9201f3f577811da09fc90ad"}; // 2873500
pchMessageStart[0] = 0x0b;
pchMessageStart[1] = 0x11;
@@ -232,13 +250,13 @@ public:
pchMessageStart[3] = 0x07;
nDefaultPort = 18333;
nPruneAfterHeight = 1000;
- m_assumed_blockchain_size = 42;
- m_assumed_chain_state_size = 3;
+ m_assumed_blockchain_size = 93;
+ m_assumed_chain_state_size = 19;
genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
- assert(consensus.hashGenesisBlock == uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"));
- assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
+ assert(consensus.hashGenesisBlock == uint256{"000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"});
+ assert(genesis.hashMerkleRoot == uint256{"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"});
vFixedSeeds.clear();
vSeeds.clear();
@@ -264,24 +282,123 @@ public:
checkpointData = {
{
- {546, uint256S("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")},
+ {546, uint256{"000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"}},
}
};
m_assumeutxo_data = {
{
.height = 2'500'000,
- .hash_serialized = AssumeutxoHash{uint256S("0xf841584909f68e47897952345234e37fcd9128cd818f41ee6c3ca68db8071be7")},
- .nChainTx = 66484552,
- .blockhash = uint256S("0x0000000000000093bcb68c03a9a168ae252572d348a2eaeba2cdf9231d73206f")
+ .hash_serialized = AssumeutxoHash{uint256{"f841584909f68e47897952345234e37fcd9128cd818f41ee6c3ca68db8071be7"}},
+ .m_chain_tx_count = 66484552,
+ .blockhash = consteval_ctor(uint256{"0000000000000093bcb68c03a9a168ae252572d348a2eaeba2cdf9231d73206f"}),
}
};
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 000000000001323071f38f21ea5aae529ece491eadaccce506a59bcc2d968917
- .nTime = 1703579240,
- .nTxCount = 67845391,
- .dTxRate = 1.464436832560951,
+ // Data from RPC: getchaintxstats 4096 000000000000000465b1a66c9f386308e8c75acef9201f3f577811da09fc90ad
+ .nTime = 1723613341,
+ .tx_count = 187917082,
+ .dTxRate = 3.265051477698455,
+ };
+ }
+};
+
+/**
+ * Testnet (v4): public test network which is reset from time to time.
+ */
+class CTestNet4Params : public CChainParams {
+public:
+ CTestNet4Params() {
+ m_chain_type = ChainType::TESTNET4;
+ consensus.signet_blocks = false;
+ consensus.signet_challenge.clear();
+ consensus.nSubsidyHalvingInterval = 210000;
+ consensus.BIP34Height = 1;
+ consensus.BIP34Hash = uint256{};
+ consensus.BIP65Height = 1;
+ consensus.BIP66Height = 1;
+ consensus.CSVHeight = 1;
+ consensus.SegwitHeight = 1;
+ consensus.MinBIP9WarningHeight = 0;
+ consensus.powLimit = uint256{"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
+ consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
+ consensus.nPowTargetSpacing = 10 * 60;
+ consensus.fPowAllowMinDifficultyBlocks = true;
+ consensus.enforce_BIP94 = true;
+ consensus.fPowNoRetargeting = false;
+ consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains
+ consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = Consensus::BIP9Deployment::NEVER_ACTIVE;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
+
+ // Deployment of Taproot (BIPs 340-342)
+ consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
+ consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
+
+ consensus.nMinimumChainWork = uint256{"00000000000000000000000000000000000000000000005faa15d02e6202f3ba"};
+ consensus.defaultAssumeValid = uint256{"000000005be348057db991fa5d89fe7c4695b667cfb311391a8db374b6f681fd"}; // 39550
+
+ pchMessageStart[0] = 0x1c;
+ pchMessageStart[1] = 0x16;
+ pchMessageStart[2] = 0x3f;
+ pchMessageStart[3] = 0x28;
+ nDefaultPort = 48333;
+ nPruneAfterHeight = 1000;
+ m_assumed_blockchain_size = 1;
+ m_assumed_chain_state_size = 0;
+
+ const char* testnet4_genesis_msg = "03/May/2024 000000000000000000001ebd58c244970b3aa9d783bb001011fbe8ea8e98e00e";
+ const CScript testnet4_genesis_script = CScript() << "000000000000000000000000000000000000000000000000000000000000000000"_hex << OP_CHECKSIG;
+ genesis = CreateGenesisBlock(testnet4_genesis_msg,
+ testnet4_genesis_script,
+ 1714777860,
+ 393743547,
+ 0x1d00ffff,
+ 1,
+ 50 * COIN);
+ consensus.hashGenesisBlock = genesis.GetHash();
+ assert(consensus.hashGenesisBlock == uint256{"00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be350b0da8bf043"});
+ assert(genesis.hashMerkleRoot == uint256{"7aa0a7ae1e223414cb807e40cd57e667b718e42aaf9306db9102fe28912b7b4e"});
+
+ vFixedSeeds.clear();
+ vSeeds.clear();
+ // nodes with support for servicebits filtering should be at the top
+ vSeeds.emplace_back("seed.testnet4.bitcoin.sprovoost.nl."); // Sjors Provoost
+ vSeeds.emplace_back("seed.testnet4.wiz.biz."); // Jason Maurice
+
+ base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);
+ base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);
+ base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,239);
+ base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
+ base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
+
+ bech32_hrp = "tb";
+
+ vFixedSeeds = std::vector<uint8_t>(std::begin(chainparams_seed_testnet4), std::end(chainparams_seed_testnet4));
+
+ fDefaultConsistencyChecks = false;
+ m_is_mockable_chain = false;
+
+ checkpointData = {
+ {
+ {},
+ }
+ };
+
+ m_assumeutxo_data = {
+ {}
+ };
+
+ chainTxData = ChainTxData{
+ // Data from RPC: getchaintxstats 4096 000000005be348057db991fa5d89fe7c4695b667cfb311391a8db374b6f681fd
+ .nTime = 1723651702,
+ .tx_count = 757229,
+ .dTxRate = 0.01570402633472492,
};
}
};
@@ -297,7 +414,7 @@ public:
vSeeds.clear();
if (!options.challenge) {
- bin = ParseHex("512103ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430210359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c452ae");
+ bin = "512103ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430210359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c452ae"_hex_v_u8;
vSeeds.emplace_back("seed.signet.bitcoin.sprovoost.nl.");
vSeeds.emplace_back("seed.signet.achownodes.xyz."); // Ava Chow, only supports x1, x5, x9, x49, x809, x849, xd, x400, x404, x408, x448, xc08, xc48, x40c
@@ -305,15 +422,15 @@ public:
vSeeds.emplace_back("178.128.221.177");
vSeeds.emplace_back("v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333");
- consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000000000000206e86f08e8");
- consensus.defaultAssumeValid = uint256S("0x0000000870f15246ba23c16e370a7ffb1fc8a3dcf8cb4492882ed4b0e3d4cd26"); // 180000
- m_assumed_blockchain_size = 1;
+ consensus.nMinimumChainWork = uint256{"0000000000000000000000000000000000000000000000000000025dbd66e58f"};
+ consensus.defaultAssumeValid = uint256{"0000014aad1d58dddcb964dd749b073374c6306e716b22f573a2efe68d414539"}; // 208800
+ m_assumed_blockchain_size = 2;
m_assumed_chain_state_size = 0;
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 0000000870f15246ba23c16e370a7ffb1fc8a3dcf8cb4492882ed4b0e3d4cd26
- .nTime = 1706331472,
- .nTxCount = 2425380,
- .dTxRate = 0.008277759863833788,
+ // Data from RPC: getchaintxstats 4096 0000014aad1d58dddcb964dd749b073374c6306e716b22f573a2efe68d414539
+ .nTime = 1723655233,
+ .tx_count = 5507045,
+ .dTxRate = 0.06271073277261494,
};
} else {
bin = *options.challenge;
@@ -346,11 +463,12 @@ public:
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = false;
+ consensus.enforce_BIP94 = false;
consensus.fPowNoRetargeting = false;
consensus.nRuleChangeActivationThreshold = 1815; // 90% of 2016
consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
consensus.MinBIP9WarningHeight = 0;
- consensus.powLimit = uint256S("00000377ae000000000000000000000000000000000000000000000000000000");
+ consensus.powLimit = uint256{"00000377ae000000000000000000000000000000000000000000000000000000"};
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = Consensus::BIP9Deployment::NEVER_ACTIVE;
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
@@ -373,17 +491,17 @@ public:
genesis = CreateGenesisBlock(1598918400, 52613770, 0x1e0377ae, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
- assert(consensus.hashGenesisBlock == uint256S("0x00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6"));
- assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
+ assert(consensus.hashGenesisBlock == uint256{"00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6"});
+ assert(genesis.hashMerkleRoot == uint256{"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"});
vFixedSeeds.clear();
m_assumeutxo_data = {
{
.height = 160'000,
- .hash_serialized = AssumeutxoHash{uint256S("0xfe0a44309b74d6b5883d246cb419c6221bcccf0b308c9b59b7d70783dbdf928a")},
- .nChainTx = 2289496,
- .blockhash = uint256S("0x0000003ca3c99aff040f2563c2ad8f8ec88bd0fd6b8f0895cfaf1ef90353a62c")
+ .hash_serialized = AssumeutxoHash{uint256{"fe0a44309b74d6b5883d246cb419c6221bcccf0b308c9b59b7d70783dbdf928a"}},
+ .m_chain_tx_count = 2289496,
+ .blockhash = consteval_ctor(uint256{"0000003ca3c99aff040f2563c2ad8f8ec88bd0fd6b8f0895cfaf1ef90353a62c"}),
}
};
@@ -420,10 +538,11 @@ public:
consensus.CSVHeight = 1; // Always active unless overridden
consensus.SegwitHeight = 0; // Always active unless overridden
consensus.MinBIP9WarningHeight = 0;
- consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
+ consensus.powLimit = uint256{"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
+ consensus.nPowTargetTimespan = 24 * 60 * 60; // one day
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = true;
+ consensus.enforce_BIP94 = true;
consensus.fPowNoRetargeting = true;
consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
@@ -478,8 +597,8 @@ public:
genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
- assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"));
- assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
+ assert(consensus.hashGenesisBlock == uint256{"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"});
+ assert(genesis.hashMerkleRoot == uint256{"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"});
vFixedSeeds.clear(); //!< Regtest mode doesn't have any fixed seeds.
vSeeds.clear();
@@ -490,23 +609,30 @@ public:
checkpointData = {
{
- {0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")},
+ {0, uint256{"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}},
}
};
m_assumeutxo_data = {
- {
+ { // For use by unit tests
.height = 110,
- .hash_serialized = AssumeutxoHash{uint256S("0x6657b736d4fe4db0cbc796789e812d5dba7f5c143764b1b6905612f1830609d1")},
- .nChainTx = 111,
- .blockhash = uint256S("0x696e92821f65549c7ee134edceeeeaaa4105647a3c4fd9f298c0aec0ab50425c")
+ .hash_serialized = AssumeutxoHash{uint256{"6657b736d4fe4db0cbc796789e812d5dba7f5c143764b1b6905612f1830609d1"}},
+ .m_chain_tx_count = 111,
+ .blockhash = consteval_ctor(uint256{"696e92821f65549c7ee134edceeeeaaa4105647a3c4fd9f298c0aec0ab50425c"}),
+ },
+ {
+ // For use by fuzz target src/test/fuzz/utxo_snapshot.cpp
+ .height = 200,
+ .hash_serialized = AssumeutxoHash{uint256{"4f34d431c3e482f6b0d67b64609ece3964dc8d7976d02ac68dd7c9c1421738f2"}},
+ .m_chain_tx_count = 201,
+ .blockhash = consteval_ctor(uint256{"5e93653318f294fb5aa339d00bbf8cf1c3515488ad99412c37608b139ea63b27"}),
},
{
// For use by test/functional/feature_assumeutxo.py
.height = 299,
- .hash_serialized = AssumeutxoHash{uint256S("0xa4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27")},
- .nChainTx = 334,
- .blockhash = uint256S("0x3bb7ce5eba0be48939b7a521ac1ba9316afee2c7bada3a0cca24188e6d7d96c0")
+ .hash_serialized = AssumeutxoHash{uint256{"a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27"}},
+ .m_chain_tx_count = 334,
+ .blockhash = consteval_ctor(uint256{"3bb7ce5eba0be48939b7a521ac1ba9316afee2c7bada3a0cca24188e6d7d96c0"}),
},
};
@@ -546,6 +672,11 @@ std::unique_ptr<const CChainParams> CChainParams::TestNet()
return std::make_unique<const CTestNetParams>();
}
+std::unique_ptr<const CChainParams> CChainParams::TestNet4()
+{
+ return std::make_unique<const CTestNet4Params>();
+}
+
std::vector<int> CChainParams::GetAvailableSnapshotHeights() const
{
std::vector<int> heights;
@@ -561,16 +692,19 @@ std::optional<ChainType> GetNetworkForMagic(const MessageStartChars& message)
{
const auto mainnet_msg = CChainParams::Main()->MessageStart();
const auto testnet_msg = CChainParams::TestNet()->MessageStart();
+ const auto testnet4_msg = CChainParams::TestNet4()->MessageStart();
const auto regtest_msg = CChainParams::RegTest({})->MessageStart();
const auto signet_msg = CChainParams::SigNet({})->MessageStart();
- if (std::equal(message.begin(), message.end(), mainnet_msg.data())) {
+ if (std::ranges::equal(message, mainnet_msg)) {
return ChainType::MAIN;
- } else if (std::equal(message.begin(), message.end(), testnet_msg.data())) {
+ } else if (std::ranges::equal(message, testnet_msg)) {
return ChainType::TESTNET;
- } else if (std::equal(message.begin(), message.end(), regtest_msg.data())) {
+ } else if (std::ranges::equal(message, testnet4_msg)) {
+ return ChainType::TESTNET4;
+ } else if (std::ranges::equal(message, regtest_msg)) {
return ChainType::REGTEST;
- } else if (std::equal(message.begin(), message.end(), signet_msg.data())) {
+ } else if (std::ranges::equal(message, signet_msg)) {
return ChainType::SIGNET;
}
return std::nullopt;
diff --git a/src/kernel/chainparams.h b/src/kernel/chainparams.h
index 05ebd07ec7..c4584600fd 100644
--- a/src/kernel/chainparams.h
+++ b/src/kernel/chainparams.h
@@ -50,11 +50,11 @@ struct AssumeutxoData {
//! The expected hash of the deserialized UTXO set.
AssumeutxoHash hash_serialized;
- //! Used to populate the nChainTx value, which is used during BlockManager::LoadBlockIndex().
+ //! Used to populate the m_chain_tx_count value, which is used during BlockManager::LoadBlockIndex().
//!
//! We need to hardcode the value here because this is computed cumulatively using block data,
//! which we do not necessarily have at the time of snapshot load.
- unsigned int nChainTx;
+ uint64_t m_chain_tx_count;
//! The hash of the base block for this snapshot. Used to refer to assumeutxo data
//! prior to having a loaded blockindex.
@@ -69,7 +69,7 @@ struct AssumeutxoData {
*/
struct ChainTxData {
int64_t nTime; //!< UNIX timestamp of last known number of transactions
- int64_t nTxCount; //!< total number of transactions between genesis and that timestamp
+ uint64_t tx_count; //!< total number of transactions between genesis and that timestamp
double dTxRate; //!< estimated number of transactions per second after that timestamp
};
@@ -161,9 +161,10 @@ public:
static std::unique_ptr<const CChainParams> SigNet(const SigNetOptions& options);
static std::unique_ptr<const CChainParams> Main();
static std::unique_ptr<const CChainParams> TestNet();
+ static std::unique_ptr<const CChainParams> TestNet4();
protected:
- CChainParams() {}
+ CChainParams() = default;
Consensus::Params consensus;
MessageStartChars pchMessageStart;
diff --git a/src/kernel/chainstatemanager_opts.h b/src/kernel/chainstatemanager_opts.h
index 076841c3c9..1b605f3d55 100644
--- a/src/kernel/chainstatemanager_opts.h
+++ b/src/kernel/chainstatemanager_opts.h
@@ -9,6 +9,7 @@
#include <arith_uint256.h>
#include <dbwrapper.h>
+#include <script/sigcache.h>
#include <txdb.h>
#include <uint256.h>
#include <util/time.h>
@@ -48,6 +49,8 @@ struct ChainstateManagerOpts {
ValidationSignals* signals{nullptr};
//! Number of script check worker threads. Zero means no parallel verification.
int worker_threads_num{0};
+ size_t script_execution_cache_bytes{DEFAULT_SCRIPT_EXECUTION_CACHE_BYTES};
+ size_t signature_cache_bytes{DEFAULT_SIGNATURE_CACHE_BYTES};
};
} // namespace kernel
diff --git a/src/kernel/context.cpp b/src/kernel/context.cpp
index bfb17915fd..2420d18d74 100644
--- a/src/kernel/context.cpp
+++ b/src/kernel/context.cpp
@@ -8,15 +8,18 @@
#include <logging.h>
#include <random.h>
+#include <mutex>
#include <string>
-
namespace kernel {
Context::Context()
{
- std::string sha256_algo = SHA256AutoDetect();
- LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo);
- RandomInit();
+ static std::once_flag globals_initialized{};
+ std::call_once(globals_initialized, []() {
+ std::string sha256_algo = SHA256AutoDetect();
+ LogInfo("Using the '%s' SHA256 implementation\n", sha256_algo);
+ RandomInit();
+ });
}
diff --git a/src/kernel/mempool_options.h b/src/kernel/mempool_options.h
index 0850b2e60e..4e1e24a11d 100644
--- a/src/kernel/mempool_options.h
+++ b/src/kernel/mempool_options.h
@@ -22,7 +22,7 @@ static constexpr unsigned int DEFAULT_BLOCKSONLY_MAX_MEMPOOL_SIZE_MB{5};
/** Default for -mempoolexpiry, expiration time for mempool transactions in hours */
static constexpr unsigned int DEFAULT_MEMPOOL_EXPIRY_HOURS{336};
/** Default for -mempoolfullrbf, if the transaction replaceability signaling is ignored */
-static constexpr bool DEFAULT_MEMPOOL_FULL_RBF{false};
+static constexpr bool DEFAULT_MEMPOOL_FULL_RBF{true};
/** Whether to fall back to legacy V1 serialization when writing mempool.dat */
static constexpr bool DEFAULT_PERSIST_V1_DAT{false};
/** Default for -acceptnonstdtxn */
diff --git a/src/kernel/notifications_interface.h b/src/kernel/notifications_interface.h
index 8e090dd7db..ef72d9bdb6 100644
--- a/src/kernel/notifications_interface.h
+++ b/src/kernel/notifications_interface.h
@@ -35,7 +35,7 @@ bool IsInterrupted(const T& result)
class Notifications
{
public:
- virtual ~Notifications(){};
+ virtual ~Notifications() = default;
[[nodiscard]] virtual InterruptResult blockTip(SynchronizationState state, CBlockIndex& index) { return {}; }
virtual void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync) {}
diff --git a/src/kernel/validation_cache_sizes.h b/src/kernel/validation_cache_sizes.h
deleted file mode 100644
index 72e4d1a52c..0000000000
--- a/src/kernel/validation_cache_sizes.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// 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_KERNEL_VALIDATION_CACHE_SIZES_H
-#define BITCOIN_KERNEL_VALIDATION_CACHE_SIZES_H
-
-#include <script/sigcache.h>
-
-#include <cstddef>
-#include <limits>
-
-namespace kernel {
-struct ValidationCacheSizes {
- size_t signature_cache_bytes{DEFAULT_MAX_SIG_CACHE_BYTES / 2};
- size_t script_execution_cache_bytes{DEFAULT_MAX_SIG_CACHE_BYTES / 2};
-};
-}
-
-#endif // BITCOIN_KERNEL_VALIDATION_CACHE_SIZES_H
diff --git a/src/key.cpp b/src/key.cpp
index 97d7821e74..360a1f46d3 100644
--- a/src/key.cpp
+++ b/src/key.cpp
@@ -271,27 +271,8 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
bool CKey::SignSchnorr(const uint256& hash, Span<unsigned char> sig, const uint256* merkle_root, const uint256& aux) const
{
- assert(sig.size() == 64);
- secp256k1_keypair keypair;
- 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;
- unsigned char pubkey_bytes[32];
- if (!secp256k1_xonly_pubkey_serialize(secp256k1_context_sign, pubkey_bytes, &pubkey)) return false;
- uint256 tweak = XOnlyPubKey(pubkey_bytes).ComputeTapTweakHash(merkle_root->IsNull() ? nullptr : merkle_root);
- if (!secp256k1_keypair_xonly_tweak_add(secp256k1_context_static, &keypair, tweak.data())) return false;
- }
- bool ret = secp256k1_schnorrsig_sign32(secp256k1_context_sign, sig.data(), hash.data(), &keypair, aux.data());
- if (ret) {
- // Additional verification step to prevent using a potentially corrupted signature
- secp256k1_xonly_pubkey pubkey_verify;
- ret = secp256k1_keypair_xonly_pub(secp256k1_context_static, &pubkey_verify, nullptr, &keypair);
- ret &= secp256k1_schnorrsig_verify(secp256k1_context_static, sig.data(), hash.begin(), 32, &pubkey_verify);
- }
- if (!ret) memory_cleanse(sig.data(), sig.size());
- memory_cleanse(&keypair, sizeof(keypair));
- return ret;
+ KeyPair kp = ComputeKeyPair(merkle_root);
+ return kp.SignSchnorr(hash, sig, aux);
}
bool CKey::Load(const CPrivKey &seckey, const CPubKey &vchPubKey, bool fSkipCheck=false) {
@@ -363,6 +344,11 @@ ECDHSecret CKey::ComputeBIP324ECDHSecret(const EllSwiftPubKey& their_ellswift, c
return output;
}
+KeyPair CKey::ComputeKeyPair(const uint256* merkle_root) const
+{
+ return KeyPair(*this, merkle_root);
+}
+
CKey GenerateRandomKey(bool compressed) noexcept
{
CKey key;
@@ -420,6 +406,39 @@ void CExtKey::Decode(const unsigned char code[BIP32_EXTKEY_SIZE]) {
if ((nDepth == 0 && (nChild != 0 || ReadLE32(vchFingerprint) != 0)) || code[41] != 0) key = CKey();
}
+KeyPair::KeyPair(const CKey& key, const uint256* merkle_root)
+{
+ static_assert(std::tuple_size<KeyType>() == sizeof(secp256k1_keypair));
+ MakeKeyPairData();
+ auto keypair = reinterpret_cast<secp256k1_keypair*>(m_keypair->data());
+ bool success = secp256k1_keypair_create(secp256k1_context_sign, keypair, UCharCast(key.data()));
+ if (success && merkle_root) {
+ secp256k1_xonly_pubkey pubkey;
+ unsigned char pubkey_bytes[32];
+ assert(secp256k1_keypair_xonly_pub(secp256k1_context_sign, &pubkey, nullptr, keypair));
+ assert(secp256k1_xonly_pubkey_serialize(secp256k1_context_sign, pubkey_bytes, &pubkey));
+ uint256 tweak = XOnlyPubKey(pubkey_bytes).ComputeTapTweakHash(merkle_root->IsNull() ? nullptr : merkle_root);
+ success = secp256k1_keypair_xonly_tweak_add(secp256k1_context_static, keypair, tweak.data());
+ }
+ if (!success) ClearKeyPairData();
+}
+
+bool KeyPair::SignSchnorr(const uint256& hash, Span<unsigned char> sig, const uint256& aux) const
+{
+ assert(sig.size() == 64);
+ if (!IsValid()) return false;
+ auto keypair = reinterpret_cast<const secp256k1_keypair*>(m_keypair->data());
+ bool ret = secp256k1_schnorrsig_sign32(secp256k1_context_sign, sig.data(), hash.data(), keypair, aux.data());
+ if (ret) {
+ // Additional verification step to prevent using a potentially corrupted signature
+ secp256k1_xonly_pubkey pubkey_verify;
+ ret = secp256k1_keypair_xonly_pub(secp256k1_context_static, &pubkey_verify, nullptr, keypair);
+ ret &= secp256k1_schnorrsig_verify(secp256k1_context_static, sig.data(), hash.begin(), 32, &pubkey_verify);
+ }
+ if (!ret) memory_cleanse(sig.data(), sig.size());
+ return ret;
+}
+
bool ECC_InitSanityCheck() {
CKey key = GenerateRandomKey();
CPubKey pubkey = key.GetPubKey();
diff --git a/src/key.h b/src/key.h
index c802e1ebb8..6ed6fd0fc3 100644
--- a/src/key.h
+++ b/src/key.h
@@ -28,6 +28,8 @@ constexpr static size_t ECDH_SECRET_SIZE = CSHA256::OUTPUT_SIZE;
// Used to represent ECDH shared secret (ECDH_SECRET_SIZE bytes)
using ECDHSecret = std::array<std::byte, ECDH_SECRET_SIZE>;
+class KeyPair;
+
/** An encapsulated private key. */
class CKey
{
@@ -75,13 +77,15 @@ public:
CKey& operator=(const CKey& other)
{
- if (other.keydata) {
- MakeKeyData();
- *keydata = *other.keydata;
- } else {
- ClearKeyData();
+ if (this != &other) {
+ if (other.keydata) {
+ MakeKeyData();
+ *keydata = *other.keydata;
+ } else {
+ ClearKeyData();
+ }
+ fCompressed = other.fCompressed;
}
- fCompressed = other.fCompressed;
return *this;
}
@@ -200,6 +204,22 @@ public:
ECDHSecret ComputeBIP324ECDHSecret(const EllSwiftPubKey& their_ellswift,
const EllSwiftPubKey& our_ellswift,
bool initiating) const;
+ /** Compute a KeyPair
+ *
+ * Wraps a `secp256k1_keypair` type.
+ *
+ * `merkle_root` is used to optionally perform tweaking of
+ * the internal key, as specified in BIP341:
+ *
+ * - If merkle_root == nullptr: no tweaking is done, use the internal key directly (this is
+ * used for signatures in BIP342 script).
+ * - If merkle_root->IsNull(): tweak the internal key with H_TapTweak(pubkey) (this is used for
+ * key path spending when no scripts are present).
+ * - Otherwise: tweak the internal key with H_TapTweak(pubkey || *merkle_root)
+ * (this is used for key path spending with the
+ * Merkle root of the script tree).
+ */
+ KeyPair ComputeKeyPair(const uint256* merkle_root) const;
};
CKey GenerateRandomKey(bool compressed = true) noexcept;
@@ -233,6 +253,61 @@ struct CExtKey {
void SetSeed(Span<const std::byte> seed);
};
+/** KeyPair
+ *
+ * Wraps a `secp256k1_keypair` type, an opaque data structure for holding a secret and public key.
+ * This is intended for BIP340 keys and allows us to easily determine if the secret key needs to
+ * be negated by checking the parity of the public key. This class primarily intended for passing
+ * secret keys to libsecp256k1 functions expecting a `secp256k1_keypair`. For all other cases,
+ * CKey should be preferred.
+ *
+ * A KeyPair can be created from a CKey with an optional merkle_root tweak (per BIP342). See
+ * CKey::ComputeKeyPair for more details.
+ */
+class KeyPair
+{
+public:
+ KeyPair() noexcept = default;
+ KeyPair(KeyPair&&) noexcept = default;
+ KeyPair& operator=(KeyPair&&) noexcept = default;
+ KeyPair& operator=(const KeyPair& other)
+ {
+ if (this != &other) {
+ if (other.m_keypair) {
+ MakeKeyPairData();
+ *m_keypair = *other.m_keypair;
+ } else {
+ ClearKeyPairData();
+ }
+ }
+ return *this;
+ }
+
+ KeyPair(const KeyPair& other) { *this = other; }
+
+ friend KeyPair CKey::ComputeKeyPair(const uint256* merkle_root) const;
+ [[nodiscard]] bool SignSchnorr(const uint256& hash, Span<unsigned char> sig, const uint256& aux) const;
+
+ //! Check whether this keypair is valid.
+ bool IsValid() const { return !!m_keypair; }
+
+private:
+ KeyPair(const CKey& key, const uint256* merkle_root);
+
+ using KeyType = std::array<unsigned char, 96>;
+ secure_unique_ptr<KeyType> m_keypair;
+
+ void MakeKeyPairData()
+ {
+ if (!m_keypair) m_keypair = make_secure_unique<KeyType>();
+ }
+
+ void ClearKeyPairData()
+ {
+ m_keypair.reset();
+ }
+};
+
/** Check that required EC support is available at runtime. */
bool ECC_InitSanityCheck();
diff --git a/src/key_io.cpp b/src/key_io.cpp
index a373a2201d..29002afc45 100644
--- a/src/key_io.cpp
+++ b/src/key_io.cpp
@@ -181,6 +181,10 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par
return tap;
}
+ if (CScript::IsPayToAnchor(version, data)) {
+ return PayToAnchor();
+ }
+
if (version > 16) {
error_str = "Invalid Bech32 address witness version";
return CNoDestination();
diff --git a/src/logging.cpp b/src/logging.cpp
index a9fea433be..5f055566ef 100644
--- a/src/logging.cpp
+++ b/src/logging.cpp
@@ -1,9 +1,11 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// 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.
#include <logging.h>
+#include <memusage.h>
+#include <util/check.h>
#include <util/fs.h>
#include <util/string.h>
#include <util/threadnames.h>
@@ -14,8 +16,7 @@
#include <optional>
using util::Join;
-using util::RemovePrefix;
-using util::ToString;
+using util::RemovePrefixView;
const char * const DEFAULT_DEBUGLOGFILE = "debug.log";
constexpr auto MAX_USER_SETABLE_SEVERITY_LEVEL{BCLog::Level::Info};
@@ -43,7 +44,7 @@ BCLog::Logger& LogInstance()
bool fLogIPs = DEFAULT_LOGIPS;
-static int FileWriteStr(const std::string &str, FILE *fp)
+static int FileWriteStr(std::string_view str, FILE *fp)
{
return fwrite(str.data(), 1, str.size(), fp);
}
@@ -71,17 +72,22 @@ bool BCLog::Logger::StartLogging()
// dump buffered messages from before we opened the log
m_buffering = false;
+ if (m_buffer_lines_discarded > 0) {
+ LogPrintStr_(strprintf("Early logging buffer overflowed, %d log lines discarded.\n", m_buffer_lines_discarded), __func__, __FILE__, __LINE__, BCLog::ALL, Level::Info);
+ }
while (!m_msgs_before_open.empty()) {
- const std::string& s = m_msgs_before_open.front();
+ const auto& buflog = m_msgs_before_open.front();
+ std::string s{buflog.str};
+ FormatLogStrInPlace(s, buflog.category, buflog.level, buflog.source_file, buflog.source_line, buflog.logging_function, buflog.threadname, buflog.now, buflog.mocktime);
+ m_msgs_before_open.pop_front();
if (m_print_to_file) FileWriteStr(s, m_fileout);
if (m_print_to_console) fwrite(s.data(), 1, s.size(), stdout);
for (const auto& cb : m_print_callbacks) {
cb(s);
}
-
- m_msgs_before_open.pop_front();
}
+ m_cur_buffer_memusage = 0;
if (m_print_to_console) fflush(stdout);
return true;
@@ -94,6 +100,22 @@ void BCLog::Logger::DisconnectTestLogger()
if (m_fileout != nullptr) fclose(m_fileout);
m_fileout = nullptr;
m_print_callbacks.clear();
+ m_max_buffer_memusage = DEFAULT_MAX_LOG_BUFFER;
+ m_cur_buffer_memusage = 0;
+ m_buffer_lines_discarded = 0;
+ m_msgs_before_open.clear();
+}
+
+void BCLog::Logger::DisableLogging()
+{
+ {
+ StdLockGuard scoped_lock(m_cs);
+ assert(m_buffering);
+ assert(m_print_callbacks.empty());
+ }
+ m_print_to_file = false;
+ m_print_to_console = false;
+ StartLogging();
}
void BCLog::Logger::EnableCategory(BCLog::LogFlags flag)
@@ -101,7 +123,7 @@ void BCLog::Logger::EnableCategory(BCLog::LogFlags flag)
m_categories |= flag;
}
-bool BCLog::Logger::EnableCategory(const std::string& str)
+bool BCLog::Logger::EnableCategory(std::string_view str)
{
BCLog::LogFlags flag;
if (!GetLogCategory(flag, str)) return false;
@@ -114,7 +136,7 @@ void BCLog::Logger::DisableCategory(BCLog::LogFlags flag)
m_categories &= ~flag;
}
-bool BCLog::Logger::DisableCategory(const std::string& str)
+bool BCLog::Logger::DisableCategory(std::string_view str)
{
BCLog::LogFlags flag;
if (!GetLogCategory(flag, str)) return false;
@@ -145,9 +167,7 @@ bool BCLog::Logger::DefaultShrinkDebugFile() const
return m_categories == BCLog::NONE;
}
-static const std::map<std::string, BCLog::LogFlags> LOG_CATEGORIES_BY_STR{
- {"0", BCLog::NONE},
- {"", BCLog::NONE},
+static const std::map<std::string, BCLog::LogFlags, std::less<>> LOG_CATEGORIES_BY_STR{
{"net", BCLog::NET},
{"tor", BCLog::TOR},
{"mempool", BCLog::MEMPOOL},
@@ -179,28 +199,23 @@ static const std::map<std::string, BCLog::LogFlags> LOG_CATEGORIES_BY_STR{
{"txreconciliation", BCLog::TXRECONCILIATION},
{"scan", BCLog::SCAN},
{"txpackages", BCLog::TXPACKAGES},
- {"1", BCLog::ALL},
- {"all", BCLog::ALL},
};
static const std::unordered_map<BCLog::LogFlags, std::string> LOG_CATEGORIES_BY_FLAG{
// Swap keys and values from LOG_CATEGORIES_BY_STR.
- [](const std::map<std::string, BCLog::LogFlags>& in) {
+ [](const auto& in) {
std::unordered_map<BCLog::LogFlags, std::string> out;
for (const auto& [k, v] : in) {
- switch (v) {
- case BCLog::NONE: out.emplace(BCLog::NONE, ""); break;
- case BCLog::ALL: out.emplace(BCLog::ALL, "all"); break;
- default: out.emplace(v, k);
- }
+ const bool inserted{out.emplace(v, k).second};
+ assert(inserted);
}
return out;
}(LOG_CATEGORIES_BY_STR)
};
-bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str)
+bool GetLogCategory(BCLog::LogFlags& flag, std::string_view str)
{
- if (str.empty()) {
+ if (str.empty() || str == "1" || str == "all") {
flag = BCLog::ALL;
return true;
}
@@ -229,14 +244,17 @@ std::string BCLog::Logger::LogLevelToStr(BCLog::Level level)
assert(false);
}
-std::string LogCategoryToStr(BCLog::LogFlags category)
+static std::string LogCategoryToStr(BCLog::LogFlags category)
{
+ if (category == BCLog::ALL) {
+ return "all";
+ }
auto it = LOG_CATEGORIES_BY_FLAG.find(category);
assert(it != LOG_CATEGORIES_BY_FLAG.end());
return it->second;
}
-static std::optional<BCLog::Level> GetLogLevel(const std::string& level_str)
+static std::optional<BCLog::Level> GetLogLevel(std::string_view level_str)
{
if (level_str == "trace") {
return BCLog::Level::Trace;
@@ -256,10 +274,9 @@ static std::optional<BCLog::Level> GetLogLevel(const std::string& level_str)
std::vector<LogCategory> BCLog::Logger::LogCategoriesList() const
{
std::vector<LogCategory> ret;
+ ret.reserve(LOG_CATEGORIES_BY_STR.size());
for (const auto& [category, flag] : LOG_CATEGORIES_BY_STR) {
- if (flag != BCLog::NONE && flag != BCLog::ALL) {
- ret.push_back(LogCategory{.category = category, .active = WillLogCategory(flag)});
- }
+ ret.push_back(LogCategory{.category = category, .active = WillLogCategory(flag)});
}
return ret;
}
@@ -276,28 +293,23 @@ std::string BCLog::Logger::LogLevelsString() const
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)
+std::string BCLog::Logger::LogTimestampStr(SystemClock::time_point now, std::chrono::seconds mocktime) const
{
std::string strStamped;
if (!m_log_timestamps)
- return str;
-
- if (m_started_new_line) {
- const auto now{SystemClock::now()};
- const auto now_seconds{std::chrono::time_point_cast<std::chrono::seconds>(now)};
- strStamped = FormatISO8601DateTime(TicksSinceEpoch<std::chrono::seconds>(now_seconds));
- if (m_log_time_micros && !strStamped.empty()) {
- strStamped.pop_back();
- strStamped += strprintf(".%06dZ", Ticks<std::chrono::microseconds>(now - now_seconds));
- }
- std::chrono::seconds mocktime = GetMockTime();
- if (mocktime > 0s) {
- strStamped += " (mocktime: " + FormatISO8601DateTime(count_seconds(mocktime)) + ")";
- }
- strStamped += ' ' + str;
- } else
- strStamped = str;
+ return strStamped;
+
+ const auto now_seconds{std::chrono::time_point_cast<std::chrono::seconds>(now)};
+ strStamped = FormatISO8601DateTime(TicksSinceEpoch<std::chrono::seconds>(now_seconds));
+ if (m_log_time_micros && !strStamped.empty()) {
+ strStamped.pop_back();
+ strStamped += strprintf(".%06dZ", Ticks<std::chrono::microseconds>(now - now_seconds));
+ }
+ if (mocktime > 0s) {
+ strStamped += " (mocktime: " + FormatISO8601DateTime(count_seconds(mocktime)) + ")";
+ }
+ strStamped += ' ';
return strStamped;
}
@@ -310,7 +322,7 @@ namespace BCLog {
* It escapes instead of removes them to still allow for troubleshooting
* issues where they accidentally end up in strings.
*/
- std::string LogEscapeMessage(const std::string& str) {
+ std::string LogEscapeMessage(std::string_view str) {
std::string ret;
for (char ch_in : str) {
uint8_t ch = (uint8_t)ch_in;
@@ -350,34 +362,70 @@ std::string BCLog::Logger::GetLogPrefix(BCLog::LogFlags category, BCLog::Level l
return 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)
+static size_t MemUsage(const BCLog::Logger::BufferedLog& buflog)
{
- StdLockGuard scoped_lock(m_cs);
- std::string str_prefixed = LogEscapeMessage(str);
+ return buflog.str.size() + buflog.logging_function.size() + buflog.source_file.size() + buflog.threadname.size() + memusage::MallocUsage(sizeof(memusage::list_node<BCLog::Logger::BufferedLog>));
+}
- if (m_started_new_line) {
- str_prefixed.insert(0, GetLogPrefix(category, level));
- }
+void BCLog::Logger::FormatLogStrInPlace(std::string& str, BCLog::LogFlags category, BCLog::Level level, std::string_view source_file, int source_line, std::string_view logging_function, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const
+{
+ if (!str.ends_with('\n')) str.push_back('\n');
- if (m_log_sourcelocations && m_started_new_line) {
- str_prefixed.insert(0, "[" + RemovePrefix(source_file, "./") + ":" + ToString(source_line) + "] [" + logging_function + "] ");
+ str.insert(0, GetLogPrefix(category, level));
+
+ if (m_log_sourcelocations) {
+ str.insert(0, strprintf("[%s:%d] [%s] ", RemovePrefixView(source_file, "./"), source_line, logging_function));
}
- if (m_log_threadnames && m_started_new_line) {
- const auto& threadname = util::ThreadGetInternalName();
- str_prefixed.insert(0, "[" + (threadname.empty() ? "unknown" : threadname) + "] ");
+ if (m_log_threadnames) {
+ str.insert(0, strprintf("[%s] ", (threadname.empty() ? "unknown" : threadname)));
}
- str_prefixed = LogTimestampStr(str_prefixed);
+ str.insert(0, LogTimestampStr(now, mocktime));
+}
+
+void BCLog::Logger::LogPrintStr(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
+{
+ StdLockGuard scoped_lock(m_cs);
+ return LogPrintStr_(str, logging_function, source_file, source_line, category, level);
+}
- m_started_new_line = !str.empty() && str[str.size()-1] == '\n';
+void BCLog::Logger::LogPrintStr_(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
+{
+ std::string str_prefixed = LogEscapeMessage(str);
if (m_buffering) {
- // buffer if we haven't started logging yet
- m_msgs_before_open.push_back(str_prefixed);
+ {
+ BufferedLog buf{
+ .now=SystemClock::now(),
+ .mocktime=GetMockTime(),
+ .str=str_prefixed,
+ .logging_function=std::string(logging_function),
+ .source_file=std::string(source_file),
+ .threadname=util::ThreadGetInternalName(),
+ .source_line=source_line,
+ .category=category,
+ .level=level,
+ };
+ m_cur_buffer_memusage += MemUsage(buf);
+ m_msgs_before_open.push_back(std::move(buf));
+ }
+
+ while (m_cur_buffer_memusage > m_max_buffer_memusage) {
+ if (m_msgs_before_open.empty()) {
+ m_cur_buffer_memusage = 0;
+ break;
+ }
+ m_cur_buffer_memusage -= MemUsage(m_msgs_before_open.front());
+ m_msgs_before_open.pop_front();
+ ++m_buffer_lines_discarded;
+ }
+
return;
}
+ FormatLogStrInPlace(str_prefixed, category, level, source_file, source_line, logging_function, util::ThreadGetInternalName(), SystemClock::now(), GetMockTime());
+
if (m_print_to_console) {
// print to console
fwrite(str_prefixed.data(), 1, str_prefixed.size(), stdout);
@@ -444,7 +492,7 @@ void BCLog::Logger::ShrinkDebugFile()
fclose(file);
}
-bool BCLog::Logger::SetLogLevel(const std::string& level_str)
+bool BCLog::Logger::SetLogLevel(std::string_view level_str)
{
const auto level = GetLogLevel(level_str);
if (!level.has_value() || level.value() > MAX_USER_SETABLE_SEVERITY_LEVEL) return false;
@@ -452,7 +500,7 @@ bool BCLog::Logger::SetLogLevel(const std::string& level_str)
return true;
}
-bool BCLog::Logger::SetCategoryLogLevel(const std::string& category_str, const std::string& level_str)
+bool BCLog::Logger::SetCategoryLogLevel(std::string_view category_str, std::string_view level_str)
{
BCLog::LogFlags flag;
if (!GetLogCategory(flag, category_str)) return false;
diff --git a/src/logging.h b/src/logging.h
index fe6b7051ba..fdc12c79b3 100644
--- a/src/logging.h
+++ b/src/logging.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// 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.
@@ -10,6 +10,7 @@
#include <tinyformat.h>
#include <util/fs.h>
#include <util/string.h>
+#include <util/time.h>
#include <atomic>
#include <cstdint>
@@ -36,40 +37,41 @@ struct LogCategory {
};
namespace BCLog {
- enum LogFlags : uint32_t {
- NONE = 0,
- NET = (1 << 0),
- TOR = (1 << 1),
- MEMPOOL = (1 << 2),
- HTTP = (1 << 3),
- BENCH = (1 << 4),
- ZMQ = (1 << 5),
- WALLETDB = (1 << 6),
- RPC = (1 << 7),
- ESTIMATEFEE = (1 << 8),
- ADDRMAN = (1 << 9),
- SELECTCOINS = (1 << 10),
- REINDEX = (1 << 11),
- CMPCTBLOCK = (1 << 12),
- RAND = (1 << 13),
- PRUNE = (1 << 14),
- PROXY = (1 << 15),
- MEMPOOLREJ = (1 << 16),
- LIBEVENT = (1 << 17),
- COINDB = (1 << 18),
- QT = (1 << 19),
- LEVELDB = (1 << 20),
- VALIDATION = (1 << 21),
- I2P = (1 << 22),
- IPC = (1 << 23),
+ using CategoryMask = uint64_t;
+ enum LogFlags : CategoryMask {
+ NONE = CategoryMask{0},
+ NET = (CategoryMask{1} << 0),
+ TOR = (CategoryMask{1} << 1),
+ MEMPOOL = (CategoryMask{1} << 2),
+ HTTP = (CategoryMask{1} << 3),
+ BENCH = (CategoryMask{1} << 4),
+ ZMQ = (CategoryMask{1} << 5),
+ WALLETDB = (CategoryMask{1} << 6),
+ RPC = (CategoryMask{1} << 7),
+ ESTIMATEFEE = (CategoryMask{1} << 8),
+ ADDRMAN = (CategoryMask{1} << 9),
+ SELECTCOINS = (CategoryMask{1} << 10),
+ REINDEX = (CategoryMask{1} << 11),
+ CMPCTBLOCK = (CategoryMask{1} << 12),
+ RAND = (CategoryMask{1} << 13),
+ PRUNE = (CategoryMask{1} << 14),
+ PROXY = (CategoryMask{1} << 15),
+ MEMPOOLREJ = (CategoryMask{1} << 16),
+ LIBEVENT = (CategoryMask{1} << 17),
+ COINDB = (CategoryMask{1} << 18),
+ QT = (CategoryMask{1} << 19),
+ LEVELDB = (CategoryMask{1} << 20),
+ VALIDATION = (CategoryMask{1} << 21),
+ I2P = (CategoryMask{1} << 22),
+ IPC = (CategoryMask{1} << 23),
#ifdef DEBUG_LOCKCONTENTION
- LOCK = (1 << 24),
+ LOCK = (CategoryMask{1} << 24),
#endif
- BLOCKSTORAGE = (1 << 25),
- TXRECONCILIATION = (1 << 26),
- SCAN = (1 << 27),
- TXPACKAGES = (1 << 28),
- ALL = ~(uint32_t)0,
+ BLOCKSTORAGE = (CategoryMask{1} << 25),
+ TXRECONCILIATION = (CategoryMask{1} << 26),
+ SCAN = (CategoryMask{1} << 27),
+ TXPACKAGES = (CategoryMask{1} << 28),
+ ALL = ~NONE,
};
enum class Level {
Trace = 0, // High-volume or detailed logging for development/debugging
@@ -79,22 +81,29 @@ namespace BCLog {
Error,
};
constexpr auto DEFAULT_LOG_LEVEL{Level::Debug};
+ constexpr size_t DEFAULT_MAX_LOG_BUFFER{1'000'000}; // buffer up to 1MB of log data prior to StartLogging
class Logger
{
+ public:
+ struct BufferedLog {
+ SystemClock::time_point now;
+ std::chrono::seconds mocktime;
+ std::string str, logging_function, source_file, threadname;
+ int source_line;
+ LogFlags category;
+ Level level;
+ };
+
private:
mutable StdMutex m_cs; // Can not use Mutex from sync.h because in debug mode it would cause a deadlock when a potential deadlock was detected
FILE* m_fileout GUARDED_BY(m_cs) = nullptr;
- std::list<std::string> m_msgs_before_open GUARDED_BY(m_cs);
+ std::list<BufferedLog> m_msgs_before_open GUARDED_BY(m_cs);
bool m_buffering GUARDED_BY(m_cs) = true; //!< Buffer messages before logging can be started.
-
- /**
- * m_started_new_line is a state variable that will suppress printing of
- * the timestamp when multiple calls are made that don't end in a
- * newline.
- */
- std::atomic_bool m_started_new_line{true};
+ size_t m_max_buffer_memusage GUARDED_BY(m_cs){DEFAULT_MAX_LOG_BUFFER};
+ size_t m_cur_buffer_memusage GUARDED_BY(m_cs){0};
+ size_t m_buffer_lines_discarded GUARDED_BY(m_cs){0};
//! Category-specific log level. Overrides `m_log_level`.
std::unordered_map<LogFlags, Level> m_category_log_levels GUARDED_BY(m_cs);
@@ -104,13 +113,21 @@ namespace BCLog {
std::atomic<Level> m_log_level{DEFAULT_LOG_LEVEL};
/** Log categories bitfield. */
- std::atomic<uint32_t> m_categories{0};
+ std::atomic<CategoryMask> m_categories{BCLog::NONE};
+
+ void FormatLogStrInPlace(std::string& str, LogFlags category, Level level, std::string_view source_file, int source_line, std::string_view logging_function, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const;
- std::string LogTimestampStr(const std::string& str);
+ std::string LogTimestampStr(SystemClock::time_point now, std::chrono::seconds mocktime) const;
/** Slots that connect to the print signal */
std::list<std::function<void(const std::string&)>> m_print_callbacks GUARDED_BY(m_cs) {};
+ /** Send a string to the log output (internal) */
+ void LogPrintStr_(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
+ EXCLUSIVE_LOCKS_REQUIRED(m_cs);
+
+ std::string GetLogPrefix(LogFlags category, Level level) const;
+
public:
bool m_print_to_console = false;
bool m_print_to_file = false;
@@ -124,20 +141,19 @@ namespace BCLog {
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);
+ void LogPrintStr(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
+ EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
/** Returns whether logs will be written to any output */
- bool Enabled() const
+ bool Enabled() const EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
{
StdLockGuard scoped_lock(m_cs);
return m_buffering || m_print_to_console || m_print_to_file || !m_print_callbacks.empty();
}
/** Connect a slot to the print signal and return the connection */
- std::list<std::function<void(const std::string&)>>::iterator PushBackCallback(std::function<void(const std::string&)> fun)
+ std::list<std::function<void(const std::string&)>>::iterator PushBackCallback(std::function<void(const std::string&)> fun) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
{
StdLockGuard scoped_lock(m_cs);
m_print_callbacks.push_back(std::move(fun));
@@ -145,44 +161,52 @@ namespace BCLog {
}
/** Delete a connection */
- void DeleteCallback(std::list<std::function<void(const std::string&)>>::iterator it)
+ void DeleteCallback(std::list<std::function<void(const std::string&)>>::iterator it) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
{
StdLockGuard scoped_lock(m_cs);
m_print_callbacks.erase(it);
}
/** Start logging (and flush all buffered messages) */
- bool StartLogging();
+ bool StartLogging() EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
/** Only for testing */
- void DisconnectTestLogger();
+ void DisconnectTestLogger() EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
+
+ /** Disable logging
+ * This offers a slight speedup and slightly smaller memory usage
+ * compared to leaving the logging system in its default state.
+ * Mostly intended for libbitcoin-kernel apps that don't want any logging.
+ * Should be used instead of StartLogging().
+ */
+ void DisableLogging() EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
void ShrinkDebugFile();
- std::unordered_map<LogFlags, Level> CategoryLevels() const
+ std::unordered_map<LogFlags, Level> CategoryLevels() const EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
{
StdLockGuard scoped_lock(m_cs);
return m_category_log_levels;
}
- void SetCategoryLogLevel(const std::unordered_map<LogFlags, Level>& levels)
+ void SetCategoryLogLevel(const std::unordered_map<LogFlags, Level>& levels) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
{
StdLockGuard scoped_lock(m_cs);
m_category_log_levels = levels;
}
- bool SetCategoryLogLevel(const std::string& category_str, const std::string& level_str);
+ bool SetCategoryLogLevel(std::string_view category_str, std::string_view level_str) EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
Level LogLevel() const { return m_log_level.load(); }
void SetLogLevel(Level level) { m_log_level = level; }
- bool SetLogLevel(const std::string& level);
+ bool SetLogLevel(std::string_view level);
- uint32_t GetCategoryMask() const { return m_categories.load(); }
+ CategoryMask GetCategoryMask() const { return m_categories.load(); }
void EnableCategory(LogFlags flag);
- bool EnableCategory(const std::string& str);
+ bool EnableCategory(std::string_view str);
void DisableCategory(LogFlags flag);
- bool DisableCategory(const std::string& str);
+ bool DisableCategory(std::string_view str);
bool WillLogCategory(LogFlags category) const;
- bool WillLogCategoryLevel(LogFlags category, Level level) const;
+ bool WillLogCategoryLevel(LogFlags category, Level level) const EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
/** Returns a vector of the log categories in alphabetical order. */
std::vector<LogCategory> LogCategoriesList() const;
@@ -212,37 +236,34 @@ static inline bool LogAcceptCategory(BCLog::LogFlags category, BCLog::Level leve
}
/** Return true if str parses as a log category and set the flag */
-bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str);
-
-// Be conservative when using functions that
-// unconditionally log to debug.log! It should not be the case that an inbound
-// peer can fill up a user's disk with debug.log entries.
+bool GetLogCategory(BCLog::LogFlags& flag, std::string_view str);
template <typename... Args>
-static inline void LogPrintf_(const std::string& logging_function, const std::string& source_file, const int source_line, const BCLog::LogFlags flag, const BCLog::Level level, const char* fmt, const Args&... args)
+inline void LogPrintFormatInternal(std::string_view logging_function, std::string_view source_file, const int source_line, const BCLog::LogFlags flag, const BCLog::Level level, util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args)
{
if (LogInstance().Enabled()) {
std::string log_msg;
try {
log_msg = tfm::format(fmt, args...);
} catch (tinyformat::format_error& fmterr) {
- /* Original format string will have newline so don't add one here */
- log_msg = "Error \"" + std::string(fmterr.what()) + "\" while formatting log message: " + fmt;
+ log_msg = "Error \"" + std::string{fmterr.what()} + "\" while formatting log message: " + fmt.fmt;
}
LogInstance().LogPrintStr(log_msg, logging_function, source_file, source_line, flag, level);
}
}
-#define LogPrintLevel_(category, level, ...) LogPrintf_(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
+#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
// Log unconditionally.
+// Be conservative when using functions that unconditionally log to debug.log!
+// It should not be the case that an inbound peer can fill up a user's storage
+// with debug.log entries.
#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__)
// 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.
@@ -259,7 +280,4 @@ static inline void LogPrintf_(const std::string& logging_function, const std::st
#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__)
-
#endif // BITCOIN_LOGGING_H
diff --git a/src/logging/timer.h b/src/logging/timer.h
index 993ba99c25..0a6813cdd5 100644
--- a/src/logging/timer.h
+++ b/src/logging/timer.h
@@ -55,7 +55,7 @@ public:
if (m_log_category == BCLog::LogFlags::ALL) {
LogPrintf("%s\n", full_msg);
} else {
- LogPrint(m_log_category, "%s\n", full_msg);
+ LogDebug(m_log_category, "%s\n", full_msg);
}
}
@@ -87,7 +87,7 @@ private:
//! A descriptive message of what is being timed.
const std::string m_title;
- //! Forwarded on to LogPrint if specified - has the effect of only
+ //! Forwarded on to LogDebug if specified - has the effect of only
//! outputting the timing log when a particular debug= category is specified.
const BCLog::LogFlags m_log_category;
diff --git a/src/mapport.cpp b/src/mapport.cpp
index 1920297be6..993dade143 100644
--- a/src/mapport.cpp
+++ b/src/mapport.cpp
@@ -7,19 +7,17 @@
#include <mapport.h>
#include <clientversion.h>
+#include <common/netif.h>
+#include <common/pcp.h>
#include <common/system.h>
#include <logging.h>
#include <net.h>
#include <netaddress.h>
#include <netbase.h>
+#include <random.h>
#include <util/thread.h>
#include <util/threadinterrupt.h>
-#ifdef USE_NATPMP
-#include <compat/compat.h>
-#include <natpmp.h>
-#endif // USE_NATPMP
-
#ifdef USE_UPNP
#include <miniupnpc/miniupnpc.h>
#include <miniupnpc/upnpcommands.h>
@@ -36,7 +34,6 @@ static_assert(MINIUPNPC_API_VERSION >= 17, "miniUPnPc API version >= 17 assumed"
#include <string>
#include <thread>
-#if defined(USE_NATPMP) || defined(USE_UPNP)
static CThreadInterrupt g_mapport_interrupt;
static std::thread g_mapport_thread;
static std::atomic_uint g_mapport_enabled_protos{MapPortProtoFlag::NONE};
@@ -46,104 +43,96 @@ using namespace std::chrono_literals;
static constexpr auto PORT_MAPPING_REANNOUNCE_PERIOD{20min};
static constexpr auto PORT_MAPPING_RETRY_PERIOD{5min};
-#ifdef USE_NATPMP
-static uint16_t g_mapport_external_port = 0;
-static bool NatpmpInit(natpmp_t* natpmp)
+static bool ProcessPCP()
{
- const int r_init = initnatpmp(natpmp, /* detect gateway automatically */ 0, /* forced gateway - NOT APPLIED*/ 0);
- if (r_init == 0) return true;
- LogPrintf("natpmp: initnatpmp() failed with %d error.\n", r_init);
- return false;
-}
+ // The same nonce is used for all mappings, this is allowed by the spec, and simplifies keeping track of them.
+ PCPMappingNonce pcp_nonce;
+ GetRandBytes(pcp_nonce);
-static bool NatpmpDiscover(natpmp_t* natpmp, struct in_addr& external_ipv4_addr)
-{
- const int r_send = sendpublicaddressrequest(natpmp);
- if (r_send == 2 /* OK */) {
- int r_read;
- natpmpresp_t response;
- do {
- r_read = readnatpmpresponseorretry(natpmp, &response);
- } while (r_read == NATPMP_TRYAGAIN);
-
- if (r_read == 0) {
- external_ipv4_addr = response.pnu.publicaddress.addr;
- return true;
- } else if (r_read == NATPMP_ERR_NOGATEWAYSUPPORT) {
- LogPrintf("natpmp: The gateway does not support NAT-PMP.\n");
+ bool ret = false;
+ bool no_resources = false;
+ const uint16_t private_port = GetListenPort();
+ // Multiply the reannounce period by two, as we'll try to renew approximately halfway.
+ const uint32_t requested_lifetime = std::chrono::seconds(PORT_MAPPING_REANNOUNCE_PERIOD * 2).count();
+ uint32_t actual_lifetime = 0;
+ std::chrono::milliseconds sleep_time;
+
+ // Local functor to handle result from PCP/NATPMP mapping.
+ auto handle_mapping = [&](std::variant<MappingResult, MappingError> &res) -> void {
+ if (MappingResult* mapping = std::get_if<MappingResult>(&res)) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Info, "portmap: Added mapping %s\n", mapping->ToString());
+ AddLocal(mapping->external, LOCAL_MAPPED);
+ ret = true;
+ actual_lifetime = std::min(actual_lifetime, mapping->lifetime);
+ } else if (MappingError *err = std::get_if<MappingError>(&res)) {
+ // Detailed error will already have been logged internally in respective Portmap function.
+ if (*err == MappingError::NO_RESOURCES) {
+ no_resources = true;
+ }
+ }
+ };
+
+ do {
+ actual_lifetime = requested_lifetime;
+ no_resources = false; // Set to true if there was any "no resources" error.
+ ret = false; // Set to true if any mapping succeeds.
+
+ // IPv4
+ std::optional<CNetAddr> gateway4 = QueryDefaultGateway(NET_IPV4);
+ if (!gateway4) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "portmap: Could not determine IPv4 default gateway\n");
} else {
- LogPrintf("natpmp: readnatpmpresponseorretry() for public address failed with %d error.\n", r_read);
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "portmap: gateway [IPv4]: %s\n", gateway4->ToStringAddr());
+
+ // Open a port mapping on whatever local address we have toward the gateway.
+ struct in_addr inaddr_any;
+ inaddr_any.s_addr = htonl(INADDR_ANY);
+ auto res = PCPRequestPortMap(pcp_nonce, *gateway4, CNetAddr(inaddr_any), private_port, requested_lifetime);
+ MappingError* pcp_err = std::get_if<MappingError>(&res);
+ if (pcp_err && *pcp_err == MappingError::UNSUPP_VERSION) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "portmap: Got unsupported PCP version response, falling back to NAT-PMP\n");
+ res = NATPMPRequestPortMap(*gateway4, private_port, requested_lifetime);
+ }
+ handle_mapping(res);
}
- } else {
- LogPrintf("natpmp: sendpublicaddressrequest() failed with %d error.\n", r_send);
- }
- return false;
-}
+ // IPv6
+ std::optional<CNetAddr> gateway6 = QueryDefaultGateway(NET_IPV6);
+ if (!gateway6) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "portmap: Could not determine IPv6 default gateway\n");
+ } else {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "portmap: gateway [IPv6]: %s\n", gateway6->ToStringAddr());
-static bool NatpmpMapping(natpmp_t* natpmp, const struct in_addr& external_ipv4_addr, uint16_t private_port, bool& external_ip_discovered)
-{
- const uint16_t suggested_external_port = g_mapport_external_port ? g_mapport_external_port : private_port;
- const int r_send = sendnewportmappingrequest(natpmp, NATPMP_PROTOCOL_TCP, private_port, suggested_external_port, 3600 /*seconds*/);
- if (r_send == 12 /* OK */) {
- int r_read;
- natpmpresp_t response;
- do {
- r_read = readnatpmpresponseorretry(natpmp, &response);
- } while (r_read == NATPMP_TRYAGAIN);
-
- if (r_read == 0) {
- auto pm = response.pnu.newportmapping;
- if (private_port == pm.privateport && pm.lifetime > 0) {
- g_mapport_external_port = pm.mappedpublicport;
- const CService external{external_ipv4_addr, pm.mappedpublicport};
- if (!external_ip_discovered && fDiscover) {
- AddLocal(external, LOCAL_MAPPED);
- external_ip_discovered = true;
- }
- LogPrintf("natpmp: Port mapping successful. External address = %s\n", external.ToStringAddrPort());
- return true;
- } else {
- LogPrintf("natpmp: Port mapping failed.\n");
+ // Try to open pinholes for all routable local IPv6 addresses.
+ for (const auto &addr: GetLocalAddresses()) {
+ if (!addr.IsRoutable() || !addr.IsIPv6()) continue;
+ auto res = PCPRequestPortMap(pcp_nonce, *gateway6, addr, private_port, requested_lifetime);
+ handle_mapping(res);
}
- } else if (r_read == NATPMP_ERR_NOGATEWAYSUPPORT) {
- LogPrintf("natpmp: The gateway does not support NAT-PMP.\n");
- } else {
- LogPrintf("natpmp: readnatpmpresponseorretry() for port mapping failed with %d error.\n", r_read);
}
- } else {
- LogPrintf("natpmp: sendnewportmappingrequest() failed with %d error.\n", r_send);
- }
-
- return false;
-}
-static bool ProcessNatpmp()
-{
- bool ret = false;
- natpmp_t natpmp;
- struct in_addr external_ipv4_addr;
- if (NatpmpInit(&natpmp) && NatpmpDiscover(&natpmp, external_ipv4_addr)) {
- bool external_ip_discovered = false;
- const uint16_t private_port = GetListenPort();
- do {
- ret = NatpmpMapping(&natpmp, external_ipv4_addr, private_port, external_ip_discovered);
- } while (ret && g_mapport_interrupt.sleep_for(PORT_MAPPING_REANNOUNCE_PERIOD));
- g_mapport_interrupt.reset();
+ // Log message if we got NO_RESOURCES.
+ if (no_resources) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "portmap: At least one mapping failed because of a NO_RESOURCES error. This usually indicates that the port is already used on the router. If this is the only instance of bitcoin running on the network, this will resolve itself automatically. Otherwise, you might want to choose a different P2P port to prevent this conflict.\n");
+ }
- const int r_send = sendnewportmappingrequest(&natpmp, NATPMP_PROTOCOL_TCP, private_port, g_mapport_external_port, /* remove a port mapping */ 0);
- g_mapport_external_port = 0;
- if (r_send == 12 /* OK */) {
- LogPrintf("natpmp: Port mapping removed successfully.\n");
- } else {
- LogPrintf("natpmp: sendnewportmappingrequest(0) failed with %d error.\n", r_send);
+ // Sanity-check returned lifetime.
+ if (actual_lifetime < 30) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "portmap: Got impossibly short mapping lifetime of %d seconds\n", actual_lifetime);
+ return false;
}
- }
+ // RFC6887 11.2.1 recommends that clients send their first renewal packet at a time chosen with uniform random
+ // distribution in the range 1/2 to 5/8 of expiration time.
+ std::chrono::seconds sleep_time_min(actual_lifetime / 2);
+ std::chrono::seconds sleep_time_max(actual_lifetime * 5 / 8);
+ sleep_time = sleep_time_min + FastRandomContext().randrange<std::chrono::milliseconds>(sleep_time_max - sleep_time_min);
+ } while (ret && g_mapport_interrupt.sleep_for(sleep_time));
+
+ // We don't delete the mappings when the thread is interrupted because this would add additional complexity, so
+ // we rather just choose a fairly short expiry time.
- closenatpmp(&natpmp);
return ret;
}
-#endif // USE_NATPMP
#ifdef USE_UPNP
static bool ProcessUpnp()
@@ -223,23 +212,21 @@ static void ThreadMapPort()
do {
ok = false;
-#ifdef USE_UPNP
// High priority protocol.
- if (g_mapport_enabled_protos & MapPortProtoFlag::UPNP) {
- g_mapport_current_proto = MapPortProtoFlag::UPNP;
- ok = ProcessUpnp();
+ if (g_mapport_enabled_protos & MapPortProtoFlag::PCP) {
+ g_mapport_current_proto = MapPortProtoFlag::PCP;
+ ok = ProcessPCP();
if (ok) continue;
}
-#endif // USE_UPNP
-#ifdef USE_NATPMP
+#ifdef USE_UPNP
// Low priority protocol.
- if (g_mapport_enabled_protos & MapPortProtoFlag::NAT_PMP) {
- g_mapport_current_proto = MapPortProtoFlag::NAT_PMP;
- ok = ProcessNatpmp();
+ if (g_mapport_enabled_protos & MapPortProtoFlag::UPNP) {
+ g_mapport_current_proto = MapPortProtoFlag::UPNP;
+ ok = ProcessUpnp();
if (ok) continue;
}
-#endif // USE_NATPMP
+#endif // USE_UPNP
g_mapport_current_proto = MapPortProtoFlag::NONE;
if (g_mapport_enabled_protos == MapPortProtoFlag::NONE) {
@@ -281,7 +268,7 @@ static void DispatchMapPort()
assert(g_mapport_thread.joinable());
assert(!g_mapport_interrupt);
- // Interrupt a protocol-specific loop in the ThreadUpnp() or in the ThreadNatpmp()
+ // Interrupt a protocol-specific loop in the ThreadUpnp() or in the ThreadPCP()
// to force trying the next protocol in the ThreadMapPort() loop.
g_mapport_interrupt();
}
@@ -295,10 +282,10 @@ static void MapPortProtoSetEnabled(MapPortProtoFlag proto, bool enabled)
}
}
-void StartMapPort(bool use_upnp, bool use_natpmp)
+void StartMapPort(bool use_upnp, bool use_pcp)
{
MapPortProtoSetEnabled(MapPortProtoFlag::UPNP, use_upnp);
- MapPortProtoSetEnabled(MapPortProtoFlag::NAT_PMP, use_natpmp);
+ MapPortProtoSetEnabled(MapPortProtoFlag::PCP, use_pcp);
DispatchMapPort();
}
@@ -317,18 +304,3 @@ void StopMapPort()
g_mapport_interrupt.reset();
}
}
-
-#else // #if defined(USE_NATPMP) || defined(USE_UPNP)
-void StartMapPort(bool use_upnp, bool use_natpmp)
-{
- // Intentionally left blank.
-}
-void InterruptMapPort()
-{
- // Intentionally left blank.
-}
-void StopMapPort()
-{
- // Intentionally left blank.
-}
-#endif // #if defined(USE_NATPMP) || defined(USE_UPNP)
diff --git a/src/mapport.h b/src/mapport.h
index 6f55c46f6c..51202687f2 100644
--- a/src/mapport.h
+++ b/src/mapport.h
@@ -12,10 +12,10 @@ static constexpr bool DEFAULT_NATPMP = false;
enum MapPortProtoFlag : unsigned int {
NONE = 0x00,
UPNP = 0x01,
- NAT_PMP = 0x02,
+ PCP = 0x02, // PCP with NAT-PMP fallback.
};
-void StartMapPort(bool use_upnp, bool use_natpmp);
+void StartMapPort(bool use_upnp, bool use_pcp);
void InterruptMapPort();
void StopMapPort();
diff --git a/src/merkleblock.h b/src/merkleblock.h
index 12b41a581e..945b7d3341 100644
--- a/src/merkleblock.h
+++ b/src/merkleblock.h
@@ -147,7 +147,7 @@ public:
// Create from a CBlock, matching the txids in the set
CMerkleBlock(const CBlock& block, const std::set<Txid>& txids) : CMerkleBlock{block, nullptr, &txids} {}
- CMerkleBlock() {}
+ CMerkleBlock() = default;
SERIALIZE_METHODS(CMerkleBlock, obj) { READWRITE(obj.header, obj.txn); }
diff --git a/src/net.cpp b/src/net.cpp
index 990c58ee3d..3f9918d2b1 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -12,6 +12,7 @@
#include <banman.h>
#include <clientversion.h>
#include <common/args.h>
+#include <common/netif.h>
#include <compat/compat.h>
#include <consensus/consensus.h>
#include <crypto/sha256.h>
@@ -46,13 +47,12 @@
#include <algorithm>
#include <array>
+#include <cmath>
#include <cstdint>
#include <functional>
#include <optional>
#include <unordered_map>
-#include <math.h>
-
/** Maximum number of block-relay-only anchor connections */
static constexpr size_t MAX_BLOCK_RELAY_ONLY_ANCHORS = 2;
static_assert (MAX_BLOCK_RELAY_ONLY_ANCHORS <= static_cast<size_t>(MAX_BLOCK_RELAY_ONLY_CONNECTIONS), "MAX_BLOCK_RELAY_ONLY_ANCHORS must not exceed MAX_BLOCK_RELAY_ONLY_CONNECTIONS.");
@@ -65,6 +65,9 @@ static constexpr std::chrono::minutes DUMP_PEERS_INTERVAL{15};
/** Number of DNS seeds to query when the number of connections is low. */
static constexpr int DNSSEEDS_TO_QUERY_AT_ONCE = 3;
+/** Minimum number of outbound connections under which we will keep fetching our address seeds. */
+static constexpr int SEED_OUTBOUND_CONNECTION_THRESHOLD = 2;
+
/** How long to delay before querying DNS seeds
*
* If we have more than THRESHOLD entries in addrman, then it's likely
@@ -202,7 +205,7 @@ static std::vector<CAddress> ConvertSeeds(const std::vector<uint8_t> &vSeedsIn)
s >> endpoint;
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());
+ LogDebug(BCLog::NET, "Added hardcoded seed: %s\n", addr.ToStringAddrPort());
vSeedsOut.push_back(addr);
}
return vSeedsOut;
@@ -255,7 +258,7 @@ std::optional<CService> GetLocalAddrForPeer(CNode& node)
}
}
if (addrLocal.IsRoutable()) {
- LogPrint(BCLog::NET, "Advertising address %s to peer=%d\n", addrLocal.ToStringAddrPort(), node.GetId());
+ LogDebug(BCLog::NET, "Advertising address %s to peer=%d\n", addrLocal.ToStringAddrPort(), node.GetId());
return addrLocal;
}
// Address is unroutable. Don't advertise.
@@ -415,13 +418,13 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
if (pszDest) {
std::vector<CService> resolved{Lookup(pszDest, default_port, fNameLookup && !HaveNameProxy(), 256)};
if (!resolved.empty()) {
- Shuffle(resolved.begin(), resolved.end(), FastRandomContext());
+ std::shuffle(resolved.begin(), resolved.end(), FastRandomContext());
// If the connection is made by name, it can be the case that the name resolves to more than one address.
// We don't want to connect any more of them if we are already connected to one
for (const auto& r : resolved) {
addrConnect = CAddress{MaybeFlipIPv6toCJDNS(r), NODE_NONE};
if (!addrConnect.IsValid()) {
- LogPrint(BCLog::NET, "Resolver returned invalid address %s for %s\n", addrConnect.ToStringAddrPort(), pszDest);
+ LogDebug(BCLog::NET, "Resolver returned invalid address %s for %s\n", addrConnect.ToStringAddrPort(), pszDest);
return nullptr;
}
// It is possible that we already have a connection to the IP/port pszDest resolved to.
@@ -551,7 +554,7 @@ void CNode::CloseSocketDisconnect()
fDisconnect = true;
LOCK(m_sock_mutex);
if (m_sock) {
- LogPrint(BCLog::NET, "disconnecting peer=%d\n", id);
+ LogDebug(BCLog::NET, "disconnecting peer=%d\n", id);
m_sock.reset();
}
m_i2p_sam_session.reset();
@@ -576,16 +579,14 @@ CService CNode::GetAddrLocal() const
{
AssertLockNotHeld(m_addr_local_mutex);
LOCK(m_addr_local_mutex);
- return addrLocal;
+ return m_addr_local;
}
void CNode::SetAddrLocal(const CService& addrLocalIn) {
AssertLockNotHeld(m_addr_local_mutex);
LOCK(m_addr_local_mutex);
- if (addrLocal.IsValid()) {
- LogError("Addr local already set for node: %i. Refusing to change from %s to %s\n", id, addrLocal.ToStringAddrPort(), addrLocalIn.ToStringAddrPort());
- } else {
- addrLocal = addrLocalIn;
+ if (Assume(!m_addr_local.IsValid())) { // Addr local can only be set once during version msg processing
+ m_addr_local = addrLocalIn;
}
}
@@ -722,19 +723,19 @@ int V1Transport::readHeader(Span<const uint8_t> msg_bytes)
hdrbuf >> hdr;
}
catch (const std::exception&) {
- LogPrint(BCLog::NET, "Header error: Unable to deserialize, peer=%d\n", m_node_id);
+ LogDebug(BCLog::NET, "Header error: Unable to deserialize, peer=%d\n", m_node_id);
return -1;
}
// Check start string, network magic
if (hdr.pchMessageStart != m_magic_bytes) {
- LogPrint(BCLog::NET, "Header error: Wrong MessageStart %s received, peer=%d\n", HexStr(hdr.pchMessageStart), m_node_id);
+ LogDebug(BCLog::NET, "Header error: Wrong MessageStart %s received, peer=%d\n", HexStr(hdr.pchMessageStart), m_node_id);
return -1;
}
// reject messages larger than MAX_SIZE or MAX_PROTOCOL_MESSAGE_LENGTH
if (hdr.nMessageSize > MAX_SIZE || hdr.nMessageSize > MAX_PROTOCOL_MESSAGE_LENGTH) {
- LogPrint(BCLog::NET, "Header error: Size too large (%s, %u bytes), peer=%d\n", SanitizeString(hdr.GetCommand()), hdr.nMessageSize, m_node_id);
+ LogDebug(BCLog::NET, "Header error: Size too large (%s, %u bytes), peer=%d\n", SanitizeString(hdr.GetCommand()), hdr.nMessageSize, m_node_id);
return -1;
}
@@ -793,14 +794,14 @@ CNetMessage V1Transport::GetReceivedMessage(const std::chrono::microseconds time
// Check checksum and header message type string
if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0) {
- LogPrint(BCLog::NET, "Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n",
+ LogDebug(BCLog::NET, "Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n",
SanitizeString(msg.m_type), msg.m_message_size,
HexStr(Span{hash}.first(CMessageHeader::CHECKSUM_SIZE)),
HexStr(hdr.pchChecksum),
m_node_id);
reject_message = true;
} else if (!hdr.IsCommandValid()) {
- LogPrint(BCLog::NET, "Header error: Invalid message type (%s, %u bytes), peer=%d\n",
+ LogDebug(BCLog::NET, "Header error: Invalid message type (%s, %u bytes), peer=%d\n",
SanitizeString(hdr.GetCommand()), msg.m_message_size, m_node_id);
reject_message = true;
}
@@ -1103,7 +1104,7 @@ bool V2Transport::ProcessReceivedKeyBytes() noexcept
static constexpr size_t OFFSET = std::tuple_size_v<MessageStartChars>;
if (!m_initiating && m_recv_buffer.size() >= OFFSET + MATCH.size()) {
if (std::equal(MATCH.begin(), MATCH.end(), m_recv_buffer.begin() + OFFSET)) {
- LogPrint(BCLog::NET, "V2 transport error: V1 peer with wrong MessageStart %s\n",
+ LogDebug(BCLog::NET, "V2 transport error: V1 peer with wrong MessageStart %s\n",
HexStr(Span(m_recv_buffer).first(OFFSET)));
return false;
}
@@ -1152,7 +1153,7 @@ bool V2Transport::ProcessReceivedGarbageBytes() noexcept
Assume(m_recv_state == RecvState::GARB_GARBTERM);
Assume(m_recv_buffer.size() <= MAX_GARBAGE_LEN + BIP324Cipher::GARBAGE_TERMINATOR_LEN);
if (m_recv_buffer.size() >= BIP324Cipher::GARBAGE_TERMINATOR_LEN) {
- if (MakeByteSpan(m_recv_buffer).last(BIP324Cipher::GARBAGE_TERMINATOR_LEN) == m_cipher.GetReceiveGarbageTerminator()) {
+ if (std::ranges::equal(MakeByteSpan(m_recv_buffer).last(BIP324Cipher::GARBAGE_TERMINATOR_LEN), m_cipher.GetReceiveGarbageTerminator())) {
// Garbage terminator received. Store garbage to authenticate it as AAD later.
m_recv_aad = std::move(m_recv_buffer);
m_recv_aad.resize(m_recv_aad.size() - BIP324Cipher::GARBAGE_TERMINATOR_LEN);
@@ -1161,7 +1162,7 @@ bool V2Transport::ProcessReceivedGarbageBytes() noexcept
} else if (m_recv_buffer.size() == MAX_GARBAGE_LEN + BIP324Cipher::GARBAGE_TERMINATOR_LEN) {
// We've reached the maximum length for garbage + garbage terminator, and the
// terminator still does not match. Abort.
- LogPrint(BCLog::NET, "V2 transport error: missing garbage terminator, peer=%d\n", m_nodeid);
+ LogDebug(BCLog::NET, "V2 transport error: missing garbage terminator, peer=%d\n", m_nodeid);
return false;
} else {
// We still need to receive more garbage and/or garbage terminator bytes.
@@ -1190,7 +1191,7 @@ bool V2Transport::ProcessReceivedPacketBytes() noexcept
// Length descriptor received.
m_recv_len = m_cipher.DecryptLength(MakeByteSpan(m_recv_buffer));
if (m_recv_len > MAX_CONTENTS_LEN) {
- LogPrint(BCLog::NET, "V2 transport error: packet too large (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
+ LogDebug(BCLog::NET, "V2 transport error: packet too large (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
return false;
}
} else if (m_recv_buffer.size() > BIP324Cipher::LENGTH_LEN && m_recv_buffer.size() == m_recv_len + BIP324Cipher::EXPANSION) {
@@ -1205,7 +1206,7 @@ bool V2Transport::ProcessReceivedPacketBytes() noexcept
/*ignore=*/ignore,
/*contents=*/MakeWritableByteSpan(m_recv_decode_buffer));
if (!ret) {
- LogPrint(BCLog::NET, "V2 transport error: packet decryption failure (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
+ LogDebug(BCLog::NET, "V2 transport error: packet decryption failure (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
return false;
}
// We have decrypted a valid packet with the AAD we expected, so clear the expected AAD.
@@ -1441,7 +1442,7 @@ CNetMessage V2Transport::GetReceivedMessage(std::chrono::microseconds time, bool
msg.m_recv.resize(contents.size());
std::copy(contents.begin(), contents.end(), UCharCast(msg.m_recv.data()));
} else {
- LogPrint(BCLog::NET, "V2 transport error: invalid message type (%u bytes contents), peer=%d\n", m_recv_decode_buffer.size(), m_nodeid);
+ LogDebug(BCLog::NET, "V2 transport error: invalid message type (%u bytes contents), peer=%d\n", m_recv_decode_buffer.size(), m_nodeid);
reject_message = true;
}
ClearShrink(m_recv_decode_buffer);
@@ -1506,7 +1507,7 @@ void V2Transport::MarkBytesSent(size_t bytes_sent) noexcept
if (m_send_state == SendState::V1) return m_v1_fallback.MarkBytesSent(bytes_sent);
if (m_send_state == SendState::AWAITING_KEY && m_send_pos == 0 && bytes_sent > 0) {
- LogPrint(BCLog::NET, "start sending v2 handshake to peer=%d\n", m_nodeid);
+ LogDebug(BCLog::NET, "start sending v2 handshake to peer=%d\n", m_nodeid);
}
m_send_pos += bytes_sent;
@@ -1630,7 +1631,7 @@ std::pair<size_t, bool> CConnman::SocketSendData(CNode& node) const
// error
int nErr = WSAGetLastError();
if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) {
- LogPrint(BCLog::NET, "socket send error for peer=%d: %s\n", node.GetId(), NetworkErrorString(nErr));
+ LogDebug(BCLog::NET, "socket send error for peer=%d: %s\n", node.GetId(), NetworkErrorString(nErr));
node.CloseSocketDisconnect();
}
}
@@ -1690,7 +1691,7 @@ bool CConnman::AttemptToEvictConnection()
LOCK(m_nodes_mutex);
for (CNode* pnode : m_nodes) {
if (pnode->GetId() == *node_id_to_evict) {
- LogPrint(BCLog::NET, "selected %s connection for eviction peer=%d; disconnecting\n", pnode->ConnectionTypeAsString(), pnode->GetId());
+ LogDebug(BCLog::NET, "selected %s connection for eviction peer=%d; disconnecting\n", pnode->ConnectionTypeAsString(), pnode->GetId());
pnode->fDisconnect = true;
return true;
}
@@ -1743,7 +1744,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
}
if (!fNetworkActive) {
- LogPrint(BCLog::NET, "connection from %s dropped: not accepting new connections\n", addr.ToStringAddrPort());
+ LogDebug(BCLog::NET, "connection from %s dropped: not accepting new connections\n", addr.ToStringAddrPort());
return;
}
@@ -1756,7 +1757,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
// on all platforms. Set it again here just to be sure.
const int on{1};
if (sock->SetSockOpt(IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == SOCKET_ERROR) {
- LogPrint(BCLog::NET, "connection from %s: unable to set TCP_NODELAY, continuing anyway\n",
+ LogDebug(BCLog::NET, "connection from %s: unable to set TCP_NODELAY, continuing anyway\n",
addr.ToStringAddrPort());
}
@@ -1764,7 +1765,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
bool banned = m_banman && m_banman->IsBanned(addr);
if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && banned)
{
- LogPrint(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToStringAddrPort());
+ LogDebug(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToStringAddrPort());
return;
}
@@ -1772,7 +1773,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
bool discouraged = m_banman && m_banman->IsDiscouraged(addr);
if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && nInbound + 1 >= m_max_inbound && discouraged)
{
- LogPrint(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToStringAddrPort());
+ LogDebug(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToStringAddrPort());
return;
}
@@ -1780,7 +1781,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
{
if (!AttemptToEvictConnection()) {
// No connection to evict, disconnect the new connection
- LogPrint(BCLog::NET, "failed to find an eviction candidate - connection dropped (full)\n");
+ LogDebug(BCLog::NET, "failed to find an eviction candidate - connection dropped (full)\n");
return;
}
}
@@ -1791,7 +1792,8 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end();
// The V2Transport transparently falls back to V1 behavior when an incoming V1 connection is
// detected, so use it whenever we signal NODE_P2P_V2.
- const bool use_v2transport(nLocalServices & NODE_P2P_V2);
+ ServiceFlags local_services = GetLocalServices();
+ const bool use_v2transport(local_services & NODE_P2P_V2);
CNode* pnode = new CNode(id,
std::move(sock),
@@ -1809,14 +1811,12 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
.use_v2transport = use_v2transport,
});
pnode->AddRef();
- m_msgproc->InitializeNode(*pnode, nLocalServices);
-
- LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToStringAddrPort());
-
+ m_msgproc->InitializeNode(*pnode, local_services);
{
LOCK(m_nodes_mutex);
m_nodes.push_back(pnode);
}
+ LogDebug(BCLog::NET, "connection from %s accepted\n", addr.ToStringAddrPort());
// We received a new connection, harvest entropy from the time (and our peer count)
RandAddEvent((uint32_t)id);
@@ -1875,7 +1875,7 @@ void CConnman::DisconnectNodes()
// Disconnect any connected nodes
for (CNode* pnode : m_nodes) {
if (!pnode->fDisconnect) {
- LogPrint(BCLog::NET, "Network not active, dropping peer=%d\n", pnode->GetId());
+ LogDebug(BCLog::NET, "Network not active, dropping peer=%d\n", pnode->GetId());
pnode->fDisconnect = true;
}
}
@@ -1900,7 +1900,7 @@ void CConnman::DisconnectNodes()
.destination = pnode->m_dest,
.conn_type = pnode->m_conn_type,
.use_v2transport = false});
- LogPrint(BCLog::NET, "retrying with v1 transport protocol for peer=%d\n", pnode->GetId());
+ LogDebug(BCLog::NET, "retrying with v1 transport protocol for peer=%d\n", pnode->GetId());
}
// release outbound grant (if any)
@@ -1968,22 +1968,26 @@ bool CConnman::InactivityCheck(const CNode& node) const
if (!ShouldRunInactivityChecks(node, now)) return false;
if (last_recv.count() == 0 || last_send.count() == 0) {
- LogPrint(BCLog::NET, "socket no message in first %i seconds, %d %d peer=%d\n", count_seconds(m_peer_connect_timeout), last_recv.count() != 0, last_send.count() != 0, node.GetId());
+ LogDebug(BCLog::NET, "socket no message in first %i seconds, %d %d peer=%d\n", count_seconds(m_peer_connect_timeout), last_recv.count() != 0, last_send.count() != 0, node.GetId());
return true;
}
if (now > last_send + TIMEOUT_INTERVAL) {
- LogPrint(BCLog::NET, "socket sending timeout: %is peer=%d\n", count_seconds(now - last_send), node.GetId());
+ LogDebug(BCLog::NET, "socket sending timeout: %is peer=%d\n", count_seconds(now - last_send), node.GetId());
return true;
}
if (now > last_recv + TIMEOUT_INTERVAL) {
- LogPrint(BCLog::NET, "socket receive timeout: %is peer=%d\n", count_seconds(now - last_recv), node.GetId());
+ LogDebug(BCLog::NET, "socket receive timeout: %is peer=%d\n", count_seconds(now - last_recv), node.GetId());
return true;
}
if (!node.fSuccessfullyConnected) {
- LogPrint(BCLog::NET, "version handshake timeout peer=%d\n", node.GetId());
+ if (node.m_transport->GetInfo().transport_type == TransportProtocolType::DETECTING) {
+ LogDebug(BCLog::NET, "V2 handshake timeout peer=%d\n", node.GetId());
+ } else {
+ LogDebug(BCLog::NET, "version handshake timeout peer=%d\n", node.GetId());
+ }
return true;
}
@@ -2122,7 +2126,7 @@ void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
{
// socket closed gracefully
if (!pnode->fDisconnect) {
- LogPrint(BCLog::NET, "socket closed for peer=%d\n", pnode->GetId());
+ LogDebug(BCLog::NET, "socket closed for peer=%d\n", pnode->GetId());
}
pnode->CloseSocketDisconnect();
}
@@ -2133,7 +2137,7 @@ void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
{
if (!pnode->fDisconnect) {
- LogPrint(BCLog::NET, "socket recv error for peer=%d: %s\n", pnode->GetId(), NetworkErrorString(nErr));
+ LogDebug(BCLog::NET, "socket recv error for peer=%d: %s\n", pnode->GetId(), NetworkErrorString(nErr));
}
pnode->CloseSocketDisconnect();
}
@@ -2180,7 +2184,6 @@ void CConnman::WakeMessageHandler()
void CConnman::ThreadDNSAddressSeed()
{
- constexpr int TARGET_OUTBOUND_CONNECTIONS = 2;
int outbound_connection_count = 0;
if (gArgs.IsArgSet("-seednode")) {
@@ -2199,7 +2202,7 @@ void CConnman::ThreadDNSAddressSeed()
}
outbound_connection_count = GetFullOutboundConnCount();
- if (outbound_connection_count >= TARGET_OUTBOUND_CONNECTIONS) {
+ if (outbound_connection_count >= SEED_OUTBOUND_CONNECTION_THRESHOLD) {
LogPrintf("P2P peers available. Finished fetching data from seed nodes.\n");
break;
}
@@ -2208,7 +2211,7 @@ void CConnman::ThreadDNSAddressSeed()
FastRandomContext rng;
std::vector<std::string> seeds = m_params.DNSSeeds();
- Shuffle(seeds.begin(), seeds.end(), rng);
+ std::shuffle(seeds.begin(), seeds.end(), rng);
int seeds_right_now = 0; // Number of seeds left before testing if we have enough connections
if (gArgs.GetBoolArg("-forcednsseed", DEFAULT_FORCEDNSSEED)) {
@@ -2222,7 +2225,7 @@ void CConnman::ThreadDNSAddressSeed()
}
// Proceed with dnsseeds if seednodes hasn't reached the target or if forcednsseed is set
- if (outbound_connection_count < TARGET_OUTBOUND_CONNECTIONS || seeds_right_now) {
+ if (outbound_connection_count < SEED_OUTBOUND_CONNECTION_THRESHOLD || seeds_right_now) {
// goal: only query DNS seed if address need is acute
// * If we have a reasonable number of peers in addrman, spend
// some time trying them first. This improves user privacy by
@@ -2253,7 +2256,7 @@ void CConnman::ThreadDNSAddressSeed()
if (!interruptNet.sleep_for(w)) return;
to_wait -= w;
- if (GetFullOutboundConnCount() >= TARGET_OUTBOUND_CONNECTIONS) {
+ if (GetFullOutboundConnCount() >= SEED_OUTBOUND_CONNECTION_THRESHOLD) {
if (found > 0) {
LogPrintf("%d addresses found from DNS seeds\n", found);
LogPrintf("P2P peers available. Finished DNS seeding.\n");
@@ -2324,7 +2327,7 @@ void CConnman::DumpAddresses()
DumpPeerAddresses(::gArgs, addrman);
- LogPrint(BCLog::NET, "Flushed %d addresses to peers.dat %dms\n",
+ LogDebug(BCLog::NET, "Flushed %d addresses to peers.dat %dms\n",
addrman.Size(), Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
}
@@ -2357,12 +2360,12 @@ bool CConnman::GetTryNewOutboundPeer() const
void CConnman::SetTryNewOutboundPeer(bool flag)
{
m_try_another_outbound_peer = flag;
- LogPrint(BCLog::NET, "setting try another outbound peer=%s\n", flag ? "true" : "false");
+ LogDebug(BCLog::NET, "setting try another outbound peer=%s\n", flag ? "true" : "false");
}
void CConnman::StartExtraBlockRelayPeers()
{
- LogPrint(BCLog::NET, "enabling extra block-relay-only peers\n");
+ LogDebug(BCLog::NET, "enabling extra block-relay-only peers\n");
m_start_extra_block_relay_peers = true;
}
@@ -2435,7 +2438,7 @@ bool CConnman::MultipleManualOrFullOutboundConns(Network net) const
bool CConnman::MaybePickPreferredNetwork(std::optional<Network>& network)
{
std::array<Network, 5> nets{NET_IPV4, NET_IPV6, NET_ONION, NET_I2P, NET_CJDNS};
- Shuffle(nets.begin(), nets.end(), FastRandomContext());
+ std::shuffle(nets.begin(), nets.end(), FastRandomContext());
LOCK(m_nodes_mutex);
for (const auto net : nets) {
@@ -2448,7 +2451,7 @@ bool CConnman::MaybePickPreferredNetwork(std::optional<Network>& network)
return false;
}
-void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
+void CConnman::ThreadOpenConnections(const std::vector<std::string> connect, Span<const std::string> seed_nodes)
{
AssertLockNotHeld(m_unused_i2p_sessions_mutex);
AssertLockNotHeld(m_reconnections_mutex);
@@ -2481,19 +2484,35 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
auto start = GetTime<std::chrono::microseconds>();
// Minimum time before next feeler connection (in microseconds).
- auto next_feeler = GetExponentialRand(start, FEELER_INTERVAL);
- auto next_extra_block_relay = GetExponentialRand(start, EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
- auto next_extra_network_peer{GetExponentialRand(start, EXTRA_NETWORK_PEER_INTERVAL)};
+ auto next_feeler = start + rng.rand_exp_duration(FEELER_INTERVAL);
+ auto next_extra_block_relay = start + rng.rand_exp_duration(EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
+ auto next_extra_network_peer{start + rng.rand_exp_duration(EXTRA_NETWORK_PEER_INTERVAL)};
const bool dnsseed = gArgs.GetBoolArg("-dnsseed", DEFAULT_DNSSEED);
bool add_fixed_seeds = gArgs.GetBoolArg("-fixedseeds", DEFAULT_FIXEDSEEDS);
const bool use_seednodes{gArgs.IsArgSet("-seednode")};
+ auto seed_node_timer = NodeClock::now();
+ bool add_addr_fetch{addrman.Size() == 0 && !seed_nodes.empty()};
+ constexpr std::chrono::seconds ADD_NEXT_SEEDNODE = 10s;
+
if (!add_fixed_seeds) {
LogPrintf("Fixed seeds are disabled\n");
}
while (!interruptNet)
{
+ if (add_addr_fetch) {
+ add_addr_fetch = false;
+ const auto& seed{SpanPopBack(seed_nodes)};
+ AddAddrFetch(seed);
+
+ if (addrman.Size() == 0) {
+ LogInfo("Empty addrman, adding seednode (%s) to addrfetch\n", seed);
+ } else {
+ LogInfo("Couldn't connect to peers from addrman after %d seconds. Adding seednode (%s) to addrfetch\n", ADD_NEXT_SEEDNODE.count(), seed);
+ }
+ }
+
ProcessAddrFetch();
if (!interruptNet.sleep_for(std::chrono::milliseconds(500)))
@@ -2594,6 +2613,13 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
}
}
+ if (!seed_nodes.empty() && nOutboundFullRelay < SEED_OUTBOUND_CONNECTION_THRESHOLD) {
+ if (NodeClock::now() > seed_node_timer + ADD_NEXT_SEEDNODE) {
+ seed_node_timer = NodeClock::now();
+ add_addr_fetch = true;
+ }
+ }
+
ConnectionType conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
auto now = GetTime<std::chrono::microseconds>();
bool anchor = false;
@@ -2642,10 +2668,10 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
// Because we can promote these connections to block-relay-only
// connections, they do not get their own ConnectionType enum
// (similar to how we deal with extra outbound peers).
- next_extra_block_relay = GetExponentialRand(now, EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
+ next_extra_block_relay = now + rng.rand_exp_duration(EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
conn_type = ConnectionType::BLOCK_RELAY;
} else if (now > next_feeler) {
- next_feeler = GetExponentialRand(now, FEELER_INTERVAL);
+ next_feeler = now + rng.rand_exp_duration(FEELER_INTERVAL);
conn_type = ConnectionType::FEELER;
fFeeler = true;
} else if (nOutboundFullRelay == m_max_outbound_full_relay &&
@@ -2658,7 +2684,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
// This is not attempted if the user changed -maxconnections to a value
// so low that less than MAX_OUTBOUND_FULL_RELAY_CONNECTIONS are made,
// to prevent interactions with otherwise protected outbound peers.
- next_extra_network_peer = GetExponentialRand(now, EXTRA_NETWORK_PEER_INTERVAL);
+ next_extra_network_peer = now + rng.rand_exp_duration(EXTRA_NETWORK_PEER_INTERVAL);
} else {
// skip to next iteration of while loop
continue;
@@ -2668,6 +2694,8 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
const auto current_time{NodeClock::now()};
int nTries = 0;
+ const auto reachable_nets{g_reachable_nets.All()};
+
while (!interruptNet)
{
if (anchor && !m_anchors.empty()) {
@@ -2677,7 +2705,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
!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());
+ LogDebug(BCLog::NET, "Trying to make an anchor connection to %s\n", addrConnect.ToStringAddrPort());
break;
}
@@ -2699,7 +2727,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
if (!addr.IsValid()) {
// No tried table collisions. Select a new table address
// for our feeler.
- std::tie(addr, addr_last_try) = addrman.Select(true);
+ std::tie(addr, addr_last_try) = addrman.Select(true, reachable_nets);
} else if (AlreadyConnectedToAddress(addr)) {
// If test-before-evict logic would have us connect to a
// peer that we're already connected to, just mark that
@@ -2708,14 +2736,16 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
// a currently-connected peer.
addrman.Good(addr);
// Select a new table address for our feeler instead.
- std::tie(addr, addr_last_try) = addrman.Select(true);
+ std::tie(addr, addr_last_try) = addrman.Select(true, reachable_nets);
}
} else {
// Not a feeler
// If preferred_net has a value set, pick an extra outbound
// peer from that network. The eviction logic in net_processing
// ensures that a peer from another network will be evicted.
- std::tie(addr, addr_last_try) = addrman.Select(false, preferred_net);
+ std::tie(addr, addr_last_try) = preferred_net.has_value()
+ ? addrman.Select(false, {*preferred_net})
+ : addrman.Select(false, reachable_nets);
}
// Require outbound IPv4/IPv6 connections, other than feelers, to be to distinct network groups
@@ -2772,10 +2802,10 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
if (!interruptNet.sleep_for(rng.rand_uniform_duration<CThreadInterrupt::Clock>(FEELER_SLEEP_WINDOW))) {
return;
}
- LogPrint(BCLog::NET, "Making feeler connection to %s\n", addrConnect.ToStringAddrPort());
+ LogDebug(BCLog::NET, "Making feeler connection to %s\n", addrConnect.ToStringAddrPort());
}
- if (preferred_net != std::nullopt) LogPrint(BCLog::NET, "Making network specific connection to %s on %s.\n", addrConnect.ToStringAddrPort(), GetNetworkName(preferred_net.value()));
+ if (preferred_net != std::nullopt) LogDebug(BCLog::NET, "Making network specific connection to %s on %s.\n", addrConnect.ToStringAddrPort(), GetNetworkName(preferred_net.value()));
// Record addrman failure attempts when node has at least 2 persistent outbound connections to peers with
// different netgroups in ipv4/ipv6 networks + all peers in Tor/I2P/CJDNS networks.
@@ -3089,46 +3119,10 @@ void Discover()
if (!fDiscover)
return;
-#ifdef WIN32
- // Get local host IP
- char pszHostName[256] = "";
- if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR)
- {
- const std::vector<CNetAddr> addresses{LookupHost(pszHostName, 0, true)};
- for (const CNetAddr& addr : addresses)
- {
- if (AddLocal(addr, LOCAL_IF))
- LogPrintf("%s: %s - %s\n", __func__, pszHostName, addr.ToStringAddr());
- }
- }
-#elif (HAVE_DECL_GETIFADDRS && HAVE_DECL_FREEIFADDRS)
- // Get local host ip
- struct ifaddrs* myaddrs;
- if (getifaddrs(&myaddrs) == 0)
- {
- for (struct ifaddrs* ifa = myaddrs; ifa != nullptr; ifa = ifa->ifa_next)
- {
- if (ifa->ifa_addr == nullptr) continue;
- if ((ifa->ifa_flags & IFF_UP) == 0) continue;
- if ((ifa->ifa_flags & IFF_LOOPBACK) != 0) continue;
- if (ifa->ifa_addr->sa_family == AF_INET)
- {
- struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr);
- CNetAddr addr(s4->sin_addr);
- if (AddLocal(addr, LOCAL_IF))
- LogPrintf("%s: IPv4 %s: %s\n", __func__, ifa->ifa_name, addr.ToStringAddr());
- }
- else if (ifa->ifa_addr->sa_family == AF_INET6)
- {
- struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr);
- CNetAddr addr(s6->sin6_addr);
- if (AddLocal(addr, LOCAL_IF))
- LogPrintf("%s: IPv6 %s: %s\n", __func__, ifa->ifa_name, addr.ToStringAddr());
- }
- }
- freeifaddrs(myaddrs);
+ for (const CNetAddr &addr: GetLocalAddresses()) {
+ if (AddLocal(addr, LOCAL_IF))
+ LogPrintf("%s: %s\n", __func__, addr.ToStringAddr());
}
-#endif
}
void CConnman::SetNetworkActive(bool active)
@@ -3198,24 +3192,36 @@ bool CConnman::Bind(const CService& addr_, unsigned int flags, NetPermissionFlag
bool CConnman::InitBinds(const Options& options)
{
- bool fBound = false;
for (const auto& addrBind : options.vBinds) {
- fBound |= Bind(addrBind, BF_REPORT_ERROR, NetPermissionFlags::None);
+ if (!Bind(addrBind, BF_REPORT_ERROR, NetPermissionFlags::None)) {
+ return false;
+ }
}
for (const auto& addrBind : options.vWhiteBinds) {
- fBound |= Bind(addrBind.m_service, BF_REPORT_ERROR, addrBind.m_flags);
+ if (!Bind(addrBind.m_service, BF_REPORT_ERROR, addrBind.m_flags)) {
+ return false;
+ }
}
for (const auto& addr_bind : options.onion_binds) {
- fBound |= Bind(addr_bind, BF_DONT_ADVERTISE, NetPermissionFlags::None);
+ if (!Bind(addr_bind, BF_REPORT_ERROR | BF_DONT_ADVERTISE, NetPermissionFlags::None)) {
+ return false;
+ }
}
if (options.bind_on_any) {
+ // Don't consider errors to bind on IPv6 "::" fatal because the host OS
+ // may not have IPv6 support and the user did not explicitly ask us to
+ // bind on that.
+ const CService ipv6_any{in6_addr(IN6ADDR_ANY_INIT), GetListenPort()}; // ::
+ Bind(ipv6_any, BF_NONE, NetPermissionFlags::None);
+
struct in_addr inaddr_any;
inaddr_any.s_addr = htonl(INADDR_ANY);
- struct in6_addr inaddr6_any = IN6ADDR_ANY_INIT;
- fBound |= Bind(CService(inaddr6_any, GetListenPort()), BF_NONE, NetPermissionFlags::None);
- fBound |= Bind(CService(inaddr_any, GetListenPort()), !fBound ? BF_REPORT_ERROR : BF_NONE, NetPermissionFlags::None);
+ const CService ipv4_any{inaddr_any, GetListenPort()}; // 0.0.0.0
+ if (!Bind(ipv4_any, BF_REPORT_ERROR, NetPermissionFlags::None)) {
+ return false;
+ }
}
- return fBound;
+ return true;
}
bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
@@ -3238,8 +3244,10 @@ bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
i2p_sam, &interruptNet);
}
- for (const auto& strDest : connOptions.vSeedNodes) {
- AddAddrFetch(strDest);
+ // Randomize the order in which we may query seednode to potentially prevent connecting to the same one every restart (and signal that we have restarted)
+ std::vector<std::string> seed_nodes = connOptions.vSeedNodes;
+ if (!seed_nodes.empty()) {
+ std::shuffle(seed_nodes.begin(), seed_nodes.end(), FastRandomContext{});
}
if (m_use_addrman_outgoing) {
@@ -3300,7 +3308,7 @@ bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
if (connOptions.m_use_addrman_outgoing || !connOptions.m_specified_outgoing.empty()) {
threadOpenConnections = std::thread(
&util::TraceThread, "opencon",
- [this, connect = connOptions.m_specified_outgoing] { ThreadOpenConnections(connect); });
+ [this, connect = connOptions.m_specified_outgoing, seed_nodes = std::move(seed_nodes)] { ThreadOpenConnections(connect, seed_nodes); });
}
// Process messages
@@ -3475,7 +3483,8 @@ std::vector<CAddress> CConnman::GetAddresses(CNode& requestor, size_t max_addres
// nodes to be "terrible" (see IsTerrible()) if the timestamps are older than 30 days,
// max. 24 hours of "penalty" due to cache shouldn't make any meaningful difference
// in terms of the freshness of the response.
- cache_entry.m_cache_entry_expiration = current_time + std::chrono::hours(21) + GetRandMillis(std::chrono::hours(6));
+ cache_entry.m_cache_entry_expiration = current_time +
+ 21h + FastRandomContext().randrange<std::chrono::microseconds>(6h);
}
return cache_entry.m_addrs_response_cache;
}
@@ -3533,6 +3542,13 @@ size_t CConnman::GetNodeCount(ConnectionDirection flags) const
return nNum;
}
+
+std::map<CNetAddr, LocalServiceInfo> CConnman::getNetLocalAddresses() const
+{
+ LOCK(g_maplocalhost_mutex);
+ return mapLocalHost;
+}
+
uint32_t CConnman::GetMappedAS(const CNetAddr& addr) const
{
return m_netgroupman.GetMappedAS(addr);
@@ -3554,7 +3570,7 @@ bool CConnman::DisconnectNode(const std::string& strNode)
{
LOCK(m_nodes_mutex);
if (CNode* pnode = FindNode(strNode)) {
- LogPrint(BCLog::NET, "disconnect by address%s matched peer=%d; disconnecting\n", (fLogIPs ? strprintf("=%s", strNode) : ""), pnode->GetId());
+ LogDebug(BCLog::NET, "disconnect by address%s matched peer=%d; disconnecting\n", (fLogIPs ? strprintf("=%s", strNode) : ""), pnode->GetId());
pnode->fDisconnect = true;
return true;
}
@@ -3567,7 +3583,7 @@ bool CConnman::DisconnectNode(const CSubNet& subnet)
LOCK(m_nodes_mutex);
for (CNode* pnode : m_nodes) {
if (subnet.Match(pnode->addr)) {
- LogPrint(BCLog::NET, "disconnect by subnet%s matched peer=%d; disconnecting\n", (fLogIPs ? strprintf("=%s", subnet.ToString()) : ""), pnode->GetId());
+ LogDebug(BCLog::NET, "disconnect by subnet%s matched peer=%d; disconnecting\n", (fLogIPs ? strprintf("=%s", subnet.ToString()) : ""), pnode->GetId());
pnode->fDisconnect = true;
disconnected = true;
}
@@ -3585,7 +3601,7 @@ bool CConnman::DisconnectNode(NodeId id)
LOCK(m_nodes_mutex);
for(CNode* pnode : m_nodes) {
if (id == pnode->GetId()) {
- LogPrint(BCLog::NET, "disconnect by id peer=%d; disconnecting\n", pnode->GetId());
+ LogDebug(BCLog::NET, "disconnect by id peer=%d; disconnecting\n", pnode->GetId());
pnode->fDisconnect = true;
return true;
}
@@ -3742,9 +3758,9 @@ CNode::CNode(NodeId idIn,
mapRecvBytesPerMsgType[NET_MESSAGE_TYPE_OTHER] = 0;
if (fLogIPs) {
- LogPrint(BCLog::NET, "Added connection to %s peer=%d\n", m_addr_name, id);
+ LogDebug(BCLog::NET, "Added connection to %s peer=%d\n", m_addr_name, id);
} else {
- LogPrint(BCLog::NET, "Added connection peer=%d\n", id);
+ LogDebug(BCLog::NET, "Added connection peer=%d\n", id);
}
}
@@ -3788,7 +3804,7 @@ void CConnman::PushMessage(CNode* pnode, CSerializedNetMsg&& msg)
{
AssertLockNotHeld(m_total_bytes_sent_mutex);
size_t nMessageSize = msg.data.size();
- LogPrint(BCLog::NET, "sending %s (%d bytes) peer=%d\n", msg.m_type, nMessageSize, pnode->GetId());
+ LogDebug(BCLog::NET, "sending %s (%d bytes) peer=%d\n", msg.m_type, nMessageSize, pnode->GetId());
if (gArgs.GetBoolArg("-capturemessages", false)) {
CaptureMessage(pnode->addr, msg.m_type, msg.data, /*is_incoming=*/false);
}
diff --git a/src/net.h b/src/net.h
index 8075975d62..86618bed91 100644
--- a/src/net.h
+++ b/src/net.h
@@ -148,7 +148,7 @@ enum
LOCAL_NONE, // unknown
LOCAL_IF, // address a local interface listens on
LOCAL_BIND, // address explicit bound to
- LOCAL_MAPPED, // address reported by UPnP or NAT-PMP
+ LOCAL_MAPPED, // address reported by UPnP or PCP
LOCAL_MANUAL, // address explicitly specified (-externalip=)
LOCAL_MAX
@@ -250,7 +250,7 @@ public:
/** The Transport converts one connection's sent messages to wire bytes, and received bytes back. */
class Transport {
public:
- virtual ~Transport() {}
+ virtual ~Transport() = default;
struct Info
{
@@ -963,7 +963,7 @@ private:
size_t m_msg_process_queue_size GUARDED_BY(m_msg_process_queue_mutex){0};
// Our address, as reported by the peer
- CService addrLocal GUARDED_BY(m_addr_local_mutex);
+ CService m_addr_local GUARDED_BY(m_addr_local_mutex);
mutable Mutex m_addr_local_mutex;
mapMsgTypeSize mapSendBytesPerMsgType GUARDED_BY(cs_vSend);
@@ -991,8 +991,8 @@ public:
/** Mutex for anything that is only accessed via the msg processing thread */
static Mutex g_msgproc_mutex;
- /** Initialize a peer (setup state, queue any initial messages) */
- virtual void InitializeNode(CNode& node, ServiceFlags our_services) = 0;
+ /** Initialize a peer (setup state) */
+ virtual void InitializeNode(const CNode& node, ServiceFlags our_services) = 0;
/** Handle removal of a peer (clear state) */
virtual void FinalizeNode(const CNode& node) = 0;
@@ -1205,6 +1205,7 @@ public:
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;
+ std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses() const;
uint32_t GetMappedAS(const CNetAddr& addr) const;
void GetNodeStats(std::vector<CNodeStats>& vstats) const;
bool DisconnectNode(const std::string& node);
@@ -1220,6 +1221,11 @@ public:
//! that peer during `net_processing.cpp:PushNodeVersion()`.
ServiceFlags GetLocalServices() const;
+ //! Updates the local services that this node advertises to other peers
+ //! during connection handshake.
+ void AddLocalServices(ServiceFlags services) { nLocalServices = ServiceFlags(nLocalServices | services); };
+ void RemoveLocalServices(ServiceFlags services) { nLocalServices = ServiceFlags(nLocalServices & ~services); }
+
uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
std::chrono::seconds GetMaxOutboundTimeframe() const;
@@ -1272,7 +1278,7 @@ private:
void ThreadOpenAddedConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex, !m_unused_i2p_sessions_mutex, !m_reconnections_mutex);
void AddAddrFetch(const std::string& strDest) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex);
void ProcessAddrFetch() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_unused_i2p_sessions_mutex);
- void ThreadOpenConnections(std::vector<std::string> connect) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_added_nodes_mutex, !m_nodes_mutex, !m_unused_i2p_sessions_mutex, !m_reconnections_mutex);
+ void ThreadOpenConnections(std::vector<std::string> connect, Span<const std::string> seed_nodes) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_added_nodes_mutex, !m_nodes_mutex, !m_unused_i2p_sessions_mutex, !m_reconnections_mutex);
void ThreadMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc);
void ThreadI2PAcceptIncoming();
void AcceptConnection(const ListenSocket& hListenSocket);
@@ -1459,11 +1465,12 @@ private:
* This data is replicated in each Peer instance we create.
*
* This data is not marked const, but after being set it should not
- * change.
+ * change. Unless AssumeUTXO is started, in which case, the peer
+ * will be limited until the background chain sync finishes.
*
* \sa Peer::our_services
*/
- ServiceFlags nLocalServices;
+ std::atomic<ServiceFlags> nLocalServices;
std::unique_ptr<CSemaphore> semOutbound;
std::unique_ptr<CSemaphore> semAddnode;
@@ -1625,7 +1632,7 @@ private:
}
}
if (shuffle) {
- Shuffle(m_nodes_copy.begin(), m_nodes_copy.end(), FastRandomContext{});
+ std::shuffle(m_nodes_copy.begin(), m_nodes_copy.end(), FastRandomContext{});
}
}
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index 3be4479587..b7d0f5360d 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -32,7 +32,6 @@
#include <primitives/block.h>
#include <primitives/transaction.h>
#include <random.h>
-#include <reverse_iterator.h>
#include <scheduler.h>
#include <streams.h>
#include <sync.h>
@@ -51,9 +50,12 @@
#include <future>
#include <memory>
#include <optional>
+#include <ranges>
#include <typeinfo>
#include <utility>
+using namespace util::hex_literals;
+
/** Headers download timeout.
* Timeout = base + per_header * (expected number of headers) */
static constexpr auto HEADERS_DOWNLOAD_TIMEOUT_BASE = 15min;
@@ -111,9 +113,6 @@ static const int MAX_BLOCKS_IN_TRANSIT_PER_PEER = 16;
static constexpr auto BLOCK_STALLING_TIMEOUT_DEFAULT{2s};
/** Maximum timeout for stalling block download. */
static constexpr auto BLOCK_STALLING_TIMEOUT_MAX{64s};
-/** Number of headers sent in one getheaders result. We rely on the assumption that if a peer sends
- * less than this number, we reached its tip. Changing this value is a protocol upgrade. */
-static const unsigned int MAX_HEADERS_RESULTS = 2000;
/** Maximum depth of blocks we're willing to serve as compact blocks to peers
* when requested. For older blocks, a regular BLOCK response will be sent. */
static const int MAX_CMPCTBLOCK_DEPTH = 5;
@@ -222,6 +221,9 @@ struct Peer {
/** Services this peer offered to us. */
std::atomic<ServiceFlags> m_their_services{NODE_NONE};
+ //! Whether this peer is an inbound connection
+ const bool m_is_inbound;
+
/** Protects misbehavior data members */
Mutex m_misbehavior_mutex;
/** Whether this peer should be disconnected and marked as discouraged (unless it has NetPermissionFlags::NoBan permission). */
@@ -243,6 +245,9 @@ struct Peer {
* Most peers use headers-first syncing, which doesn't use this mechanism */
uint256 m_continuation_block GUARDED_BY(m_block_inv_mutex) {};
+ /** Set to true once initial VERSION message was sent (only relevant for outbound peers). */
+ bool m_outbound_version_message_sent GUARDED_BY(NetEventsInterface::g_msgproc_mutex){false};
+
/** This peer's reported block height when we connected */
std::atomic<int> m_starting_height{-1};
@@ -389,9 +394,10 @@ struct Peer {
* timestamp the peer sent in the version message. */
std::atomic<std::chrono::seconds> m_time_offset{0s};
- explicit Peer(NodeId id, ServiceFlags our_services)
+ explicit Peer(NodeId id, ServiceFlags our_services, bool is_inbound)
: m_id{id}
, m_our_services{our_services}
+ , m_is_inbound{is_inbound}
{}
private:
@@ -471,11 +477,6 @@ struct CNodeState {
//! Time of last new block announcement
int64_t m_last_block_announcement{0};
-
- //! Whether this peer is an inbound connection
- const bool m_is_inbound;
-
- CNodeState(bool is_inbound) : m_is_inbound(is_inbound) {}
};
class PeerManagerImpl final : public PeerManager
@@ -486,10 +487,12 @@ public:
CTxMemPool& pool, node::Warnings& warnings, Options opts);
/** Overridden from CValidationInterface. */
+ void ActiveTipChange(const CBlockIndex& new_tip, bool) override
+ EXCLUSIVE_LOCKS_REQUIRED(!m_tx_download_mutex);
void BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected) override
- EXCLUSIVE_LOCKS_REQUIRED(!m_recent_confirmed_transactions_mutex);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_tx_download_mutex);
void BlockDisconnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex* pindex) override
- EXCLUSIVE_LOCKS_REQUIRED(!m_recent_confirmed_transactions_mutex);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_tx_download_mutex);
void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void BlockChecked(const CBlock& block, const BlockValidationState& state) override
@@ -498,13 +501,13 @@ public:
EXCLUSIVE_LOCKS_REQUIRED(!m_most_recent_block_mutex);
/** 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);
+ void InitializeNode(const CNode& node, ServiceFlags our_services) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_tx_download_mutex);
+ void FinalizeNode(const CNode& node) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_headers_presync_mutex, !m_tx_download_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);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_most_recent_block_mutex, !m_headers_presync_mutex, g_msgproc_mutex, !m_tx_download_mutex);
bool SendMessages(CNode* pto) override
- EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_recent_confirmed_transactions_mutex, !m_most_recent_block_mutex, g_msgproc_mutex);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_most_recent_block_mutex, g_msgproc_mutex, !m_tx_download_mutex);
/** Implement PeerManager */
void StartScheduledTasks(CScheduler& scheduler) override;
@@ -523,7 +526,7 @@ public:
void UnitTestMisbehaving(NodeId peer_id) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex) { Misbehaving(*Assert(GetPeerRef(peer_id)), ""); };
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);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_most_recent_block_mutex, !m_headers_presync_mutex, g_msgproc_mutex, !m_tx_download_mutex);
void UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_seconds) override;
ServiceFlags GetDesirableServiceFlags(ServiceFlags services) const override;
@@ -579,15 +582,15 @@ private:
* @param[in] maybe_add_extra_compact_tx Whether this tx should be added to vExtraTxnForCompact.
* Set to false if the tx has already been rejected before,
* e.g. is an orphan, to avoid adding duplicate entries.
- * Updates m_txrequest, m_recent_rejects, m_recent_rejects_reconsiderable, m_orphanage, and vExtraTxnForCompact. */
+ * Updates m_txrequest, m_lazy_recent_rejects, m_lazy_recent_rejects_reconsiderable, m_orphanage, and vExtraTxnForCompact. */
void ProcessInvalidTx(NodeId nodeid, const CTransactionRef& tx, const TxValidationState& result,
bool maybe_add_extra_compact_tx)
- EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, cs_main);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, m_tx_download_mutex);
/** Handle a transaction whose result was MempoolAcceptResult::ResultType::VALID.
* Updates m_txrequest, m_orphanage, and vExtraTxnForCompact. Also queues the tx for relay. */
void ProcessValidTx(NodeId nodeid, const CTransactionRef& tx, const std::list<CTransactionRef>& replaced_transactions)
- EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, cs_main);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, m_tx_download_mutex);
struct PackageToValidate {
const Package m_txns;
@@ -617,13 +620,13 @@ private:
* individual transactions, and caches rejection for the package as a group.
*/
void ProcessPackageResult(const PackageToValidate& package_to_validate, const PackageMempoolAcceptResult& package_result)
- EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, cs_main);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, m_tx_download_mutex);
/** Look for a child of this transaction in the orphanage to form a 1-parent-1-child package,
* skipping any combinations that have already been tried. Return the resulting package along with
* the senders of its respective transactions, or std::nullopt if no package is found. */
std::optional<PackageToValidate> Find1P1CPackage(const CTransactionRef& ptx, NodeId nodeid)
- EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, cs_main);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, m_tx_download_mutex);
/**
* Reconsider orphan transactions after a parent has been accepted to the mempool.
@@ -637,7 +640,7 @@ private:
* will be empty.
*/
bool ProcessOrphanTx(Peer& peer)
- EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex);
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, !m_tx_download_mutex);
/** Process a single headers message from a peer.
*
@@ -719,7 +722,7 @@ private:
* peer. The announcement parameters are decided in PeerManager and then
* passed to TxRequestTracker. */
void AddTxAnnouncement(const CNode& node, const GenTxid& gtxid, std::chrono::microseconds current_time)
- EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
+ EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_tx_download_mutex);
/** Send a message to a peer */
void PushMessage(CNode& node, CSerializedNetMsg&& msg) const { m_connman.PushMessage(&node, std::move(msg)); }
@@ -767,7 +770,17 @@ private:
BanMan* const m_banman;
ChainstateManager& m_chainman;
CTxMemPool& m_mempool;
- TxRequestTracker m_txrequest GUARDED_BY(::cs_main);
+
+ /** Synchronizes tx download including TxRequestTracker, rejection filters, and TxOrphanage.
+ * Lock invariants:
+ * - A txhash (txid or wtxid) in m_txrequest is not also in m_orphanage.
+ * - A txhash (txid or wtxid) in m_txrequest is not also in m_lazy_recent_rejects.
+ * - A txhash (txid or wtxid) in m_txrequest is not also in m_lazy_recent_rejects_reconsiderable.
+ * - A txhash (txid or wtxid) in m_txrequest is not also in m_lazy_recent_confirmed_transactions.
+ * - Each data structure's limits hold (m_orphanage max size, m_txrequest per-peer limits, etc).
+ */
+ Mutex m_tx_download_mutex ACQUIRED_BEFORE(m_mempool.cs);
+ TxRequestTracker m_txrequest GUARDED_BY(m_tx_download_mutex);
std::unique_ptr<TxReconciliationTracker> m_txreconciliation;
/** The height of the best chain */
@@ -841,14 +854,12 @@ private:
/** Check whether we already have this gtxid in:
* - mempool
* - orphanage
- * - m_recent_rejects
- * - m_recent_rejects_reconsiderable (if include_reconsiderable = true)
- * - m_recent_confirmed_transactions
- * Also responsible for resetting m_recent_rejects and m_recent_rejects_reconsiderable if the
- * chain tip has changed.
+ * - m_lazy_recent_rejects
+ * - m_lazy_recent_rejects_reconsiderable (if include_reconsiderable = true)
+ * - m_lazy_recent_confirmed_transactions
* */
bool AlreadyHaveTx(const GenTxid& gtxid, bool include_reconsiderable)
- EXCLUSIVE_LOCKS_REQUIRED(cs_main, !m_recent_confirmed_transactions_mutex);
+ EXCLUSIVE_LOCKS_REQUIRED(m_tx_download_mutex);
/**
* Filter for transactions that were recently rejected by the mempool.
@@ -884,10 +895,18 @@ private:
*
* Memory used: 1.3 MB
*/
- CRollingBloomFilter m_recent_rejects GUARDED_BY(::cs_main){120'000, 0.000'001};
- /** Block hash of chain tip the last time we reset m_recent_rejects and
- * m_recent_rejects_reconsiderable. */
- uint256 hashRecentRejectsChainTip GUARDED_BY(cs_main);
+ std::unique_ptr<CRollingBloomFilter> m_lazy_recent_rejects GUARDED_BY(m_tx_download_mutex){nullptr};
+
+ CRollingBloomFilter& RecentRejectsFilter() EXCLUSIVE_LOCKS_REQUIRED(m_tx_download_mutex)
+ {
+ AssertLockHeld(m_tx_download_mutex);
+
+ if (!m_lazy_recent_rejects) {
+ m_lazy_recent_rejects = std::make_unique<CRollingBloomFilter>(120'000, 0.000'001);
+ }
+
+ return *m_lazy_recent_rejects;
+ }
/**
* Filter for:
@@ -895,7 +914,7 @@ private:
* eligible for reconsideration if submitted with other transactions.
* (2) packages (see GetPackageHash) we have already rejected before and should not retry.
*
- * Similar to m_recent_rejects, this filter is used to save bandwidth when e.g. all of our peers
+ * Similar to m_lazy_recent_rejects, this filter is used to save bandwidth when e.g. all of our peers
* have larger mempools and thus lower minimum feerates than us.
*
* When a transaction's error is TxValidationResult::TX_RECONSIDERABLE (in a package or by
@@ -907,9 +926,20 @@ private:
*
* Reset this filter when the chain tip changes.
*
- * Parameters are picked to be the same as m_recent_rejects, with the same rationale.
+ * Parameters are picked to be the same as m_lazy_recent_rejects, with the same rationale.
*/
- CRollingBloomFilter m_recent_rejects_reconsiderable GUARDED_BY(::cs_main){120'000, 0.000'001};
+ std::unique_ptr<CRollingBloomFilter> m_lazy_recent_rejects_reconsiderable GUARDED_BY(m_tx_download_mutex){nullptr};
+
+ CRollingBloomFilter& RecentRejectsReconsiderableFilter() EXCLUSIVE_LOCKS_REQUIRED(m_tx_download_mutex)
+ {
+ AssertLockHeld(m_tx_download_mutex);
+
+ if (!m_lazy_recent_rejects_reconsiderable) {
+ m_lazy_recent_rejects_reconsiderable = std::make_unique<CRollingBloomFilter>(120'000, 0.000'001);
+ }
+
+ return *m_lazy_recent_rejects_reconsiderable;
+ }
/*
* Filter for transactions that have been recently confirmed.
@@ -926,8 +956,18 @@ private:
* transaction per day that would be inadvertently ignored (which is the
* same probability that we have in the reject filter).
*/
- Mutex m_recent_confirmed_transactions_mutex;
- CRollingBloomFilter m_recent_confirmed_transactions GUARDED_BY(m_recent_confirmed_transactions_mutex){48'000, 0.000'001};
+ std::unique_ptr<CRollingBloomFilter> m_lazy_recent_confirmed_transactions GUARDED_BY(m_tx_download_mutex){nullptr};
+
+ CRollingBloomFilter& RecentConfirmedTransactionsFilter() EXCLUSIVE_LOCKS_REQUIRED(m_tx_download_mutex)
+ {
+ AssertLockHeld(m_tx_download_mutex);
+
+ if (!m_lazy_recent_confirmed_transactions) {
+ m_lazy_recent_confirmed_transactions = std::make_unique<CRollingBloomFilter>(48'000, 0.000'001);
+ }
+
+ return *m_lazy_recent_confirmed_transactions;
+ }
/**
* For sending `inv`s to inbound peers, we use a single (exponentially
@@ -936,7 +976,7 @@ private:
* accurately determine when we received the transaction (and potentially
* determine the transaction's origin). */
std::chrono::microseconds NextInvToInbounds(std::chrono::microseconds now,
- std::chrono::seconds average_interval);
+ std::chrono::seconds average_interval) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex);
// All of the following cache a recent block, and are protected by m_most_recent_block_mutex
@@ -971,7 +1011,7 @@ private:
bool IsBlockRequested(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
/** Have we requested this block from an outbound peer */
- bool IsBlockRequestedFromOutbound(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
+ bool IsBlockRequestedFromOutbound(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main, !m_peer_mutex);
/** Remove this block from our tracked requested blocks. Called if:
* - the block has been received from a peer
@@ -1055,7 +1095,7 @@ private:
* lNodesAnnouncingHeaderAndIDs, and keeping that list under a certain size by
* removing the first element if necessary.
*/
- void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
+ void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid) EXCLUSIVE_LOCKS_REQUIRED(cs_main, !m_peer_mutex);
/** Stack of nodes which we have set to announce using compact blocks */
std::list<NodeId> lNodesAnnouncingHeaderAndIDs GUARDED_BY(cs_main);
@@ -1064,7 +1104,7 @@ private:
int m_peers_downloading_from GUARDED_BY(cs_main) = 0;
/** Storage for orphan information */
- TxOrphanage m_orphanage;
+ TxOrphanage m_orphanage GUARDED_BY(m_tx_download_mutex);
void AddToCompactExtraTransactions(const CTransactionRef& tx) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex);
@@ -1096,7 +1136,7 @@ private:
bool BlockRequestAllowed(const CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
bool AlreadyHaveBlock(const uint256& block_hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
void ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv& inv)
- EXCLUSIVE_LOCKS_REQUIRED(!m_most_recent_block_mutex);
+ EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex, !m_most_recent_block_mutex);
/**
* Validation logic for compact filters request handling.
@@ -1244,7 +1284,7 @@ std::chrono::microseconds PeerManagerImpl::NextInvToInbounds(std::chrono::micros
// If this function were called from multiple threads simultaneously
// it would possible that both update the next send variable, and return a different result to their caller.
// This is not possible in practice as only the net processing thread invokes this function.
- m_next_inv_to_inbounds = GetExponentialRand(now, average_interval);
+ m_next_inv_to_inbounds = now + m_rng.rand_exp_duration(average_interval);
}
return m_next_inv_to_inbounds;
}
@@ -1258,8 +1298,8 @@ bool PeerManagerImpl::IsBlockRequestedFromOutbound(const uint256& hash)
{
for (auto range = mapBlocksInFlight.equal_range(hash); range.first != range.second; range.first++) {
auto [nodeid, block_it] = range.first->second;
- CNodeState& nodestate = *Assert(State(nodeid));
- if (!nodestate.m_is_inbound) return true;
+ PeerRef peer{GetPeerRef(nodeid)};
+ if (peer && !peer->m_is_inbound) return true;
}
return false;
@@ -1348,6 +1388,7 @@ void PeerManagerImpl::MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid)
if (m_opts.ignore_incoming_txs) return;
CNodeState* nodestate = State(nodeid);
+ PeerRef peer{GetPeerRef(nodeid)};
if (!nodestate || !nodestate->m_provides_cmpctblocks) {
// Don't request compact blocks if the peer has not signalled support
return;
@@ -1360,15 +1401,15 @@ void PeerManagerImpl::MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid)
lNodesAnnouncingHeaderAndIDs.push_back(nodeid);
return;
}
- CNodeState *state = State(*it);
- if (state != nullptr && !state->m_is_inbound) ++num_outbound_hb_peers;
+ PeerRef peer_ref{GetPeerRef(*it)};
+ if (peer_ref && !peer_ref->m_is_inbound) ++num_outbound_hb_peers;
}
- if (nodestate->m_is_inbound) {
+ if (peer && peer->m_is_inbound) {
// If we're adding an inbound HB peer, make sure we're not removing
// our last outbound HB peer in the process.
if (lNodesAnnouncingHeaderAndIDs.size() >= 3 && num_outbound_hb_peers == 1) {
- CNodeState *remove_node = State(lNodesAnnouncingHeaderAndIDs.front());
- if (remove_node != nullptr && !remove_node->m_is_inbound) {
+ PeerRef remove_peer{GetPeerRef(lNodesAnnouncingHeaderAndIDs.front())};
+ if (remove_peer && !remove_peer->m_is_inbound) {
// Put the HB outbound peer in the second slot, so that it
// doesn't get removed.
std::swap(lNodesAnnouncingHeaderAndIDs.front(), *std::next(lNodesAnnouncingHeaderAndIDs.begin()));
@@ -1476,9 +1517,20 @@ void PeerManagerImpl::FindNextBlocksToDownload(const Peer& peer, unsigned int co
return;
}
- if (state->pindexLastCommonBlock == nullptr) {
- // Bootstrap quickly by guessing a parent of our best tip is the forking point.
- // Guessing wrong in either direction is not a problem.
+ // When we sync with AssumeUtxo and discover the snapshot is not in the peer's best chain, abort:
+ // We can't reorg to this chain due to missing undo data until the background sync has finished,
+ // so downloading blocks from it would be futile.
+ const CBlockIndex* snap_base{m_chainman.GetSnapshotBaseBlock()};
+ if (snap_base && state->pindexBestKnownBlock->GetAncestor(snap_base->nHeight) != snap_base) {
+ LogDebug(BCLog::NET, "Not downloading blocks from peer=%d, which doesn't have the snapshot block in its best chain.\n", peer.m_id);
+ return;
+ }
+
+ // Bootstrap quickly by guessing a parent of our best tip is the forking point.
+ // Guessing wrong in either direction is not a problem.
+ // Also reset pindexLastCommonBlock after a snapshot was loaded, so that blocks after the snapshot will be prioritised for download.
+ if (state->pindexLastCommonBlock == nullptr ||
+ (snap_base && state->pindexLastCommonBlock->nHeight < snap_base->nHeight)) {
state->pindexLastCommonBlock = m_chainman.ActiveChain()[std::min(state->pindexBestKnownBlock->nHeight, m_chainman.ActiveChain().Height())];
}
@@ -1619,15 +1671,16 @@ void PeerManagerImpl::PushNodeVersion(CNode& pnode, const Peer& peer)
nonce, strSubVersion, nNodeStartingHeight, tx_relay);
if (fLogIPs) {
- LogPrint(BCLog::NET, "send version message: version %d, blocks=%d, them=%s, txrelay=%d, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, addr_you.ToStringAddrPort(), tx_relay, nodeid);
+ LogDebug(BCLog::NET, "send version message: version %d, blocks=%d, them=%s, txrelay=%d, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, addr_you.ToStringAddrPort(), tx_relay, nodeid);
} else {
- LogPrint(BCLog::NET, "send version message: version %d, blocks=%d, txrelay=%d, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, tx_relay, nodeid);
+ LogDebug(BCLog::NET, "send version message: version %d, blocks=%d, txrelay=%d, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, tx_relay, nodeid);
}
}
void PeerManagerImpl::AddTxAnnouncement(const CNode& node, const GenTxid& gtxid, std::chrono::microseconds current_time)
{
- AssertLockHeld(::cs_main); // For m_txrequest
+ AssertLockHeld(::cs_main); // for State
+ AssertLockHeld(m_tx_download_mutex); // For m_txrequest
NodeId nodeid = node.GetId();
if (!node.HasPermission(NetPermissionFlags::Relay) && m_txrequest.Count(nodeid) >= MAX_PEER_TX_ANNOUNCEMENTS) {
// Too many queued announcements from this peer
@@ -1659,12 +1712,15 @@ void PeerManagerImpl::UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_s
if (state) state->m_last_block_announcement = time_in_seconds;
}
-void PeerManagerImpl::InitializeNode(CNode& node, ServiceFlags our_services)
+void PeerManagerImpl::InitializeNode(const CNode& node, ServiceFlags our_services)
{
NodeId nodeid = node.GetId();
{
- LOCK(cs_main);
- m_node_states.emplace_hint(m_node_states.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(node.IsInboundConn()));
+ LOCK(cs_main); // For m_node_states
+ m_node_states.try_emplace(m_node_states.end(), nodeid);
+ }
+ {
+ LOCK(m_tx_download_mutex);
assert(m_txrequest.Count(nodeid) == 0);
}
@@ -1672,14 +1728,11 @@ void PeerManagerImpl::InitializeNode(CNode& node, ServiceFlags our_services)
our_services = static_cast<ServiceFlags>(our_services | NODE_BLOOM);
}
- PeerRef peer = std::make_shared<Peer>(nodeid, our_services);
+ PeerRef peer = std::make_shared<Peer>(nodeid, our_services, node.IsInboundConn());
{
LOCK(m_peer_mutex);
m_peer_map.emplace_hint(m_peer_map.end(), nodeid, peer);
}
- if (!node.IsInboundConn()) {
- PushNodeVersion(node, *peer);
- }
}
void PeerManagerImpl::ReattemptInitialBroadcast(CScheduler& scheduler)
@@ -1698,7 +1751,7 @@ void PeerManagerImpl::ReattemptInitialBroadcast(CScheduler& scheduler)
// Schedule next run for 10-15 minutes in the future.
// We add randomness on every cycle to avoid the possibility of P2P fingerprinting.
- const std::chrono::milliseconds delta = 10min + GetRandMillis(5min);
+ const auto delta = 10min + FastRandomContext().randrange<std::chrono::milliseconds>(5min);
scheduler.scheduleFromNow([&] { ReattemptInitialBroadcast(scheduler); }, delta);
}
@@ -1735,8 +1788,11 @@ void PeerManagerImpl::FinalizeNode(const CNode& node)
}
}
}
- m_orphanage.EraseForPeer(nodeid);
- m_txrequest.DisconnectedPeer(nodeid);
+ {
+ LOCK(m_tx_download_mutex);
+ m_orphanage.EraseForPeer(nodeid);
+ m_txrequest.DisconnectedPeer(nodeid);
+ }
if (m_txreconciliation) m_txreconciliation->ForgetPeer(nodeid);
m_num_preferred_download_peers -= state->fPreferredDownload;
m_peers_downloading_from -= (!state->vBlocksInFlight.empty());
@@ -1753,6 +1809,7 @@ void PeerManagerImpl::FinalizeNode(const CNode& node)
assert(m_peers_downloading_from == 0);
assert(m_outbound_peers_with_protect_from_disconnect == 0);
assert(m_wtxid_relay_peers == 0);
+ LOCK(m_tx_download_mutex);
assert(m_txrequest.Size() == 0);
assert(m_orphanage.Size() == 0);
}
@@ -1768,7 +1825,7 @@ void PeerManagerImpl::FinalizeNode(const CNode& node)
LOCK(m_headers_presync_mutex);
m_headers_presync_stats.erase(nodeid);
}
- LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);
+ LogDebug(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);
}
bool PeerManagerImpl::HasAllDesirableServiceFlags(ServiceFlags services) const
@@ -1884,7 +1941,7 @@ void PeerManagerImpl::Misbehaving(Peer& peer, const std::string& message)
const std::string message_prefixed = message.empty() ? "" : (": " + message);
peer.m_should_discourage = true;
- LogPrint(BCLog::NET, "Misbehaving: peer=%d%s\n", peer.m_id, message_prefixed);
+ LogDebug(BCLog::NET, "Misbehaving: peer=%d%s\n", peer.m_id, message_prefixed);
}
void PeerManagerImpl::MaybePunishNodeForBlock(NodeId nodeid, const BlockValidationState& state,
@@ -1908,15 +1965,9 @@ void PeerManagerImpl::MaybePunishNodeForBlock(NodeId nodeid, const BlockValidati
break;
case BlockValidationResult::BLOCK_CACHED_INVALID:
{
- LOCK(cs_main);
- CNodeState *node_state = State(nodeid);
- if (node_state == nullptr) {
- break;
- }
-
// Discourage outbound (but not inbound) peers if on an invalid chain.
// Exempt HB compact block peers. Manual connections are always protected from discouragement.
- if (!via_compact_block && !node_state->m_is_inbound) {
+ if (peer && !via_compact_block && !peer->m_is_inbound) {
if (peer) Misbehaving(*peer, message);
return;
}
@@ -1936,7 +1987,7 @@ void PeerManagerImpl::MaybePunishNodeForBlock(NodeId nodeid, const BlockValidati
break;
}
if (message != "") {
- LogPrint(BCLog::NET, "peer=%d: %s\n", nodeid, message);
+ LogDebug(BCLog::NET, "peer=%d: %s\n", nodeid, message);
}
}
@@ -2007,7 +2058,7 @@ std::optional<std::string> PeerManagerImpl::FetchBlock(NodeId peer_id, const CBl
if (!success) return "Peer not fully connected";
- LogPrint(BCLog::NET, "Requesting block %s from peer=%d\n",
+ LogDebug(BCLog::NET, "Requesting block %s from peer=%d\n",
hash.ToString(), peer_id);
return std::nullopt;
}
@@ -2050,10 +2101,27 @@ void PeerManagerImpl::StartScheduledTasks(CScheduler& scheduler)
scheduler.scheduleEvery([this] { this->CheckForStaleTipAndEvictPeers(); }, std::chrono::seconds{EXTRA_PEER_CHECK_INTERVAL});
// schedule next run for 10-15 minutes in the future
- const std::chrono::milliseconds delta = 10min + GetRandMillis(5min);
+ const auto delta = 10min + FastRandomContext().randrange<std::chrono::milliseconds>(5min);
scheduler.scheduleFromNow([&] { ReattemptInitialBroadcast(scheduler); }, delta);
}
+void PeerManagerImpl::ActiveTipChange(const CBlockIndex& new_tip, bool is_ibd)
+{
+ // Ensure mempool mutex was released, otherwise deadlock may occur if another thread holding
+ // m_tx_download_mutex waits on the mempool mutex.
+ AssertLockNotHeld(m_mempool.cs);
+ AssertLockNotHeld(m_tx_download_mutex);
+
+ if (!is_ibd) {
+ LOCK(m_tx_download_mutex);
+ // If the chain tip has changed, previously rejected transactions might now be valid, e.g. due
+ // to a timelock. Reset the rejection filters to give those transactions another chance if we
+ // see them again.
+ RecentRejectsFilter().reset();
+ RecentRejectsReconsiderableFilter().reset();
+ }
+}
+
/**
* Evict orphan txn pool entries based on a newly connected
* block, remember the recently confirmed transactions, and delete tracked
@@ -2075,7 +2143,7 @@ void PeerManagerImpl::BlockConnected(
if (stalling_timeout != BLOCK_STALLING_TIMEOUT_DEFAULT) {
const auto new_timeout = std::max(std::chrono::duration_cast<std::chrono::seconds>(stalling_timeout * 0.85), BLOCK_STALLING_TIMEOUT_DEFAULT);
if (m_block_stalling_timeout.compare_exchange_strong(stalling_timeout, new_timeout)) {
- LogPrint(BCLog::NET, "Decreased stalling timeout to %d seconds\n", count_seconds(new_timeout));
+ LogDebug(BCLog::NET, "Decreased stalling timeout to %d seconds\n", count_seconds(new_timeout));
}
}
@@ -2084,23 +2152,16 @@ void PeerManagerImpl::BlockConnected(
if (role == ChainstateRole::BACKGROUND) {
return;
}
+ LOCK(m_tx_download_mutex);
m_orphanage.EraseForBlock(*pblock);
- {
- LOCK(m_recent_confirmed_transactions_mutex);
- for (const auto& ptx : pblock->vtx) {
- m_recent_confirmed_transactions.insert(ptx->GetHash().ToUint256());
- if (ptx->HasWitness()) {
- m_recent_confirmed_transactions.insert(ptx->GetWitnessHash().ToUint256());
- }
- }
- }
- {
- LOCK(cs_main);
- for (const auto& ptx : pblock->vtx) {
- m_txrequest.ForgetTxHash(ptx->GetHash());
- m_txrequest.ForgetTxHash(ptx->GetWitnessHash());
+ for (const auto& ptx : pblock->vtx) {
+ RecentConfirmedTransactionsFilter().insert(ptx->GetHash().ToUint256());
+ if (ptx->HasWitness()) {
+ RecentConfirmedTransactionsFilter().insert(ptx->GetWitnessHash().ToUint256());
}
+ m_txrequest.ForgetTxHash(ptx->GetHash());
+ m_txrequest.ForgetTxHash(ptx->GetWitnessHash());
}
}
@@ -2114,8 +2175,8 @@ void PeerManagerImpl::BlockDisconnected(const std::shared_ptr<const CBlock> &blo
// block's worth of transactions in it, but that should be fine, since
// presumably the most common case of relaying a confirmed transaction
// should be just after a new block containing it is found.
- LOCK(m_recent_confirmed_transactions_mutex);
- m_recent_confirmed_transactions.reset();
+ LOCK(m_tx_download_mutex);
+ RecentConfirmedTransactionsFilter().reset();
}
/**
@@ -2124,7 +2185,7 @@ void PeerManagerImpl::BlockDisconnected(const std::shared_ptr<const CBlock> &blo
*/
void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock)
{
- auto pcmpctblock = std::make_shared<const CBlockHeaderAndShortTxIDs>(*pblock, GetRand<uint64_t>());
+ auto pcmpctblock = std::make_shared<const CBlockHeaderAndShortTxIDs>(*pblock, FastRandomContext().rand64());
LOCK(cs_main);
@@ -2163,7 +2224,7 @@ void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::sha
// but we don't think they have this one, go ahead and announce it
if (state.m_requested_hb_cmpctblocks && !PeerHasHeader(&state, pindex) && PeerHasHeader(&state, pindex->pprev)) {
- LogPrint(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", "PeerManager::NewPoWValidBlock",
+ LogDebug(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", "PeerManager::NewPoWValidBlock",
hashBlock.ToString(), pnode->GetId());
const CSerializedNetMsg& ser_cmpctblock{lazy_ser.get()};
@@ -2202,7 +2263,7 @@ void PeerManagerImpl::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlock
for (auto& it : m_peer_map) {
Peer& peer = *it.second;
LOCK(peer.m_block_inv_mutex);
- for (const uint256& hash : reverse_iterate(vHashes)) {
+ for (const uint256& hash : vHashes | std::views::reverse) {
peer.m_blocks_for_headers_relay.push_back(hash);
}
}
@@ -2254,15 +2315,7 @@ void PeerManagerImpl::BlockChecked(const CBlock& block, const BlockValidationSta
bool PeerManagerImpl::AlreadyHaveTx(const GenTxid& gtxid, bool include_reconsiderable)
{
- if (m_chainman.ActiveChain().Tip()->GetBlockHash() != hashRecentRejectsChainTip) {
- // If the chain tip has changed previously rejected transactions
- // might be now valid, e.g. due to a nLockTime'd tx becoming valid,
- // or a double-spend. Reset the rejects filter and give those
- // txs a second chance.
- hashRecentRejectsChainTip = m_chainman.ActiveChain().Tip()->GetBlockHash();
- m_recent_rejects.reset();
- m_recent_rejects_reconsiderable.reset();
- }
+ AssertLockHeld(m_tx_download_mutex);
const uint256& hash = gtxid.GetHash();
@@ -2284,14 +2337,11 @@ bool PeerManagerImpl::AlreadyHaveTx(const GenTxid& gtxid, bool include_reconside
if (m_orphanage.HaveTx(Wtxid::FromUint256(hash))) return true;
}
- if (include_reconsiderable && m_recent_rejects_reconsiderable.contains(hash)) return true;
+ if (include_reconsiderable && RecentRejectsReconsiderableFilter().contains(hash)) return true;
- {
- LOCK(m_recent_confirmed_transactions_mutex);
- if (m_recent_confirmed_transactions.contains(hash)) return true;
- }
+ if (RecentConfirmedTransactionsFilter().contains(hash)) return true;
- return m_recent_rejects.contains(hash) || m_mempool.exists(gtxid);
+ return RecentRejectsFilter().contains(hash) || m_mempool.exists(gtxid);
}
bool PeerManagerImpl::AlreadyHaveBlock(const uint256& block_hash)
@@ -2406,7 +2456,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
if (need_activate_chain) {
BlockValidationState state;
if (!m_chainman.ActiveChainstate().ActivateBestChain(state, a_recent_block)) {
- LogPrint(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
+ LogDebug(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
}
}
@@ -2421,7 +2471,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
return;
}
if (!BlockRequestAllowed(pindex)) {
- LogPrint(BCLog::NET, "%s: ignoring request from peer=%i for old block that isn't in the main chain\n", __func__, pfrom.GetId());
+ LogDebug(BCLog::NET, "%s: ignoring request from peer=%i for old block that isn't in the main chain\n", __func__, pfrom.GetId());
return;
}
// disconnect node in case we have reached the outbound limit for serving historical blocks
@@ -2429,7 +2479,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
(((m_chainman.m_best_header != nullptr) && (m_chainman.m_best_header->GetBlockTime() - pindex->GetBlockTime() > HISTORICAL_BLOCK_AGE)) || inv.IsMsgFilteredBlk()) &&
!pfrom.HasPermission(NetPermissionFlags::Download) // nodes with the download permission may exceed target
) {
- LogPrint(BCLog::NET, "historical block serving limit reached, disconnect peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "historical block serving limit reached, disconnect peer=%d\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -2438,7 +2488,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
if (!pfrom.HasPermission(NetPermissionFlags::NoBan) && (
(((peer.m_our_services & NODE_NETWORK_LIMITED) == NODE_NETWORK_LIMITED) && ((peer.m_our_services & NODE_NETWORK) != NODE_NETWORK) && (tip->nHeight - pindex->nHeight > (int)NODE_NETWORK_LIMITED_MIN_BLOCKS + 2 /* add two blocks buffer extension for possible races */) )
)) {
- LogPrint(BCLog::NET, "Ignore block request below NODE_NETWORK_LIMITED threshold, disconnect peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignore block request below NODE_NETWORK_LIMITED threshold, disconnect peer=%d\n", pfrom.GetId());
//disconnect node and prevent it from stalling (would otherwise wait for the missing block)
pfrom.fDisconnect = true;
return;
@@ -2461,7 +2511,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
std::vector<uint8_t> block_data;
if (!m_chainman.m_blockman.ReadRawBlockFromDisk(block_data, block_pos)) {
if (WITH_LOCK(m_chainman.GetMutex(), return m_chainman.m_blockman.IsBlockPruned(*pindex))) {
- LogPrint(BCLog::NET, "Block was pruned before it could be read, disconnect peer=%s\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Block was pruned before it could be read, disconnect peer=%s\n", pfrom.GetId());
} else {
LogError("Cannot load block from disk, disconnect peer=%d\n", pfrom.GetId());
}
@@ -2475,7 +2525,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
std::shared_ptr<CBlock> pblockRead = std::make_shared<CBlock>();
if (!m_chainman.m_blockman.ReadBlockFromDisk(*pblockRead, block_pos)) {
if (WITH_LOCK(m_chainman.GetMutex(), return m_chainman.m_blockman.IsBlockPruned(*pindex))) {
- LogPrint(BCLog::NET, "Block was pruned before it could be read, disconnect peer=%s\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Block was pruned before it could be read, disconnect peer=%s\n", pfrom.GetId());
} else {
LogError("Cannot load block from disk, disconnect peer=%d\n", pfrom.GetId());
}
@@ -2522,7 +2572,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
if (a_recent_compact_block && a_recent_compact_block->header.GetHash() == pindex->GetBlockHash()) {
MakeAndPushMessage(pfrom, NetMsgType::CMPCTBLOCK, *a_recent_compact_block);
} else {
- CBlockHeaderAndShortTxIDs cmpctblock{*pblock, GetRand<uint64_t>()};
+ CBlockHeaderAndShortTxIDs cmpctblock{*pblock, m_rng.rand64()};
MakeAndPushMessage(pfrom, NetMsgType::CMPCTBLOCK, cmpctblock);
}
} else {
@@ -2699,7 +2749,7 @@ void PeerManagerImpl::HandleUnconnectingHeaders(CNode& pfrom, Peer& peer,
// Try to fill in the missing headers.
const CBlockIndex* best_header{WITH_LOCK(cs_main, return m_chainman.m_best_header)};
if (MaybeSendGetHeaders(pfrom, GetLocator(best_header), peer)) {
- LogPrint(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d)\n",
+ LogDebug(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d)\n",
headers[0].GetHash().ToString(),
headers[0].hashPrevBlock.ToString(),
best_header->nHeight,
@@ -2727,7 +2777,7 @@ bool PeerManagerImpl::CheckHeadersAreContinuous(const std::vector<CBlockHeader>&
bool PeerManagerImpl::IsContinuationOfLowWorkHeadersSync(Peer& peer, CNode& pfrom, std::vector<CBlockHeader>& headers)
{
if (peer.m_headers_sync) {
- auto result = peer.m_headers_sync->ProcessNextHeaders(headers, headers.size() == MAX_HEADERS_RESULTS);
+ auto result = peer.m_headers_sync->ProcessNextHeaders(headers, headers.size() == m_opts.max_headers_result);
// If it is a valid continuation, we should treat the existing getheaders request as responded to.
if (result.success) peer.m_last_getheaders_timestamp = {};
if (result.request_more) {
@@ -2741,7 +2791,7 @@ bool PeerManagerImpl::IsContinuationOfLowWorkHeadersSync(Peer& peer, CNode& pfro
// because we just cleared the last getheaders timestamp.
bool sent_getheaders = MaybeSendGetHeaders(pfrom, locator, peer);
Assume(sent_getheaders);
- LogPrint(BCLog::NET, "more getheaders (from %s) to peer=%d\n",
+ LogDebug(BCLog::NET, "more getheaders (from %s) to peer=%d\n",
locator.vHave.front().ToString(), pfrom.GetId());
}
}
@@ -2821,7 +2871,7 @@ bool PeerManagerImpl::TryLowWorkHeadersSync(Peer& peer, CNode& pfrom, const CBlo
// Only try to sync with this peer if their headers message was full;
// otherwise they don't have more headers after this so no point in
// trying to sync their too-little-work chain.
- if (headers.size() == MAX_HEADERS_RESULTS) {
+ if (headers.size() == m_opts.max_headers_result) {
// Note: we could advance to the last header in this set that is
// known to us, rather than starting at the first header (which we
// may already have); however this is unlikely to matter much since
@@ -2840,7 +2890,7 @@ bool PeerManagerImpl::TryLowWorkHeadersSync(Peer& peer, CNode& pfrom, const CBlo
// handled inside of IsContinuationOfLowWorkHeadersSync.
(void)IsContinuationOfLowWorkHeadersSync(peer, pfrom, headers);
} else {
- LogPrint(BCLog::NET, "Ignoring low-work chain (height=%u) from peer=%d\n", chain_start_header->nHeight + headers.size(), pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring low-work chain (height=%u) from peer=%d\n", chain_start_header->nHeight + headers.size(), pfrom.GetId());
}
// The peer has not yet given us a chain that meets our work threshold,
@@ -2906,13 +2956,13 @@ void PeerManagerImpl::HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, c
// the main chain -- this shouldn't really happen. Bail out on the
// direct fetch and rely on parallel download instead.
if (!m_chainman.ActiveChain().Contains(pindexWalk)) {
- LogPrint(BCLog::NET, "Large reorg, won't direct fetch to %s (%d)\n",
+ LogDebug(BCLog::NET, "Large reorg, won't direct fetch to %s (%d)\n",
last_header.GetBlockHash().ToString(),
last_header.nHeight);
} else {
std::vector<CInv> vGetData;
// Download as much as possible, from earliest to latest.
- for (const CBlockIndex *pindex : reverse_iterate(vToFetch)) {
+ for (const CBlockIndex* pindex : vToFetch | std::views::reverse) {
if (nodestate->vBlocksInFlight.size() >= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
// Can't download any more from this peer
break;
@@ -2920,11 +2970,11 @@ void PeerManagerImpl::HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, c
uint32_t nFetchFlags = GetFetchFlags(peer);
vGetData.emplace_back(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash());
BlockRequested(pfrom.GetId(), *pindex);
- LogPrint(BCLog::NET, "Requesting block %s from peer=%d\n",
+ LogDebug(BCLog::NET, "Requesting block %s from peer=%d\n",
pindex->GetBlockHash().ToString(), pfrom.GetId());
}
if (vGetData.size() > 1) {
- LogPrint(BCLog::NET, "Downloading blocks toward %s (%d) via headers direct fetch\n",
+ LogDebug(BCLog::NET, "Downloading blocks toward %s (%d) via headers direct fetch\n",
last_header.GetBlockHash().ToString(),
last_header.nHeight);
}
@@ -2992,7 +3042,7 @@ void PeerManagerImpl::UpdatePeerStateForReceivedHeaders(CNode& pfrom, Peer& peer
// See ChainSyncTimeoutState.
if (!pfrom.fDisconnect && pfrom.IsFullOutboundConn() && nodestate->pindexBestKnownBlock != nullptr) {
if (m_outbound_peers_with_protect_from_disconnect < MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT && nodestate->pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork && !nodestate->m_chain_sync.m_protect) {
- LogPrint(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom.GetId());
nodestate->m_chain_sync.m_protect = true;
++m_outbound_peers_with_protect_from_disconnect;
}
@@ -3133,15 +3183,15 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, Peer& peer,
assert(pindexLast);
// Consider fetching more headers if we are not using our headers-sync mechanism.
- if (nCount == MAX_HEADERS_RESULTS && !have_headers_sync) {
+ if (nCount == m_opts.max_headers_result && !have_headers_sync) {
// Headers message had its maximum size; the peer may have more headers.
if (MaybeSendGetHeaders(pfrom, GetLocator(pindexLast), peer)) {
- LogPrint(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
+ LogDebug(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
pindexLast->nHeight, pfrom.GetId(), peer.m_starting_height);
}
}
- UpdatePeerStateForReceivedHeaders(pfrom, peer, *pindexLast, received_new_header, nCount == MAX_HEADERS_RESULTS);
+ UpdatePeerStateForReceivedHeaders(pfrom, peer, *pindexLast, received_new_header, nCount == m_opts.max_headers_result);
// Consider immediately downloading blocks.
HeadersDirectFetchBlocks(pfrom, peer, *pindexLast);
@@ -3154,7 +3204,7 @@ void PeerManagerImpl::ProcessInvalidTx(NodeId nodeid, const CTransactionRef& ptx
{
AssertLockNotHeld(m_peer_mutex);
AssertLockHeld(g_msgproc_mutex);
- AssertLockHeld(cs_main);
+ AssertLockHeld(m_tx_download_mutex);
LogDebug(BCLog::MEMPOOLREJ, "%s (wtxid=%s) from peer=%d was not accepted: %s\n",
ptx->GetHash().ToString(),
@@ -3179,12 +3229,12 @@ void PeerManagerImpl::ProcessInvalidTx(NodeId nodeid, const CTransactionRef& ptx
// for concerns around weakening security of unupgraded nodes
// if we start doing this too early.
if (state.GetResult() == TxValidationResult::TX_RECONSIDERABLE) {
- // If the result is TX_RECONSIDERABLE, add it to m_recent_rejects_reconsiderable
+ // If the result is TX_RECONSIDERABLE, add it to m_lazy_recent_rejects_reconsiderable
// because we should not download or submit this transaction by itself again, but may
// submit it as part of a package later.
- m_recent_rejects_reconsiderable.insert(ptx->GetWitnessHash().ToUint256());
+ RecentRejectsReconsiderableFilter().insert(ptx->GetWitnessHash().ToUint256());
} else {
- m_recent_rejects.insert(ptx->GetWitnessHash().ToUint256());
+ RecentRejectsFilter().insert(ptx->GetWitnessHash().ToUint256());
}
m_txrequest.ForgetTxHash(ptx->GetWitnessHash());
// If the transaction failed for TX_INPUTS_NOT_STANDARD,
@@ -3198,7 +3248,7 @@ void PeerManagerImpl::ProcessInvalidTx(NodeId nodeid, const CTransactionRef& ptx
// We only add the txid if it differs from the wtxid, to avoid wasting entries in the
// rolling bloom filter.
if (state.GetResult() == TxValidationResult::TX_INPUTS_NOT_STANDARD && ptx->HasWitness()) {
- m_recent_rejects.insert(ptx->GetHash().ToUint256());
+ RecentRejectsFilter().insert(ptx->GetHash().ToUint256());
m_txrequest.ForgetTxHash(ptx->GetHash());
}
if (maybe_add_extra_compact_tx && RecursiveDynamicUsage(*ptx) < 100000) {
@@ -3219,7 +3269,7 @@ void PeerManagerImpl::ProcessValidTx(NodeId nodeid, const CTransactionRef& tx, c
{
AssertLockNotHeld(m_peer_mutex);
AssertLockHeld(g_msgproc_mutex);
- AssertLockHeld(cs_main);
+ AssertLockHeld(m_tx_download_mutex);
// As this version of the transaction was acceptable, we can forget about any requests for it.
// No-op if the tx is not in txrequest.
@@ -3247,13 +3297,13 @@ void PeerManagerImpl::ProcessPackageResult(const PackageToValidate& package_to_v
{
AssertLockNotHeld(m_peer_mutex);
AssertLockHeld(g_msgproc_mutex);
- AssertLockHeld(cs_main);
+ AssertLockHeld(m_tx_download_mutex);
const auto& package = package_to_validate.m_txns;
const auto& senders = package_to_validate.m_senders;
if (package_result.m_state.IsInvalid()) {
- m_recent_rejects_reconsiderable.insert(GetPackageHash(package));
+ RecentRejectsReconsiderableFilter().insert(GetPackageHash(package));
}
// We currently only expect to process 1-parent-1-child packages. Remove if this changes.
if (!Assume(package.size() == 2)) return;
@@ -3303,11 +3353,11 @@ std::optional<PeerManagerImpl::PackageToValidate> PeerManagerImpl::Find1P1CPacka
{
AssertLockNotHeld(m_peer_mutex);
AssertLockHeld(g_msgproc_mutex);
- AssertLockHeld(cs_main);
+ AssertLockHeld(m_tx_download_mutex);
const auto& parent_wtxid{ptx->GetWitnessHash()};
- Assume(m_recent_rejects_reconsiderable.contains(parent_wtxid.ToUint256()));
+ Assume(RecentRejectsReconsiderableFilter().contains(parent_wtxid.ToUint256()));
// Prefer children from this peer. This helps prevent censorship attempts in which an attacker
// sends lots of fake children for the parent, and we (unluckily) keep selecting the fake
@@ -3319,7 +3369,7 @@ std::optional<PeerManagerImpl::PackageToValidate> PeerManagerImpl::Find1P1CPacka
// most recent) one efficiently.
for (const auto& child : cpfp_candidates_same_peer) {
Package maybe_cpfp_package{ptx, child};
- if (!m_recent_rejects_reconsiderable.contains(GetPackageHash(maybe_cpfp_package))) {
+ if (!RecentRejectsReconsiderableFilter().contains(GetPackageHash(maybe_cpfp_package))) {
return PeerManagerImpl::PackageToValidate{ptx, child, nodeid, nodeid};
}
}
@@ -3339,14 +3389,14 @@ std::optional<PeerManagerImpl::PackageToValidate> PeerManagerImpl::Find1P1CPacka
// Create a random permutation of the indices.
std::vector<size_t> tx_indices(cpfp_candidates_different_peer.size());
std::iota(tx_indices.begin(), tx_indices.end(), 0);
- Shuffle(tx_indices.begin(), tx_indices.end(), m_rng);
+ std::shuffle(tx_indices.begin(), tx_indices.end(), m_rng);
for (const auto index : tx_indices) {
// If we already tried a package and failed for any reason, the combined hash was
- // cached in m_recent_rejects_reconsiderable.
+ // cached in m_lazy_recent_rejects_reconsiderable.
const auto [child_tx, child_sender] = cpfp_candidates_different_peer.at(index);
Package maybe_cpfp_package{ptx, child_tx};
- if (!m_recent_rejects_reconsiderable.contains(GetPackageHash(maybe_cpfp_package))) {
+ if (!RecentRejectsReconsiderableFilter().contains(GetPackageHash(maybe_cpfp_package))) {
return PeerManagerImpl::PackageToValidate{ptx, child_tx, nodeid, child_sender};
}
}
@@ -3356,7 +3406,7 @@ std::optional<PeerManagerImpl::PackageToValidate> PeerManagerImpl::Find1P1CPacka
bool PeerManagerImpl::ProcessOrphanTx(Peer& peer)
{
AssertLockHeld(g_msgproc_mutex);
- LOCK(cs_main);
+ LOCK2(::cs_main, m_tx_download_mutex);
CTransactionRef porphanTx = nullptr;
@@ -3367,11 +3417,11 @@ bool PeerManagerImpl::ProcessOrphanTx(Peer& peer)
const Wtxid& orphan_wtxid = porphanTx->GetWitnessHash();
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
- LogPrint(BCLog::TXPACKAGES, " accepted orphan tx %s (wtxid=%s)\n", orphanHash.ToString(), orphan_wtxid.ToString());
+ LogDebug(BCLog::TXPACKAGES, " accepted orphan tx %s (wtxid=%s)\n", orphanHash.ToString(), orphan_wtxid.ToString());
ProcessValidTx(peer.m_id, porphanTx, result.m_replaced_transactions);
return true;
} else if (state.GetResult() != TxValidationResult::TX_MISSING_INPUTS) {
- LogPrint(BCLog::TXPACKAGES, " invalid orphan tx %s (wtxid=%s) from peer=%d. %s\n",
+ LogDebug(BCLog::TXPACKAGES, " invalid orphan tx %s (wtxid=%s) from peer=%d. %s\n",
orphanHash.ToString(),
orphan_wtxid.ToString(),
peer.m_id,
@@ -3400,7 +3450,7 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
(filter_type == BlockFilterType::BASIC &&
(peer.m_our_services & NODE_COMPACT_FILTERS));
if (!supported_filter_type) {
- LogPrint(BCLog::NET, "peer %d requested unsupported block filter type: %d\n",
+ LogDebug(BCLog::NET, "peer %d requested unsupported block filter type: %d\n",
node.GetId(), static_cast<uint8_t>(filter_type));
node.fDisconnect = true;
return false;
@@ -3412,7 +3462,7 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
// Check that the stop block exists and the peer would be allowed to fetch it.
if (!stop_index || !BlockRequestAllowed(stop_index)) {
- LogPrint(BCLog::NET, "peer %d requested invalid block hash: %s\n",
+ LogDebug(BCLog::NET, "peer %d requested invalid block hash: %s\n",
node.GetId(), stop_hash.ToString());
node.fDisconnect = true;
return false;
@@ -3421,14 +3471,14 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
uint32_t stop_height = stop_index->nHeight;
if (start_height > stop_height) {
- LogPrint(BCLog::NET, "peer %d sent invalid getcfilters/getcfheaders with "
+ LogDebug(BCLog::NET, "peer %d sent invalid getcfilters/getcfheaders with "
"start height %d and stop height %d\n",
node.GetId(), start_height, stop_height);
node.fDisconnect = true;
return false;
}
if (stop_height - start_height >= max_height_diff) {
- LogPrint(BCLog::NET, "peer %d requested too many cfilters/cfheaders: %d / %d\n",
+ LogDebug(BCLog::NET, "peer %d requested too many cfilters/cfheaders: %d / %d\n",
node.GetId(), stop_height - start_height + 1, max_height_diff);
node.fDisconnect = true;
return false;
@@ -3436,7 +3486,7 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
filter_index = GetBlockFilterIndex(filter_type);
if (!filter_index) {
- LogPrint(BCLog::NET, "Filter index for supported type %s not found\n", BlockFilterTypeName(filter_type));
+ LogDebug(BCLog::NET, "Filter index for supported type %s not found\n", BlockFilterTypeName(filter_type));
return false;
}
@@ -3462,7 +3512,7 @@ void PeerManagerImpl::ProcessGetCFilters(CNode& node, Peer& peer, DataStream& vR
std::vector<BlockFilter> filters;
if (!filter_index->LookupFilterRange(start_height, stop_index, filters)) {
- LogPrint(BCLog::NET, "Failed to find block filter in index: filter_type=%s, start_height=%d, stop_hash=%s\n",
+ LogDebug(BCLog::NET, "Failed to find block filter in index: filter_type=%s, start_height=%d, stop_hash=%s\n",
BlockFilterTypeName(filter_type), start_height, stop_hash.ToString());
return;
}
@@ -3494,7 +3544,7 @@ void PeerManagerImpl::ProcessGetCFHeaders(CNode& node, Peer& peer, DataStream& v
const CBlockIndex* const prev_block =
stop_index->GetAncestor(static_cast<int>(start_height - 1));
if (!filter_index->LookupFilterHeader(prev_block, prev_header)) {
- LogPrint(BCLog::NET, "Failed to find block filter header in index: filter_type=%s, block_hash=%s\n",
+ LogDebug(BCLog::NET, "Failed to find block filter header in index: filter_type=%s, block_hash=%s\n",
BlockFilterTypeName(filter_type), prev_block->GetBlockHash().ToString());
return;
}
@@ -3502,7 +3552,7 @@ void PeerManagerImpl::ProcessGetCFHeaders(CNode& node, Peer& peer, DataStream& v
std::vector<uint256> filter_hashes;
if (!filter_index->LookupFilterHashRange(start_height, stop_index, filter_hashes)) {
- LogPrint(BCLog::NET, "Failed to find block filter hashes in index: filter_type=%s, start_height=%d, stop_hash=%s\n",
+ LogDebug(BCLog::NET, "Failed to find block filter hashes in index: filter_type=%s, start_height=%d, stop_hash=%s\n",
BlockFilterTypeName(filter_type), start_height, stop_hash.ToString());
return;
}
@@ -3540,7 +3590,7 @@ void PeerManagerImpl::ProcessGetCFCheckPt(CNode& node, Peer& peer, DataStream& v
block_index = block_index->GetAncestor(height);
if (!filter_index->LookupFilterHeader(block_index, headers[i])) {
- LogPrint(BCLog::NET, "Failed to find block filter header in index: filter_type=%s, block_hash=%s\n",
+ LogDebug(BCLog::NET, "Failed to find block filter header in index: filter_type=%s, block_hash=%s\n",
BlockFilterTypeName(filter_type), block_index->GetBlockHash().ToString());
return;
}
@@ -3593,7 +3643,7 @@ void PeerManagerImpl::ProcessCompactBlockTxns(CNode& pfrom, Peer& peer, const Bl
}
if (!requested_block_from_this_peer) {
- LogPrint(BCLog::NET, "Peer %d sent us block transactions for block we weren't expecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Peer %d sent us block transactions for block we weren't expecting\n", pfrom.GetId());
return;
}
@@ -3611,7 +3661,7 @@ void PeerManagerImpl::ProcessCompactBlockTxns(CNode& pfrom, Peer& peer, const Bl
MakeAndPushMessage(pfrom, NetMsgType::GETDATA, invs);
} else {
RemoveBlockRequest(block_transactions.blockhash, pfrom.GetId());
- LogPrint(BCLog::NET, "Peer %d sent us a compact block but it failed to reconstruct, waiting on first download to complete\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Peer %d sent us a compact block but it failed to reconstruct, waiting on first download to complete\n", pfrom.GetId());
return;
}
} else {
@@ -3661,14 +3711,14 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
AssertLockHeld(g_msgproc_mutex);
- LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", SanitizeString(msg_type), vRecv.size(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received: %s (%u bytes) peer=%d\n", SanitizeString(msg_type), vRecv.size(), pfrom.GetId());
PeerRef peer = GetPeerRef(pfrom.GetId());
if (peer == nullptr) return;
if (msg_type == NetMsgType::VERSION) {
if (pfrom.nVersion != 0) {
- LogPrint(BCLog::NET, "redundant version message from peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "redundant version message from peer=%d\n", pfrom.GetId());
return;
}
@@ -3696,14 +3746,14 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (pfrom.ExpectServicesFromConn() && !HasAllDesirableServiceFlags(nServices))
{
- LogPrint(BCLog::NET, "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom.GetId(), nServices, GetDesirableServiceFlags(nServices));
+ LogDebug(BCLog::NET, "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom.GetId(), nServices, GetDesirableServiceFlags(nServices));
pfrom.fDisconnect = true;
return;
}
if (nVersion < MIN_PEER_PROTO_VERSION) {
// disconnect from peers older than this proto version
- LogPrint(BCLog::NET, "peer=%d using obsolete version %i; disconnecting\n", pfrom.GetId(), nVersion);
+ LogDebug(BCLog::NET, "peer=%d using obsolete version %i; disconnecting\n", pfrom.GetId(), nVersion);
pfrom.fDisconnect = true;
return;
}
@@ -3859,7 +3909,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
remoteAddr = ", peeraddr=" + pfrom.addr.ToStringAddrPort();
const auto mapped_as{m_connman.GetMappedAS(pfrom.addr)};
- LogPrint(BCLog::NET, "receive version message: %s: version %d, blocks=%d, us=%s, txrelay=%d, peer=%d%s%s\n",
+ LogDebug(BCLog::NET, "receive version message: %s: version %d, blocks=%d, us=%s, txrelay=%d, peer=%d%s%s\n",
cleanSubVer, pfrom.nVersion,
peer->m_starting_height, addrMe.ToStringAddrPort(), fRelay, pfrom.GetId(),
remoteAddr, (mapped_as ? strprintf(", mapped_as=%d", mapped_as) : ""));
@@ -3874,13 +3924,13 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// If the peer is old enough to have the old alert system, send it the final alert.
if (greatest_common_version <= 70012) {
- const auto finalAlert{ParseHex("60010000000000000000000000ffffff7f00000000ffffff7ffeffff7f01ffffff7f00000000ffffff7f00ffffff7f002f555247454e543a20416c657274206b657920636f6d70726f6d697365642c2075706772616465207265717569726564004630440220653febd6410f470f6bae11cad19c48413becb1ac2c17f908fd0fd53bdc3abd5202206d0e9c96fe88d4a0f01ed9dedae2b6f9e00da94cad0fecaae66ecf689bf71b50")};
- MakeAndPushMessage(pfrom, "alert", Span{finalAlert});
+ constexpr auto finalAlert{"60010000000000000000000000ffffff7f00000000ffffff7ffeffff7f01ffffff7f00000000ffffff7f00ffffff7f002f555247454e543a20416c657274206b657920636f6d70726f6d697365642c2075706772616465207265717569726564004630440220653febd6410f470f6bae11cad19c48413becb1ac2c17f908fd0fd53bdc3abd5202206d0e9c96fe88d4a0f01ed9dedae2b6f9e00da94cad0fecaae66ecf689bf71b50"_hex};
+ MakeAndPushMessage(pfrom, "alert", finalAlert);
}
// Feeler connections exist only to verify if address is online.
if (pfrom.IsFeelerConn()) {
- LogPrint(BCLog::NET, "feeler connection completed peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "feeler connection completed peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
}
return;
@@ -3888,13 +3938,13 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (pfrom.nVersion == 0) {
// Must have a version message before anything else
- LogPrint(BCLog::NET, "non-version message before version handshake. Message \"%s\" from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
+ LogDebug(BCLog::NET, "non-version message before version handshake. Message \"%s\" from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
return;
}
if (msg_type == NetMsgType::VERACK) {
if (pfrom.fSuccessfullyConnected) {
- LogPrint(BCLog::NET, "ignoring redundant verack message from peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "ignoring redundant verack message from peer=%d\n", pfrom.GetId());
return;
}
@@ -3974,7 +4024,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::WTXIDRELAY) {
if (pfrom.fSuccessfullyConnected) {
// Disconnect peers that send a wtxidrelay message after VERACK.
- LogPrint(BCLog::NET, "wtxidrelay received after verack from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "wtxidrelay received after verack from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -3983,10 +4033,10 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
peer->m_wtxid_relay = true;
m_wtxid_relay_peers++;
} else {
- LogPrint(BCLog::NET, "ignoring duplicate wtxidrelay from peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "ignoring duplicate wtxidrelay from peer=%d\n", pfrom.GetId());
}
} else {
- LogPrint(BCLog::NET, "ignoring wtxidrelay due to old common version=%d from peer=%d\n", pfrom.GetCommonVersion(), pfrom.GetId());
+ LogDebug(BCLog::NET, "ignoring wtxidrelay due to old common version=%d from peer=%d\n", pfrom.GetCommonVersion(), pfrom.GetId());
}
return;
}
@@ -3996,7 +4046,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::SENDADDRV2) {
if (pfrom.fSuccessfullyConnected) {
// Disconnect peers that send a SENDADDRV2 message after VERACK.
- LogPrint(BCLog::NET, "sendaddrv2 received after verack from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "sendaddrv2 received after verack from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -4061,7 +4111,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (!pfrom.fSuccessfullyConnected) {
- LogPrint(BCLog::NET, "Unsupported message \"%s\" prior to verack from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
+ LogDebug(BCLog::NET, "Unsupported message \"%s\" prior to verack from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
return;
}
@@ -4079,7 +4129,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
vRecv >> ser_params(vAddr);
if (!SetupAddressRelay(pfrom, *peer)) {
- LogPrint(BCLog::NET, "ignoring %s message from %s peer=%d\n", msg_type, pfrom.ConnectionTypeAsString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "ignoring %s message from %s peer=%d\n", msg_type, pfrom.ConnectionTypeAsString(), pfrom.GetId());
return;
}
@@ -4106,7 +4156,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
const bool rate_limited = !pfrom.HasPermission(NetPermissionFlags::Addr);
uint64_t num_proc = 0;
uint64_t num_rate_limit = 0;
- Shuffle(vAddr.begin(), vAddr.end(), m_rng);
+ std::shuffle(vAddr.begin(), vAddr.end(), m_rng);
for (CAddress& addr : vAddr)
{
if (interruptMsgProc)
@@ -4148,7 +4198,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
peer->m_addr_processed += num_proc;
peer->m_addr_rate_limited += num_rate_limit;
- LogPrint(BCLog::NET, "Received addr: %u addresses (%u processed, %u rate-limited) from peer=%d\n",
+ LogDebug(BCLog::NET, "Received addr: %u addresses (%u processed, %u rate-limited) from peer=%d\n",
vAddr.size(), num_proc, num_rate_limit, pfrom.GetId());
m_addrman.Add(vAddrOk, pfrom.addr, 2h);
@@ -4156,7 +4206,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// AddrFetch: Require multiple addresses to avoid disconnecting on self-announcements
if (pfrom.IsAddrFetchConn() && vAddr.size() > 1) {
- LogPrint(BCLog::NET, "addrfetch connection completed peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "addrfetch connection completed peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
}
return;
@@ -4173,7 +4223,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
const bool reject_tx_invs{RejectIncomingTxs(pfrom)};
- LOCK(cs_main);
+ LOCK2(cs_main, m_tx_download_mutex);
const auto current_time{GetTime<std::chrono::microseconds>()};
uint256* best_block{nullptr};
@@ -4192,7 +4242,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (inv.IsMsgBlk()) {
const bool fAlreadyHave = AlreadyHaveBlock(inv.hash);
- LogPrint(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
+ LogDebug(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
UpdateBlockAvailability(pfrom.GetId(), inv.hash);
if (!fAlreadyHave && !m_chainman.m_blockman.LoadingBlocks() && !IsBlockRequested(inv.hash)) {
@@ -4206,20 +4256,20 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
} else if (inv.IsGenTxMsg()) {
if (reject_tx_invs) {
- LogPrint(BCLog::NET, "transaction (%s) inv sent in violation of protocol, disconnecting peer=%d\n", inv.hash.ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "transaction (%s) inv sent in violation of protocol, disconnecting peer=%d\n", inv.hash.ToString(), pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
const GenTxid gtxid = ToGenTxid(inv);
const bool fAlreadyHave = AlreadyHaveTx(gtxid, /*include_reconsiderable=*/true);
- LogPrint(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
+ LogDebug(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
AddKnownTx(*peer, inv.hash);
if (!fAlreadyHave && !m_chainman.IsInitialBlockDownload()) {
AddTxAnnouncement(pfrom, gtxid, current_time);
}
} else {
- LogPrint(BCLog::NET, "Unknown inv type \"%s\" received from peer=%d\n", inv.ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "Unknown inv type \"%s\" received from peer=%d\n", inv.ToString(), pfrom.GetId());
}
}
@@ -4237,7 +4287,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
CNodeState& state{*Assert(State(pfrom.GetId()))};
if (state.fSyncStarted || (!peer->m_inv_triggered_getheaders_before_sync && *best_block != m_last_block_inv_triggering_headers_sync)) {
if (MaybeSendGetHeaders(pfrom, GetLocator(m_chainman.m_best_header), *peer)) {
- LogPrint(BCLog::NET, "getheaders (%d) %s to peer=%d\n",
+ LogDebug(BCLog::NET, "getheaders (%d) %s to peer=%d\n",
m_chainman.m_best_header->nHeight, best_block->ToString(),
pfrom.GetId());
}
@@ -4263,10 +4313,10 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
return;
}
- LogPrint(BCLog::NET, "received getdata (%u invsz) peer=%d\n", vInv.size(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received getdata (%u invsz) peer=%d\n", vInv.size(), pfrom.GetId());
if (vInv.size() > 0) {
- LogPrint(BCLog::NET, "received getdata for: %s peer=%d\n", vInv[0].ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received getdata for: %s peer=%d\n", vInv[0].ToString(), pfrom.GetId());
}
{
@@ -4284,7 +4334,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
vRecv >> locator >> hashStop;
if (locator.vHave.size() > MAX_LOCATOR_SZ) {
- LogPrint(BCLog::NET, "getblocks locator size %lld > %d, disconnect peer=%d\n", locator.vHave.size(), MAX_LOCATOR_SZ, pfrom.GetId());
+ LogDebug(BCLog::NET, "getblocks locator size %lld > %d, disconnect peer=%d\n", locator.vHave.size(), MAX_LOCATOR_SZ, pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -4304,7 +4354,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
BlockValidationState state;
if (!m_chainman.ActiveChainstate().ActivateBestChain(state, a_recent_block)) {
- LogPrint(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
+ LogDebug(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
}
}
@@ -4317,26 +4367,26 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (pindex)
pindex = m_chainman.ActiveChain().Next(pindex);
int nLimit = 500;
- LogPrint(BCLog::NET, "getblocks %d to %s limit %d from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), nLimit, pfrom.GetId());
+ LogDebug(BCLog::NET, "getblocks %d to %s limit %d from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), nLimit, pfrom.GetId());
for (; pindex; pindex = m_chainman.ActiveChain().Next(pindex))
{
if (pindex->GetBlockHash() == hashStop)
{
- LogPrint(BCLog::NET, " getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
+ LogDebug(BCLog::NET, " getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
break;
}
// If pruning, don't inv blocks unless we have on disk and are likely to still have
// for some reasonable time window (1 hour) that block relay might require.
const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / m_chainparams.GetConsensus().nPowTargetSpacing;
if (m_chainman.m_blockman.IsPruneMode() && (!(pindex->nStatus & BLOCK_HAVE_DATA) || pindex->nHeight <= m_chainman.ActiveChain().Tip()->nHeight - nPrunedBlocksLikelyToHave)) {
- LogPrint(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
+ LogDebug(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
break;
}
WITH_LOCK(peer->m_block_inv_mutex, peer->m_blocks_for_inv_relay.push_back(pindex->GetBlockHash()));
if (--nLimit <= 0) {
// When this block is requested, we'll send an inv that'll
// trigger the peer to getblocks the next batch of inventory.
- LogPrint(BCLog::NET, " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
+ LogDebug(BCLog::NET, " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
WITH_LOCK(peer->m_block_inv_mutex, {peer->m_continuation_block = pindex->GetBlockHash();});
break;
}
@@ -4366,7 +4416,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(req.blockhash);
if (!pindex || !(pindex->nStatus & BLOCK_HAVE_DATA)) {
- LogPrint(BCLog::NET, "Peer %d sent us a getblocktxn for a block we don't have\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Peer %d sent us a getblocktxn for a block we don't have\n", pfrom.GetId());
return;
}
@@ -4393,7 +4443,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// might maliciously send lots of getblocktxn requests to trigger
// expensive disk reads, because it will require the peer to
// actually receive all the data read from disk over the network.
- LogPrint(BCLog::NET, "Peer %d sent us a getblocktxn for a block > %i deep\n", pfrom.GetId(), MAX_BLOCKTXN_DEPTH);
+ LogDebug(BCLog::NET, "Peer %d sent us a getblocktxn for a block > %i deep\n", pfrom.GetId(), MAX_BLOCKTXN_DEPTH);
CInv inv{MSG_WITNESS_BLOCK, req.blockhash};
WITH_LOCK(peer->m_getdata_requests_mutex, peer->m_getdata_requests.push_back(inv));
// The message processing loop will go around again (without pausing) and we'll respond then
@@ -4406,13 +4456,13 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
vRecv >> locator >> hashStop;
if (locator.vHave.size() > MAX_LOCATOR_SZ) {
- LogPrint(BCLog::NET, "getheaders locator size %lld > %d, disconnect peer=%d\n", locator.vHave.size(), MAX_LOCATOR_SZ, pfrom.GetId());
+ LogDebug(BCLog::NET, "getheaders locator size %lld > %d, disconnect peer=%d\n", locator.vHave.size(), MAX_LOCATOR_SZ, pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Ignoring getheaders from peer=%d while importing/reindexing\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring getheaders from peer=%d while importing/reindexing\n", pfrom.GetId());
return;
}
@@ -4427,7 +4477,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// others.
if (m_chainman.ActiveTip() == nullptr ||
(m_chainman.ActiveTip()->nChainWork < m_chainman.MinimumChainWork() && !pfrom.HasPermission(NetPermissionFlags::Download))) {
- LogPrint(BCLog::NET, "Ignoring getheaders from peer=%d because active chain has too little work; sending empty response\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring getheaders from peer=%d because active chain has too little work; sending empty response\n", pfrom.GetId());
// Just respond with an empty headers message, to tell the peer to
// go away but not treat us as unresponsive.
MakeAndPushMessage(pfrom, NetMsgType::HEADERS, std::vector<CBlockHeader>());
@@ -4445,7 +4495,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (!BlockRequestAllowed(pindex)) {
- LogPrint(BCLog::NET, "%s: ignoring request from peer=%i for old block header that isn't in the main chain\n", __func__, pfrom.GetId());
+ LogDebug(BCLog::NET, "%s: ignoring request from peer=%i for old block header that isn't in the main chain\n", __func__, pfrom.GetId());
return;
}
}
@@ -4459,8 +4509,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// we must use CBlocks, as CBlockHeaders won't include the 0x00 nTx count at the end
std::vector<CBlock> vHeaders;
- int nLimit = MAX_HEADERS_RESULTS;
- LogPrint(BCLog::NET, "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom.GetId());
+ int nLimit = m_opts.max_headers_result;
+ LogDebug(BCLog::NET, "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom.GetId());
for (; pindex; pindex = m_chainman.ActiveChain().Next(pindex))
{
vHeaders.emplace_back(pindex->GetBlockHeader());
@@ -4486,7 +4536,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::TX) {
if (RejectIncomingTxs(pfrom)) {
- LogPrint(BCLog::NET, "transaction sent in violation of protocol peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "transaction sent in violation of protocol peer=%d\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -4506,7 +4556,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
const uint256& hash = peer->m_wtxid_relay ? wtxid : txid;
AddKnownTx(*peer, hash);
- LOCK(cs_main);
+ LOCK2(cs_main, m_tx_download_mutex);
m_txrequest.ReceivedResponse(pfrom.GetId(), txid);
if (tx.HasWitness()) m_txrequest.ReceivedResponse(pfrom.GetId(), wtxid);
@@ -4538,11 +4588,11 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
}
- if (m_recent_rejects_reconsiderable.contains(wtxid)) {
- // When a transaction is already in m_recent_rejects_reconsiderable, we shouldn't submit
+ if (RecentRejectsReconsiderableFilter().contains(wtxid)) {
+ // When a transaction is already in m_lazy_recent_rejects_reconsiderable, we shouldn't submit
// it by itself again. However, look for a matching child in the orphanage, as it is
// possible that they succeed as a package.
- LogPrint(BCLog::TXPACKAGES, "found tx %s (wtxid=%s) in reconsiderable rejects, looking for child in orphanage\n",
+ LogDebug(BCLog::TXPACKAGES, "found tx %s (wtxid=%s) in reconsiderable rejects, looking for child in orphanage\n",
txid.ToString(), wtxid.ToString());
if (auto package_to_validate{Find1P1CPackage(ptx, pfrom.GetId())}) {
const auto package_result{ProcessNewPackage(m_chainman.ActiveChainstate(), m_mempool, package_to_validate->m_txns, /*test_accept=*/false, /*client_maxfeerate=*/std::nullopt)};
@@ -4551,20 +4601,20 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
ProcessPackageResult(package_to_validate.value(), package_result);
}
}
- // If a tx is detected by m_recent_rejects it is ignored. Because we haven't
+ // If a tx is detected by m_lazy_recent_rejects it is ignored. Because we haven't
// submitted the tx to our mempool, we won't have computed a DoS
// score for it or determined exactly why we consider it invalid.
//
// This means we won't penalize any peer subsequently relaying a DoSy
// tx (even if we penalized the first peer who gave it to us) because
- // we have to account for m_recent_rejects showing false positives. In
+ // we have to account for m_lazy_recent_rejects showing false positives. In
// other words, we shouldn't penalize a peer if we aren't *sure* they
// submitted a DoSy tx.
//
- // Note that m_recent_rejects doesn't just record DoSy or invalid
+ // Note that m_lazy_recent_rejects doesn't just record DoSy or invalid
// transactions, but any tx not accepted by the mempool, which may be
// due to node policy (vs. consensus). So we can't blanket penalize a
- // peer simply for relaying a tx that our m_recent_rejects has caught,
+ // peer simply for relaying a tx that our m_lazy_recent_rejects has caught,
// regardless of false positives.
return;
}
@@ -4591,16 +4641,16 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
std::sort(unique_parents.begin(), unique_parents.end());
unique_parents.erase(std::unique(unique_parents.begin(), unique_parents.end()), unique_parents.end());
- // Distinguish between parents in m_recent_rejects and m_recent_rejects_reconsiderable.
- // We can tolerate having up to 1 parent in m_recent_rejects_reconsiderable since we
- // submit 1p1c packages. However, fail immediately if any are in m_recent_rejects.
+ // Distinguish between parents in m_lazy_recent_rejects and m_lazy_recent_rejects_reconsiderable.
+ // We can tolerate having up to 1 parent in m_lazy_recent_rejects_reconsiderable since we
+ // submit 1p1c packages. However, fail immediately if any are in m_lazy_recent_rejects.
std::optional<uint256> rejected_parent_reconsiderable;
for (const uint256& parent_txid : unique_parents) {
- if (m_recent_rejects.contains(parent_txid)) {
+ if (RecentRejectsFilter().contains(parent_txid)) {
fRejectedParents = true;
break;
- } else if (m_recent_rejects_reconsiderable.contains(parent_txid) && !m_mempool.exists(GenTxid::Txid(parent_txid))) {
- // More than 1 parent in m_recent_rejects_reconsiderable: 1p1c will not be
+ } else if (RecentRejectsReconsiderableFilter().contains(parent_txid) && !m_mempool.exists(GenTxid::Txid(parent_txid))) {
+ // More than 1 parent in m_lazy_recent_rejects_reconsiderable: 1p1c will not be
// sufficient to accept this package, so just give up here.
if (rejected_parent_reconsiderable.has_value()) {
fRejectedParents = true;
@@ -4620,7 +4670,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// protocol for getting all unconfirmed parents.
const auto gtxid{GenTxid::Txid(parent_txid)};
AddKnownTx(*peer, parent_txid);
- // Exclude m_recent_rejects_reconsiderable: the missing parent may have been
+ // Exclude m_lazy_recent_rejects_reconsiderable: the missing parent may have been
// previously rejected for being too low feerate. This orphan might CPFP it.
if (!AlreadyHaveTx(gtxid, /*include_reconsiderable=*/false)) AddTxAnnouncement(pfrom, gtxid, current_time);
}
@@ -4636,7 +4686,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// DoS prevention: do not allow m_orphanage to grow unbounded (see CVE-2012-3789)
m_orphanage.LimitOrphans(m_opts.max_orphan_txs, m_rng);
} else {
- LogPrint(BCLog::MEMPOOL, "not keeping orphan with rejected parents %s (wtxid=%s)\n",
+ LogDebug(BCLog::MEMPOOL, "not keeping orphan with rejected parents %s (wtxid=%s)\n",
tx.GetHash().ToString(),
tx.GetWitnessHash().ToString());
// We will continue to reject this tx since it has rejected
@@ -4645,8 +4695,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// regardless of what witness is provided, we will not accept
// this, so we don't need to allow for redownload of this txid
// from any of our non-wtxidrelay peers.
- m_recent_rejects.insert(tx.GetHash().ToUint256());
- m_recent_rejects.insert(tx.GetWitnessHash().ToUint256());
+ RecentRejectsFilter().insert(tx.GetHash().ToUint256());
+ RecentRejectsFilter().insert(tx.GetWitnessHash().ToUint256());
m_txrequest.ForgetTxHash(tx.GetHash());
m_txrequest.ForgetTxHash(tx.GetWitnessHash());
}
@@ -4657,7 +4707,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// When a transaction fails for TX_RECONSIDERABLE, look for a matching child in the
// orphanage, as it is possible that they succeed as a package.
if (state.GetResult() == TxValidationResult::TX_RECONSIDERABLE) {
- LogPrint(BCLog::TXPACKAGES, "tx %s (wtxid=%s) failed but reconsiderable, looking for child in orphanage\n",
+ LogDebug(BCLog::TXPACKAGES, "tx %s (wtxid=%s) failed but reconsiderable, looking for child in orphanage\n",
txid.ToString(), wtxid.ToString());
if (auto package_to_validate{Find1P1CPackage(ptx, pfrom.GetId())}) {
const auto package_result{ProcessNewPackage(m_chainman.ActiveChainstate(), m_mempool, package_to_validate->m_txns, /*test_accept=*/false, /*client_maxfeerate=*/std::nullopt)};
@@ -4674,7 +4724,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
// Ignore cmpctblock received while importing
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Unexpected cmpctblock message received from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Unexpected cmpctblock message received from peer %d\n", pfrom.GetId());
return;
}
@@ -4694,9 +4744,9 @@ 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 + CalculateClaimedHeadersWork({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());
+ LogDebug(BCLog::NET, "Ignoring low-work compact block from peer %d\n", pfrom.GetId());
return;
}
@@ -4707,7 +4757,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
const CBlockIndex *pindex = nullptr;
BlockValidationState state;
- if (!m_chainman.ProcessNewBlockHeaders({cmpctblock.header}, /*min_pow_checked=*/true, state, &pindex)) {
+ if (!m_chainman.ProcessNewBlockHeaders({{cmpctblock.header}}, /*min_pow_checked=*/true, state, &pindex)) {
if (state.IsInvalid()) {
MaybePunishNodeForBlock(pfrom.GetId(), state, /*via_compact_block=*/true, "invalid header via cmpctblock");
return;
@@ -4790,7 +4840,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
(*queuedBlockIt)->partialBlock.reset(new PartiallyDownloadedBlock(&m_mempool));
else {
// The block was already in flight using compact blocks from the same peer
- LogPrint(BCLog::NET, "Peer sent us compact block we were already syncing!\n");
+ LogDebug(BCLog::NET, "Peer sent us compact block we were already syncing!\n");
return;
}
}
@@ -4921,7 +4971,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
// Ignore blocktxn received while importing
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Unexpected blocktxn message received from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Unexpected blocktxn message received from peer %d\n", pfrom.GetId());
return;
}
@@ -4935,7 +4985,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
// Ignore headers received while importing
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Unexpected headers message received from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Unexpected headers message received from peer %d\n", pfrom.GetId());
return;
}
@@ -4943,7 +4993,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
unsigned int nCount = ReadCompactSize(vRecv);
- if (nCount > MAX_HEADERS_RESULTS) {
+ if (nCount > m_opts.max_headers_result) {
Misbehaving(*peer, strprintf("headers message size = %u", nCount));
return;
}
@@ -4976,14 +5026,14 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
// Ignore block received while importing
if (m_chainman.m_blockman.LoadingBlocks()) {
- LogPrint(BCLog::NET, "Unexpected block message received from peer %d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Unexpected block message received from peer %d\n", pfrom.GetId());
return;
}
std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
vRecv >> TX_WITH_WITNESS(*pblock);
- LogPrint(BCLog::NET, "received block %s peer=%d\n", pblock->GetHash().ToString(), pfrom.GetId());
+ LogDebug(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))};
@@ -5011,7 +5061,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
mapBlockSource.emplace(hash, std::make_pair(pfrom.GetId(), true));
// Check claimed work on this block against our anti-dos thresholds.
- if (prev_block && prev_block->nChainWork + CalculateClaimedHeadersWork({pblock->GetBlockHeader()}) >= GetAntiDoSWorkThreshold()) {
+ if (prev_block && prev_block->nChainWork + CalculateClaimedHeadersWork({{pblock->GetBlockHeader()}}) >= GetAntiDoSWorkThreshold()) {
min_pow_checked = true;
}
}
@@ -5026,7 +5076,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// Making nodes which are behind NAT and can only make outgoing connections ignore
// the getaddr message mitigates the attack.
if (!pfrom.IsInboundConn()) {
- LogPrint(BCLog::NET, "Ignoring \"getaddr\" from %s connection. peer=%d\n", pfrom.ConnectionTypeAsString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring \"getaddr\" from %s connection. peer=%d\n", pfrom.ConnectionTypeAsString(), pfrom.GetId());
return;
}
@@ -5037,7 +5087,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// Only send one GetAddr response per connection to reduce resource waste
// and discourage addr stamping of INV announcements.
if (peer->m_getaddr_recvd) {
- LogPrint(BCLog::NET, "Ignoring repeated \"getaddr\". peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "Ignoring repeated \"getaddr\". peer=%d\n", pfrom.GetId());
return;
}
peer->m_getaddr_recvd = true;
@@ -5062,7 +5112,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
if (!pfrom.HasPermission(NetPermissionFlags::NoBan))
{
- LogPrint(BCLog::NET, "mempool request with bloom filters disabled, disconnect peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "mempool request with bloom filters disabled, disconnect peer=%d\n", pfrom.GetId());
pfrom.fDisconnect = true;
}
return;
@@ -5072,7 +5122,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
{
if (!pfrom.HasPermission(NetPermissionFlags::NoBan))
{
- LogPrint(BCLog::NET, "mempool request with bandwidth limit reached, disconnect peer=%d\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "mempool request with bandwidth limit reached, disconnect peer=%d\n", pfrom.GetId());
pfrom.fDisconnect = true;
}
return;
@@ -5147,7 +5197,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (!(sProblem.empty())) {
- LogPrint(BCLog::NET, "pong peer=%d: %s, %x expected, %x received, %u bytes\n",
+ LogDebug(BCLog::NET, "pong peer=%d: %s, %x expected, %x received, %u bytes\n",
pfrom.GetId(),
sProblem,
peer->m_ping_nonce_sent,
@@ -5162,7 +5212,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::FILTERLOAD) {
if (!(peer->m_our_services & NODE_BLOOM)) {
- LogPrint(BCLog::NET, "filterload received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "filterload received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -5187,7 +5237,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::FILTERADD) {
if (!(peer->m_our_services & NODE_BLOOM)) {
- LogPrint(BCLog::NET, "filteradd received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "filteradd received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -5215,7 +5265,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (msg_type == NetMsgType::FILTERCLEAR) {
if (!(peer->m_our_services & NODE_BLOOM)) {
- LogPrint(BCLog::NET, "filterclear received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
+ LogDebug(BCLog::NET, "filterclear received despite not offering bloom services from peer=%d; disconnecting\n", pfrom.GetId());
pfrom.fDisconnect = true;
return;
}
@@ -5239,7 +5289,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
if (auto tx_relay = peer->GetTxRelay(); tx_relay != nullptr) {
tx_relay->m_fee_filter_received = newFeeFilter;
}
- LogPrint(BCLog::NET, "received: feefilter of %s from peer=%d\n", CFeeRate(newFeeFilter).ToString(), pfrom.GetId());
+ LogDebug(BCLog::NET, "received: feefilter of %s from peer=%d\n", CFeeRate(newFeeFilter).ToString(), pfrom.GetId());
}
return;
}
@@ -5263,7 +5313,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
std::vector<CInv> vInv;
vRecv >> vInv;
if (vInv.size() <= MAX_PEER_TX_ANNOUNCEMENTS + MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
- LOCK(::cs_main);
+ LOCK(m_tx_download_mutex);
for (CInv &inv : vInv) {
if (inv.IsGenTxMsg()) {
// If we receive a NOTFOUND message for a tx we requested, mark the announcement for it as
@@ -5276,7 +5326,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
// Ignore unknown commands for extensibility
- LogPrint(BCLog::NET, "Unknown command \"%s\" from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
+ LogDebug(BCLog::NET, "Unknown command \"%s\" from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
return;
}
@@ -5306,14 +5356,14 @@ bool PeerManagerImpl::MaybeDiscourageAndDisconnect(CNode& pnode, Peer& peer)
if (pnode.addr.IsLocal()) {
// We disconnect local peers for bad behavior but don't discourage (since that would discourage
// all peers on the same local address)
- LogPrint(BCLog::NET, "Warning: disconnecting but not discouraging %s peer %d!\n",
+ LogDebug(BCLog::NET, "Warning: disconnecting but not discouraging %s peer %d!\n",
pnode.m_inbound_onion ? "inbound onion" : "local", peer.m_id);
pnode.fDisconnect = true;
return true;
}
// Normal case: Disconnect the peer and discourage all nodes sharing the address
- LogPrint(BCLog::NET, "Disconnecting and discouraging peer %d!\n", peer.m_id);
+ LogDebug(BCLog::NET, "Disconnecting and discouraging peer %d!\n", peer.m_id);
if (m_banman) m_banman->Discourage(pnode.addr);
m_connman.DisconnectNode(pnode.addr);
return true;
@@ -5321,11 +5371,16 @@ bool PeerManagerImpl::MaybeDiscourageAndDisconnect(CNode& pnode, Peer& peer)
bool PeerManagerImpl::ProcessMessages(CNode* pfrom, std::atomic<bool>& interruptMsgProc)
{
+ AssertLockNotHeld(m_tx_download_mutex);
AssertLockHeld(g_msgproc_mutex);
PeerRef peer = GetPeerRef(pfrom->GetId());
if (peer == nullptr) return false;
+ // For outbound connections, ensure that the initial VERSION message
+ // has been sent first before processing any incoming messages
+ if (!pfrom->IsInboundConn() && !peer->m_outbound_version_message_sent) return false;
+
{
LOCK(peer->m_getdata_requests_mutex);
if (!peer->m_getdata_requests.empty()) {
@@ -5384,11 +5439,12 @@ bool PeerManagerImpl::ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt
// by another peer that was already processed; in that case,
// the extra work may not be noticed, possibly resulting in an
// unnecessary 100ms delay)
+ LOCK(m_tx_download_mutex);
if (m_orphanage.HaveTxToReconsider(peer->m_id)) fMoreWork = true;
} catch (const std::exception& e) {
- LogPrint(BCLog::NET, "%s(%s, %u bytes): Exception '%s' (%s) caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size, e.what(), typeid(e).name());
+ LogDebug(BCLog::NET, "%s(%s, %u bytes): Exception '%s' (%s) caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size, e.what(), typeid(e).name());
} catch (...) {
- LogPrint(BCLog::NET, "%s(%s, %u bytes): Unknown exception caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size);
+ LogDebug(BCLog::NET, "%s(%s, %u bytes): Unknown exception caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size);
}
return fMoreWork;
@@ -5441,7 +5497,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, Peer& peer, std::chrono::seco
MaybeSendGetHeaders(pto,
GetLocator(state.m_chain_sync.m_work_header->pprev),
peer);
- LogPrint(BCLog::NET, "sending getheaders to outbound peer=%d to verify chain work (current best known block:%s, benchmark blockhash: %s)\n", pto.GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>", state.m_chain_sync.m_work_header->GetBlockHash().ToString());
+ LogDebug(BCLog::NET, "sending getheaders to outbound peer=%d to verify chain work (current best known block:%s, benchmark blockhash: %s)\n", pto.GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>", state.m_chain_sync.m_work_header->GetBlockHash().ToString());
state.m_chain_sync.m_sent_getheaders = true;
// Bump the timeout to allow a response, which could clear the timeout
// (if the response shows the peer has synced), reset the timeout (if
@@ -5490,11 +5546,11 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
if (node_state == nullptr ||
(now - pnode->m_connected >= MINIMUM_CONNECT_TIME && node_state->vBlocksInFlight.empty())) {
pnode->fDisconnect = true;
- LogPrint(BCLog::NET, "disconnecting extra block-relay-only peer=%d (last block received at time %d)\n",
+ LogDebug(BCLog::NET, "disconnecting extra block-relay-only peer=%d (last block received at time %d)\n",
pnode->GetId(), count_seconds(pnode->m_last_block_time));
return true;
} else {
- LogPrint(BCLog::NET, "keeping block-relay-only peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
+ LogDebug(BCLog::NET, "keeping block-relay-only peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
pnode->GetId(), count_seconds(pnode->m_connected), node_state->vBlocksInFlight.size());
}
return false;
@@ -5541,11 +5597,11 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
// block from.
CNodeState &state = *State(pnode->GetId());
if (now - pnode->m_connected > MINIMUM_CONNECT_TIME && state.vBlocksInFlight.empty()) {
- LogPrint(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n", pnode->GetId(), oldest_block_announcement);
+ LogDebug(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n", pnode->GetId(), oldest_block_announcement);
pnode->fDisconnect = true;
return true;
} else {
- LogPrint(BCLog::NET, "keeping outbound peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
+ LogDebug(BCLog::NET, "keeping outbound peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
pnode->GetId(), count_seconds(pnode->m_connected), state.vBlocksInFlight.size());
return false;
}
@@ -5597,7 +5653,7 @@ void PeerManagerImpl::MaybeSendPing(CNode& node_to, Peer& peer, std::chrono::mic
{
// The ping timeout is using mocktime. To disable the check during
// testing, increase -peertimeout.
- LogPrint(BCLog::NET, "ping timeout: %fs peer=%d\n", 0.000001 * count_microseconds(now - peer.m_ping_start.load()), peer.m_id);
+ LogDebug(BCLog::NET, "ping timeout: %fs peer=%d\n", 0.000001 * count_microseconds(now - peer.m_ping_start.load()), peer.m_id);
node_to.fDisconnect = true;
return;
}
@@ -5617,7 +5673,7 @@ void PeerManagerImpl::MaybeSendPing(CNode& node_to, Peer& peer, std::chrono::mic
if (pingSend) {
uint64_t nonce;
do {
- nonce = GetRand<uint64_t>();
+ nonce = FastRandomContext().rand64();
} while (nonce == 0);
peer.m_ping_queued = false;
peer.m_ping_start = now;
@@ -5654,13 +5710,13 @@ void PeerManagerImpl::MaybeSendAddr(CNode& node, Peer& peer, std::chrono::micros
CAddress local_addr{*local_service, peer.m_our_services, Now<NodeSeconds>()};
PushAddress(peer, local_addr);
}
- peer.m_next_local_addr_send = GetExponentialRand(current_time, AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL);
+ peer.m_next_local_addr_send = current_time + m_rng.rand_exp_duration(AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL);
}
// We sent an `addr` message to this peer recently. Nothing more to do.
if (current_time <= peer.m_next_addr_send) return;
- peer.m_next_addr_send = GetExponentialRand(current_time, AVG_ADDRESS_BROADCAST_INTERVAL);
+ peer.m_next_addr_send = current_time + m_rng.rand_exp_duration(AVG_ADDRESS_BROADCAST_INTERVAL);
if (!Assume(peer.m_addrs_to_send.size() <= MAX_ADDR_TO_SEND)) {
// Should be impossible since we always check size before adding to
@@ -5747,13 +5803,13 @@ void PeerManagerImpl::MaybeSendFeefilter(CNode& pto, Peer& peer, std::chrono::mi
MakeAndPushMessage(pto, NetMsgType::FEEFILTER, filterToSend);
peer.m_fee_filter_sent = filterToSend;
}
- peer.m_next_send_feefilter = GetExponentialRand(current_time, AVG_FEEFILTER_BROADCAST_INTERVAL);
+ peer.m_next_send_feefilter = current_time + m_rng.rand_exp_duration(AVG_FEEFILTER_BROADCAST_INTERVAL);
}
// If the fee filter has changed substantially and it's still more than MAX_FEEFILTER_CHANGE_DELAY
// until scheduled broadcast, then move the broadcast to within MAX_FEEFILTER_CHANGE_DELAY.
else if (current_time + MAX_FEEFILTER_CHANGE_DELAY < peer.m_next_send_feefilter &&
(currentFilter < 3 * peer.m_fee_filter_sent / 4 || currentFilter > 4 * peer.m_fee_filter_sent / 3)) {
- peer.m_next_send_feefilter = current_time + GetRandomDuration<std::chrono::microseconds>(MAX_FEEFILTER_CHANGE_DELAY);
+ peer.m_next_send_feefilter = current_time + m_rng.randrange<std::chrono::microseconds>(MAX_FEEFILTER_CHANGE_DELAY);
}
}
@@ -5807,6 +5863,7 @@ bool PeerManagerImpl::SetupAddressRelay(const CNode& node, Peer& peer)
bool PeerManagerImpl::SendMessages(CNode* pto)
{
+ AssertLockNotHeld(m_tx_download_mutex);
AssertLockHeld(g_msgproc_mutex);
PeerRef peer = GetPeerRef(pto->GetId());
@@ -5817,6 +5874,12 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// disconnect misbehaving peers even before the version handshake is complete.
if (MaybeDiscourageAndDisconnect(*pto, *peer)) return true;
+ // Initiate version handshake for outbound connections
+ if (!pto->IsInboundConn() && !peer->m_outbound_version_message_sent) {
+ PushNodeVersion(*pto, *peer);
+ peer->m_outbound_version_message_sent = true;
+ }
+
// Don't send anything until the version handshake is complete
if (!pto->fSuccessfullyConnected || pto->fDisconnect)
return true;
@@ -5824,7 +5887,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
const auto current_time{GetTime<std::chrono::microseconds>()};
if (pto->IsAddrFetchConn() && current_time - pto->m_connected > 10 * AVG_ADDRESS_BROADCAST_INTERVAL) {
- LogPrint(BCLog::NET, "addrfetch connection timeout; disconnecting peer=%d\n", pto->GetId());
+ LogDebug(BCLog::NET, "addrfetch connection timeout; disconnecting peer=%d\n", pto->GetId());
pto->fDisconnect = true;
return true;
}
@@ -5883,7 +5946,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
if (pindexStart->pprev)
pindexStart = pindexStart->pprev;
if (MaybeSendGetHeaders(*pto, GetLocator(pindexStart), *peer)) {
- LogPrint(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), peer->m_starting_height);
+ LogDebug(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), peer->m_starting_height);
state.fSyncStarted = true;
peer->m_headers_sync_timeout = current_time + HEADERS_DOWNLOAD_TIMEOUT_BASE +
@@ -5968,7 +6031,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
if (vHeaders.size() == 1 && state.m_requested_hb_cmpctblocks) {
// We only send up to 1 block as header-and-ids, as otherwise
// probably means we're doing an initial-ish-sync or they're slow
- LogPrint(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", __func__,
+ LogDebug(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", __func__,
vHeaders.front().GetHash().ToString(), pto->GetId());
std::optional<CSerializedNetMsg> cached_cmpctblock_msg;
@@ -5984,18 +6047,18 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
CBlock block;
const bool ret{m_chainman.m_blockman.ReadBlockFromDisk(block, *pBestIndex)};
assert(ret);
- CBlockHeaderAndShortTxIDs cmpctblock{block, GetRand<uint64_t>()};
+ CBlockHeaderAndShortTxIDs cmpctblock{block, m_rng.rand64()};
MakeAndPushMessage(*pto, NetMsgType::CMPCTBLOCK, cmpctblock);
}
state.pindexBestHeaderSent = pBestIndex;
} else if (peer->m_prefers_headers) {
if (vHeaders.size() > 1) {
- LogPrint(BCLog::NET, "%s: %u headers, range (%s, %s), to peer=%d\n", __func__,
+ LogDebug(BCLog::NET, "%s: %u headers, range (%s, %s), to peer=%d\n", __func__,
vHeaders.size(),
vHeaders.front().GetHash().ToString(),
vHeaders.back().GetHash().ToString(), pto->GetId());
} else {
- LogPrint(BCLog::NET, "%s: sending header %s to peer=%d\n", __func__,
+ LogDebug(BCLog::NET, "%s: sending header %s to peer=%d\n", __func__,
vHeaders.front().GetHash().ToString(), pto->GetId());
}
MakeAndPushMessage(*pto, NetMsgType::HEADERS, TX_WITH_WITNESS(vHeaders));
@@ -6016,14 +6079,14 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// This should be very rare and could be optimized out.
// Just log for now.
if (m_chainman.ActiveChain()[pindex->nHeight] != pindex) {
- LogPrint(BCLog::NET, "Announcing block %s not on main chain (tip=%s)\n",
+ LogDebug(BCLog::NET, "Announcing block %s not on main chain (tip=%s)\n",
hashToAnnounce.ToString(), m_chainman.ActiveChain().Tip()->GetBlockHash().ToString());
}
// If the peer's chain has this block, don't inv it back.
if (!PeerHasHeader(&state, pindex)) {
peer->m_blocks_for_inv_relay.push_back(hashToAnnounce);
- LogPrint(BCLog::NET, "%s: sending inv peer=%d hash=%s\n", __func__,
+ LogDebug(BCLog::NET, "%s: sending inv peer=%d hash=%s\n", __func__,
pto->GetId(), hashToAnnounce.ToString());
}
}
@@ -6059,7 +6122,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
if (pto->IsInboundConn()) {
tx_relay->m_next_inv_send_time = NextInvToInbounds(current_time, INBOUND_INVENTORY_BROADCAST_INTERVAL);
} else {
- tx_relay->m_next_inv_send_time = GetExponentialRand(current_time, OUTBOUND_INVENTORY_BROADCAST_INTERVAL);
+ tx_relay->m_next_inv_send_time = current_time + m_rng.rand_exp_duration(OUTBOUND_INVENTORY_BROADCAST_INTERVAL);
}
}
@@ -6174,7 +6237,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// bandwidth is insufficient.
const auto new_timeout = std::min(2 * stalling_timeout, BLOCK_STALLING_TIMEOUT_MAX);
if (stalling_timeout != new_timeout && m_block_stalling_timeout.compare_exchange_strong(stalling_timeout, new_timeout)) {
- LogPrint(BCLog::NET, "Increased stalling timeout temporarily to %d seconds\n", count_seconds(new_timeout));
+ LogDebug(BCLog::NET, "Increased stalling timeout temporarily to %d seconds\n", count_seconds(new_timeout));
}
return true;
}
@@ -6244,23 +6307,26 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// before the background chainstate to prioritize getting to network tip.
FindNextBlocksToDownload(*peer, get_inflight_budget(), vToDownload, staller);
if (m_chainman.BackgroundSyncInProgress() && !IsLimitedPeer(*peer)) {
+ // If the background tip is not an ancestor of the snapshot block,
+ // we need to start requesting blocks from their last common ancestor.
+ const CBlockIndex *from_tip = LastCommonAncestor(m_chainman.GetBackgroundSyncTip(), m_chainman.GetSnapshotBaseBlock());
TryDownloadingHistoricalBlocks(
*peer,
get_inflight_budget(),
- vToDownload, m_chainman.GetBackgroundSyncTip(),
+ vToDownload, from_tip,
Assert(m_chainman.GetSnapshotBaseBlock()));
}
for (const CBlockIndex *pindex : vToDownload) {
uint32_t nFetchFlags = GetFetchFlags(*peer);
vGetData.emplace_back(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash());
BlockRequested(pto->GetId(), *pindex);
- LogPrint(BCLog::NET, "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(),
+ LogDebug(BCLog::NET, "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(),
pindex->nHeight, pto->GetId());
}
if (state.vBlocksInFlight.empty() && staller != -1) {
if (State(staller)->m_stalling_since == 0us) {
State(staller)->m_stalling_since = current_time;
- LogPrint(BCLog::NET, "Stall started peer=%d\n", staller);
+ LogDebug(BCLog::NET, "Stall started peer=%d\n", staller);
}
}
}
@@ -6268,31 +6334,33 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
//
// Message: getdata (transactions)
//
- std::vector<std::pair<NodeId, GenTxid>> expired;
- auto requestable = m_txrequest.GetRequestable(pto->GetId(), current_time, &expired);
- for (const auto& entry : expired) {
- LogPrint(BCLog::NET, "timeout of inflight %s %s from peer=%d\n", entry.second.IsWtxid() ? "wtx" : "tx",
- entry.second.GetHash().ToString(), entry.first);
- }
- for (const GenTxid& gtxid : requestable) {
- // Exclude m_recent_rejects_reconsiderable: we may be requesting a missing parent
- // that was previously rejected for being too low feerate.
- if (!AlreadyHaveTx(gtxid, /*include_reconsiderable=*/false)) {
- LogPrint(BCLog::NET, "Requesting %s %s peer=%d\n", gtxid.IsWtxid() ? "wtx" : "tx",
- gtxid.GetHash().ToString(), pto->GetId());
- vGetData.emplace_back(gtxid.IsWtxid() ? MSG_WTX : (MSG_TX | GetFetchFlags(*peer)), gtxid.GetHash());
- if (vGetData.size() >= MAX_GETDATA_SZ) {
- MakeAndPushMessage(*pto, NetMsgType::GETDATA, vGetData);
- vGetData.clear();
+ {
+ LOCK(m_tx_download_mutex);
+ std::vector<std::pair<NodeId, GenTxid>> expired;
+ auto requestable = m_txrequest.GetRequestable(pto->GetId(), current_time, &expired);
+ for (const auto& entry : expired) {
+ LogDebug(BCLog::NET, "timeout of inflight %s %s from peer=%d\n", entry.second.IsWtxid() ? "wtx" : "tx",
+ entry.second.GetHash().ToString(), entry.first);
+ }
+ for (const GenTxid& gtxid : requestable) {
+ // Exclude m_lazy_recent_rejects_reconsiderable: we may be requesting a missing parent
+ // that was previously rejected for being too low feerate.
+ if (!AlreadyHaveTx(gtxid, /*include_reconsiderable=*/false)) {
+ LogDebug(BCLog::NET, "Requesting %s %s peer=%d\n", gtxid.IsWtxid() ? "wtx" : "tx",
+ gtxid.GetHash().ToString(), pto->GetId());
+ vGetData.emplace_back(gtxid.IsWtxid() ? MSG_WTX : (MSG_TX | GetFetchFlags(*peer)), gtxid.GetHash());
+ if (vGetData.size() >= MAX_GETDATA_SZ) {
+ MakeAndPushMessage(*pto, NetMsgType::GETDATA, vGetData);
+ vGetData.clear();
+ }
+ m_txrequest.RequestedTx(pto->GetId(), gtxid.GetHash(), current_time + GETDATA_TX_INTERVAL);
+ } else {
+ // We have already seen this transaction, no need to download. This is just a belt-and-suspenders, as
+ // this should already be called whenever a transaction becomes AlreadyHaveTx().
+ m_txrequest.ForgetTxHash(gtxid.GetHash());
}
- m_txrequest.RequestedTx(pto->GetId(), gtxid.GetHash(), current_time + GETDATA_TX_INTERVAL);
- } else {
- // We have already seen this transaction, no need to download. This is just a belt-and-suspenders, as
- // this should already be called whenever a transaction becomes AlreadyHaveTx().
- m_txrequest.ForgetTxHash(gtxid.GetHash());
}
- }
-
+ } // release m_tx_download_mutex
if (!vGetData.empty())
MakeAndPushMessage(*pto, NetMsgType::GETDATA, vGetData);
diff --git a/src/net_processing.h b/src/net_processing.h
index bf9698ee02..ccacd15e42 100644
--- a/src/net_processing.h
+++ b/src/net_processing.h
@@ -31,6 +31,9 @@ static const bool DEFAULT_PEERBLOOMFILTERS = false;
static const bool DEFAULT_PEERBLOCKFILTERS = false;
/** Maximum number of outstanding CMPCTBLOCK requests for the same block. */
static const unsigned int MAX_CMPCTBLOCKS_INFLIGHT_PER_BLOCK = 3;
+/** Number of headers sent in one getheaders result. We rely on the assumption that if a peer sends
+ * less than this number, we reached its tip. Changing this value is a protocol upgrade. */
+static const unsigned int MAX_HEADERS_RESULTS = 2000;
struct CNodeStateStats {
int nSyncHeight = -1;
@@ -71,12 +74,15 @@ public:
//! Whether or not the internal RNG behaves deterministically (this is
//! a test-only option).
bool deterministic_rng{false};
+ //! Number of headers sent in one getheaders message result (this is
+ //! a test-only option).
+ uint32_t max_headers_result{MAX_HEADERS_RESULTS};
};
static std::unique_ptr<PeerManager> make(CConnman& connman, AddrMan& addrman,
BanMan* banman, ChainstateManager& chainman,
CTxMemPool& pool, node::Warnings& warnings, Options opts);
- virtual ~PeerManager() { }
+ virtual ~PeerManager() = default;
/**
* Attempt to manually fetch block from a given peer. We must already have the header.
diff --git a/src/net_types.h b/src/net_types.h
index b9e019d8fd..21ef835b4e 100644
--- a/src/net_types.h
+++ b/src/net_types.h
@@ -19,7 +19,7 @@ public:
int64_t nCreateTime{0};
int64_t nBanUntil{0};
- CBanEntry() {}
+ CBanEntry() = default;
explicit CBanEntry(int64_t nCreateTimeIn)
: nCreateTime{nCreateTimeIn} {}
diff --git a/src/netaddress.cpp b/src/netaddress.cpp
index 0053464822..bd2353a712 100644
--- a/src/netaddress.cpp
+++ b/src/netaddress.cpp
@@ -245,14 +245,14 @@ bool CNetAddr::SetTor(const std::string& addr)
Span<const uint8_t> input_checksum{input->data() + ADDR_TORV3_SIZE, torv3::CHECKSUM_LEN};
Span<const uint8_t> input_version{input->data() + ADDR_TORV3_SIZE + torv3::CHECKSUM_LEN, sizeof(torv3::VERSION)};
- if (input_version != torv3::VERSION) {
+ if (!std::ranges::equal(input_version, torv3::VERSION)) {
return false;
}
uint8_t calculated_checksum[torv3::CHECKSUM_LEN];
torv3::Checksum(input_pubkey, calculated_checksum);
- if (input_checksum != calculated_checksum) {
+ if (!std::ranges::equal(input_checksum, calculated_checksum)) {
return false;
}
diff --git a/src/netaddress.h b/src/netaddress.h
index 52fecada1c..24f5c3fb96 100644
--- a/src/netaddress.h
+++ b/src/netaddress.h
@@ -567,8 +567,8 @@ class CServiceHash
{
public:
CServiceHash()
- : m_salt_k0{GetRand<uint64_t>()},
- m_salt_k1{GetRand<uint64_t>()}
+ : m_salt_k0{FastRandomContext().rand64()},
+ m_salt_k1{FastRandomContext().rand64()}
{
}
diff --git a/src/netbase.cpp b/src/netbase.cpp
index f5f0997ba6..76a5f9834e 100644
--- a/src/netbase.cpp
+++ b/src/netbase.cpp
@@ -50,6 +50,7 @@ std::vector<CNetAddr> WrappedGetAddrInfo(const std::string& name, bool allow_loo
ai_hint.ai_protocol = IPPROTO_TCP;
// We don't care which address family (IPv4 or IPv6) is returned
ai_hint.ai_family = AF_UNSPEC;
+
// If we allow lookups of hostnames, use the AI_ADDRCONFIG flag to only
// return addresses whose family we have an address configured for.
//
@@ -61,7 +62,17 @@ std::vector<CNetAddr> WrappedGetAddrInfo(const std::string& name, bool allow_loo
addrinfo* ai_res{nullptr};
const int n_err{getaddrinfo(name.c_str(), nullptr, &ai_hint, &ai_res)};
if (n_err != 0) {
- return {};
+ if ((ai_hint.ai_flags & AI_ADDRCONFIG) == AI_ADDRCONFIG) {
+ // AI_ADDRCONFIG on some systems may exclude loopback-only addresses
+ // If first lookup failed we perform a second lookup without AI_ADDRCONFIG
+ ai_hint.ai_flags = (ai_hint.ai_flags & ~AI_ADDRCONFIG);
+ const int n_err_retry{getaddrinfo(name.c_str(), nullptr, &ai_hint, &ai_res)};
+ if (n_err_retry != 0) {
+ return {};
+ }
+ } else {
+ return {};
+ }
}
// Traverse the linked list starting with ai_trav.
@@ -219,7 +230,7 @@ CService LookupNumeric(const std::string& name, uint16_t portDefault, DNSLookupF
bool IsUnixSocketPath(const std::string& name)
{
#ifdef HAVE_SOCKADDR_UN
- if (name.find(ADDR_PREFIX_UNIX) != 0) return false;
+ if (!name.starts_with(ADDR_PREFIX_UNIX)) return false;
// Split off "unix:" prefix
std::string str{name.substr(ADDR_PREFIX_UNIX.length())};
@@ -362,7 +373,7 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
{
try {
IntrRecvError recvr;
- LogPrint(BCLog::NET, "SOCKS5 connecting %s\n", strDest);
+ LogDebug(BCLog::NET, "SOCKS5 connecting %s\n", strDest);
if (strDest.size() > 255) {
LogError("Hostname too long\n");
return false;
@@ -401,7 +412,7 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
vAuth.push_back(auth->password.size());
vAuth.insert(vAuth.end(), auth->password.begin(), auth->password.end());
sock.SendComplete(vAuth, g_socks5_recv_timeout, g_socks5_interrupt);
- LogPrint(BCLog::PROXY, "SOCKS5 sending proxy authentication %s:%s\n", auth->username, auth->password);
+ LogDebug(BCLog::PROXY, "SOCKS5 sending proxy authentication %s:%s\n", auth->username, auth->password);
uint8_t pchRetA[2];
if (InterruptibleRecv(pchRetA, 2, g_socks5_recv_timeout, sock) != IntrRecvError::OK) {
LogError("Error reading proxy authentication response\n");
@@ -445,7 +456,8 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
}
if (pchRet2[1] != SOCKS5Reply::SUCCEEDED) {
// Failures to connect to a peer that are not proxy errors
- LogPrintf("Socks5() connect to %s:%d failed: %s\n", strDest, port, Socks5ErrorString(pchRet2[1]));
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug,
+ "Socks5() connect to %s:%d failed: %s\n", strDest, port, Socks5ErrorString(pchRet2[1]));
return false;
}
if (pchRet2[2] != 0x00) { // Reserved field must be 0
@@ -479,7 +491,7 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
LogError("Error reading from proxy\n");
return false;
}
- LogPrint(BCLog::NET, "SOCKS5 connected %s\n", strDest);
+ LogDebug(BCLog::NET, "SOCKS5 connected %s\n", strDest);
return true;
} catch (const std::runtime_error& e) {
LogError("Error during SOCKS5 proxy handshake: %s\n", e.what());
@@ -535,7 +547,7 @@ std::unique_ptr<Sock> CreateSockOS(int domain, int type, int protocol)
// Set the no-delay option (disable Nagle's algorithm) on the TCP socket.
const int on{1};
if (sock->SetSockOpt(IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == SOCKET_ERROR) {
- LogPrint(BCLog::NET, "Unable to set TCP_NODELAY on a newly created socket, continuing anyway\n");
+ LogDebug(BCLog::NET, "Unable to set TCP_NODELAY on a newly created socket, continuing anyway\n");
}
}
@@ -545,12 +557,13 @@ std::unique_ptr<Sock> CreateSockOS(int domain, int type, int protocol)
std::function<std::unique_ptr<Sock>(int, int, int)> CreateSock = CreateSockOS;
template<typename... Args>
-static void LogConnectFailure(bool manual_connection, const char* fmt, const Args&... args) {
+static void LogConnectFailure(bool manual_connection, util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args)
+{
std::string error_message = tfm::format(fmt, args...);
if (manual_connection) {
LogPrintf("%s\n", error_message);
} else {
- LogPrint(BCLog::NET, "%s\n", error_message);
+ LogDebug(BCLog::NET, "%s\n", error_message);
}
}
@@ -573,7 +586,7 @@ static bool ConnectToSocket(const Sock& sock, struct sockaddr* sockaddr, socklen
NetworkErrorString(WSAGetLastError()));
return false;
} else if (occurred == 0) {
- LogPrint(BCLog::NET, "connection attempt to %s timed out\n", dest_str);
+ LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "connection attempt to %s timed out\n", dest_str);
return false;
}
diff --git a/src/netbase.h b/src/netbase.h
index 8ef6c28996..bf4d7ececc 100644
--- a/src/netbase.h
+++ b/src/netbase.h
@@ -134,6 +134,13 @@ public:
return Contains(addr.GetNetwork());
}
+ [[nodiscard]] std::unordered_set<Network> All() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
+ {
+ AssertLockNotHeld(m_mutex);
+ LOCK(m_mutex);
+ return m_reachable;
+ }
+
private:
mutable Mutex m_mutex;
diff --git a/src/node/blockmanager_args.cpp b/src/node/blockmanager_args.cpp
index fa76566652..0fc4e1646a 100644
--- a/src/node/blockmanager_args.cpp
+++ b/src/node/blockmanager_args.cpp
@@ -16,6 +16,7 @@
namespace node {
util::Result<void> ApplyArgsManOptions(const ArgsManager& args, BlockManager::Options& opts)
{
+ if (auto value{args.GetBoolArg("-blocksxor")}) opts.use_xor = *value;
// block pruning; get the amount of disk space (in MiB) to allot for block & undo files
int64_t nPruneArg{args.GetIntArg("-prune", opts.prune_target)};
if (nPruneArg < 0) {
diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp
index fb62e78138..07878a5602 100644
--- a/src/node/blockstorage.cpp
+++ b/src/node/blockstorage.cpp
@@ -19,7 +19,7 @@
#include <pow.h>
#include <primitives/block.h>
#include <primitives/transaction.h>
-#include <reverse_iterator.h>
+#include <random.h>
#include <serialize.h>
#include <signet.h>
#include <span.h>
@@ -37,6 +37,7 @@
#include <validation.h>
#include <map>
+#include <ranges>
#include <unordered_map>
namespace kernel {
@@ -366,7 +367,7 @@ void BlockManager::FindFilesToPrune(
}
}
- LogPrint(BCLog::PRUNE, "[%s] target=%dMiB actual=%dMiB diff=%dMiB min_height=%d max_prune_height=%d removed %d blk/rev pairs\n",
+ LogDebug(BCLog::PRUNE, "[%s] target=%dMiB actual=%dMiB diff=%dMiB min_height=%d max_prune_height=%d removed %d blk/rev pairs\n",
chain.GetRole(), target / 1024 / 1024, nCurrentUsage / 1024 / 1024,
(int64_t(target) - int64_t(nCurrentUsage)) / 1024 / 1024,
min_block_to_prune, last_block_can_prune, count);
@@ -410,11 +411,11 @@ bool BlockManager::LoadBlockIndex(const std::optional<uint256>& snapshot_blockha
m_snapshot_height = au_data.height;
CBlockIndex* base{LookupBlockIndex(*snapshot_blockhash)};
- // Since nChainTx (responsible for estimated progress) isn't persisted
+ // Since m_chain_tx_count (responsible for estimated progress) isn't persisted
// to disk, we must bootstrap the value for assumedvalid chainstates
// from the hardcoded assumeutxo chainparams.
- base->nChainTx = au_data.nChainTx;
- LogPrintf("[snapshot] set nChainTx=%d for %s\n", au_data.nChainTx, snapshot_blockhash->ToString());
+ base->m_chain_tx_count = au_data.m_chain_tx_count;
+ LogPrintf("[snapshot] set m_chain_tx_count=%d for %s\n", au_data.m_chain_tx_count, snapshot_blockhash->ToString());
} else {
// If this isn't called with a snapshot blockhash, make sure the cached snapshot height
// is null. This is relevant during snapshot completion, when the blockman may be loaded
@@ -449,15 +450,15 @@ bool BlockManager::LoadBlockIndex(const std::optional<uint256>& snapshot_blockha
if (m_snapshot_height && pindex->nHeight == *m_snapshot_height &&
pindex->GetBlockHash() == *snapshot_blockhash) {
// Should have been set above; don't disturb it with code below.
- Assert(pindex->nChainTx > 0);
- } else if (pindex->pprev->nChainTx > 0) {
- pindex->nChainTx = pindex->pprev->nChainTx + pindex->nTx;
+ Assert(pindex->m_chain_tx_count > 0);
+ } else if (pindex->pprev->m_chain_tx_count > 0) {
+ pindex->m_chain_tx_count = pindex->pprev->m_chain_tx_count + pindex->nTx;
} else {
- pindex->nChainTx = 0;
+ pindex->m_chain_tx_count = 0;
m_blocks_unlinked.insert(std::make_pair(pindex->pprev, pindex));
}
} else {
- pindex->nChainTx = pindex->nTx;
+ pindex->m_chain_tx_count = pindex->nTx;
}
}
if (!(pindex->nStatus & BLOCK_FAILED_MASK) && pindex->pprev && (pindex->pprev->nStatus & BLOCK_FAILED_MASK)) {
@@ -578,7 +579,7 @@ const CBlockIndex* BlockManager::GetLastCheckpoint(const CCheckpointData& data)
{
const MapCheckpoints& checkpoints = data.mapCheckpoints;
- for (const MapCheckpoints::value_type& i : reverse_iterate(checkpoints)) {
+ for (const MapCheckpoints::value_type& i : checkpoints | std::views::reverse) {
const uint256& hash = i.second;
const CBlockIndex* pindex = LookupBlockIndex(hash);
if (pindex) {
@@ -588,18 +589,18 @@ const CBlockIndex* BlockManager::GetLastCheckpoint(const CCheckpointData& data)
return nullptr;
}
-bool BlockManager::IsBlockPruned(const CBlockIndex& block)
+bool BlockManager::IsBlockPruned(const CBlockIndex& block) const
{
AssertLockHeld(::cs_main);
return m_have_pruned && !(block.nStatus & BLOCK_HAVE_DATA) && (block.nTx > 0);
}
-const CBlockIndex* BlockManager::GetFirstStoredBlock(const CBlockIndex& upper_block, const CBlockIndex* lower_block)
+const CBlockIndex* BlockManager::GetFirstBlock(const CBlockIndex& upper_block, uint32_t status_mask, const CBlockIndex* lower_block) const
{
AssertLockHeld(::cs_main);
const CBlockIndex* last_block = &upper_block;
- assert(last_block->nStatus & BLOCK_HAVE_DATA); // 'upper_block' must have data
- while (last_block->pprev && (last_block->pprev->nStatus & BLOCK_HAVE_DATA)) {
+ assert((last_block->nStatus & status_mask) == status_mask); // 'upper_block' must satisfy the status mask
+ while (last_block->pprev && ((last_block->pprev->nStatus & status_mask) == status_mask)) {
if (lower_block) {
// Return if we reached the lower_block
if (last_block == lower_block) return lower_block;
@@ -616,7 +617,7 @@ const CBlockIndex* BlockManager::GetFirstStoredBlock(const CBlockIndex& upper_bl
bool BlockManager::CheckBlockDataAvailability(const CBlockIndex& upper_block, const CBlockIndex& lower_block)
{
if (!(upper_block.nStatus & BLOCK_HAVE_DATA)) return false;
- return GetFirstStoredBlock(upper_block, &lower_block) == &lower_block;
+ return GetFirstBlock(upper_block, BLOCK_HAVE_DATA, &lower_block) == &lower_block;
}
// If we're using -prune with -reindex, then delete block files that will be ignored by the
@@ -682,11 +683,7 @@ bool BlockManager::UndoWriteToDisk(const CBlockUndo& blockundo, FlatFilePos& pos
fileout << GetParams().MessageStart() << nSize;
// Write undo data
- long fileOutPos = ftell(fileout.Get());
- if (fileOutPos < 0) {
- LogError("%s: ftell failed\n", __func__);
- return false;
- }
+ long fileOutPos = fileout.tell();
pos.nPos = (unsigned int)fileOutPos;
fileout << blockundo;
@@ -703,15 +700,10 @@ bool BlockManager::UndoReadFromDisk(CBlockUndo& blockundo, const CBlockIndex& in
{
const FlatFilePos pos{WITH_LOCK(::cs_main, return index.GetUndoPos())};
- if (pos.IsNull()) {
- LogError("%s: no undo data available\n", __func__);
- return false;
- }
-
// Open history file to read
AutoFile filein{OpenUndoFile(pos, true)};
if (filein.IsNull()) {
- LogError("%s: OpenUndoFile failed\n", __func__);
+ LogError("%s: OpenUndoFile failed for %s\n", __func__, pos.ToString());
return false;
}
@@ -723,13 +715,13 @@ bool BlockManager::UndoReadFromDisk(CBlockUndo& blockundo, const CBlockIndex& in
verifier >> blockundo;
filein >> hashChecksum;
} catch (const std::exception& e) {
- LogError("%s: Deserialize or I/O error - %s\n", __func__, e.what());
+ LogError("%s: Deserialize or I/O error - %s at %s\n", __func__, e.what(), pos.ToString());
return false;
}
// Verify checksum
if (hashChecksum != verifier.GetHash()) {
- LogError("%s: Checksum mismatch\n", __func__);
+ LogError("%s: Checksum mismatch at %s\n", __func__, pos.ToString());
return false;
}
@@ -739,7 +731,7 @@ bool BlockManager::UndoReadFromDisk(CBlockUndo& blockundo, const CBlockIndex& in
bool BlockManager::FlushUndoFile(int block_file, bool finalize)
{
FlatFilePos undo_pos_old(block_file, m_blockfile_info[block_file].nUndoSize);
- if (!UndoFileSeq().Flush(undo_pos_old, finalize)) {
+ if (!m_undo_file_seq.Flush(undo_pos_old, finalize)) {
m_opts.notifications.flushError(_("Flushing undo file to disk failed. This is likely the result of an I/O error."));
return false;
}
@@ -761,7 +753,7 @@ bool BlockManager::FlushBlockFile(int blockfile_num, bool fFinalize, bool finali
assert(static_cast<int>(m_blockfile_info.size()) > blockfile_num);
FlatFilePos block_pos_old(blockfile_num, m_blockfile_info[blockfile_num].nSize);
- if (!BlockFileSeq().Flush(block_pos_old, fFinalize)) {
+ if (!m_block_file_seq.Flush(block_pos_old, fFinalize)) {
m_opts.notifications.flushError(_("Flushing block file to disk failed. This is likely the result of an I/O error."));
success = false;
}
@@ -813,38 +805,28 @@ void BlockManager::UnlinkPrunedFiles(const std::set<int>& setFilesToPrune) const
std::error_code ec;
for (std::set<int>::iterator it = setFilesToPrune.begin(); it != setFilesToPrune.end(); ++it) {
FlatFilePos pos(*it, 0);
- const bool removed_blockfile{fs::remove(BlockFileSeq().FileName(pos), ec)};
- const bool removed_undofile{fs::remove(UndoFileSeq().FileName(pos), ec)};
+ const bool removed_blockfile{fs::remove(m_block_file_seq.FileName(pos), ec)};
+ const bool removed_undofile{fs::remove(m_undo_file_seq.FileName(pos), ec)};
if (removed_blockfile || removed_undofile) {
- LogPrint(BCLog::BLOCKSTORAGE, "Prune: %s deleted blk/rev (%05u)\n", __func__, *it);
+ LogDebug(BCLog::BLOCKSTORAGE, "Prune: %s deleted blk/rev (%05u)\n", __func__, *it);
}
}
}
-FlatFileSeq BlockManager::BlockFileSeq() const
-{
- return FlatFileSeq(m_opts.blocks_dir, "blk", m_opts.fast_prune ? 0x4000 /* 16kb */ : BLOCKFILE_CHUNK_SIZE);
-}
-
-FlatFileSeq BlockManager::UndoFileSeq() const
-{
- return FlatFileSeq(m_opts.blocks_dir, "rev", UNDOFILE_CHUNK_SIZE);
-}
-
AutoFile BlockManager::OpenBlockFile(const FlatFilePos& pos, bool fReadOnly) const
{
- return AutoFile{BlockFileSeq().Open(pos, fReadOnly)};
+ return AutoFile{m_block_file_seq.Open(pos, fReadOnly), m_xor_key};
}
/** Open an undo file (rev?????.dat) */
AutoFile BlockManager::OpenUndoFile(const FlatFilePos& pos, bool fReadOnly) const
{
- return AutoFile{UndoFileSeq().Open(pos, fReadOnly)};
+ return AutoFile{m_undo_file_seq.Open(pos, fReadOnly), m_xor_key};
}
fs::path BlockManager::GetBlockPosFilename(const FlatFilePos& pos) const
{
- return BlockFileSeq().FileName(pos);
+ return m_block_file_seq.FileName(pos);
}
FlatFilePos BlockManager::FindNextBlockPos(unsigned int nAddSize, unsigned int nHeight, uint64_t nTime)
@@ -858,7 +840,7 @@ FlatFilePos BlockManager::FindNextBlockPos(unsigned int nAddSize, unsigned int n
assert(chain_type == BlockfileType::ASSUMED);
const auto new_cursor = BlockfileCursor{this->MaxBlockfileNum() + 1};
m_blockfile_cursors[chain_type] = new_cursor;
- LogPrint(BCLog::BLOCKSTORAGE, "[%s] initializing blockfile cursor to %s\n", chain_type, new_cursor);
+ LogDebug(BCLog::BLOCKSTORAGE, "[%s] initializing blockfile cursor to %s\n", chain_type, new_cursor);
}
const int last_blockfile = m_blockfile_cursors[chain_type]->file_num;
@@ -901,7 +883,7 @@ FlatFilePos BlockManager::FindNextBlockPos(unsigned int nAddSize, unsigned int n
pos.nPos = m_blockfile_info[nFile].nSize;
if (nFile != last_blockfile) {
- LogPrint(BCLog::BLOCKSTORAGE, "Leaving block file %i: %s (onto %i) (height %i)\n",
+ LogDebug(BCLog::BLOCKSTORAGE, "Leaving block file %i: %s (onto %i) (height %i)\n",
last_blockfile, m_blockfile_info[last_blockfile].ToString(), nFile, nHeight);
// Do not propagate the return code. The flush concerns a previous block
@@ -924,7 +906,7 @@ FlatFilePos BlockManager::FindNextBlockPos(unsigned int nAddSize, unsigned int n
m_blockfile_info[nFile].nSize += nAddSize;
bool out_of_space;
- size_t bytes_allocated = BlockFileSeq().Allocate(pos, nAddSize, out_of_space);
+ size_t bytes_allocated = m_block_file_seq.Allocate(pos, nAddSize, out_of_space);
if (out_of_space) {
m_opts.notifications.fatalError(_("Disk space is too low!"));
return {};
@@ -970,7 +952,7 @@ bool BlockManager::FindUndoPos(BlockValidationState& state, int nFile, FlatFileP
m_dirty_fileinfo.insert(nFile);
bool out_of_space;
- size_t bytes_allocated = UndoFileSeq().Allocate(pos, nAddSize, out_of_space);
+ size_t bytes_allocated = m_undo_file_seq.Allocate(pos, nAddSize, out_of_space);
if (out_of_space) {
return FatalError(m_opts.notifications, state, _("Disk space is too low!"));
}
@@ -986,7 +968,7 @@ bool BlockManager::WriteBlockToDisk(const CBlock& block, FlatFilePos& pos) const
// Open history file to append
AutoFile fileout{OpenBlockFile(pos)};
if (fileout.IsNull()) {
- LogError("WriteBlockToDisk: OpenBlockFile failed\n");
+ LogError("%s: OpenBlockFile failed\n", __func__);
return false;
}
@@ -995,11 +977,7 @@ bool BlockManager::WriteBlockToDisk(const CBlock& block, FlatFilePos& pos) const
fileout << GetParams().MessageStart() << nSize;
// Write block
- long fileOutPos = ftell(fileout.Get());
- if (fileOutPos < 0) {
- LogError("WriteBlockToDisk: ftell failed\n");
- return false;
- }
+ long fileOutPos = fileout.tell();
pos.nPos = (unsigned int)fileOutPos;
fileout << TX_WITH_WITNESS(block);
@@ -1016,7 +994,7 @@ bool BlockManager::WriteUndoDataForBlock(const CBlockUndo& blockundo, BlockValid
if (block.GetUndoPos().IsNull()) {
FlatFilePos _pos;
if (!FindUndoPos(state, block.nFile, _pos, ::GetSerializeSize(blockundo) + 40)) {
- LogError("ConnectBlock(): FindUndoPos failed\n");
+ LogError("%s: FindUndoPos failed\n", __func__);
return false;
}
if (!UndoWriteToDisk(blockundo, _pos, block.pprev->GetBlockHash())) {
@@ -1055,7 +1033,7 @@ bool BlockManager::ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos) cons
// Open history file to read
AutoFile filein{OpenBlockFile(pos, true)};
if (filein.IsNull()) {
- LogError("ReadBlockFromDisk: OpenBlockFile failed for %s\n", pos.ToString());
+ LogError("%s: OpenBlockFile failed for %s\n", __func__, pos.ToString());
return false;
}
@@ -1069,13 +1047,13 @@ bool BlockManager::ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos) cons
// Check the header
if (!CheckProofOfWork(block.GetHash(), block.nBits, GetConsensus())) {
- LogError("ReadBlockFromDisk: Errors in block header at %s\n", pos.ToString());
+ LogError("%s: Errors in block header at %s\n", __func__, pos.ToString());
return false;
}
// Signet only: check block solution
if (GetConsensus().signet_blocks && !CheckSignetBlockSolution(block, GetConsensus())) {
- LogError("ReadBlockFromDisk: Errors in block solution at %s\n", pos.ToString());
+ LogError("%s: Errors in block solution at %s\n", __func__, pos.ToString());
return false;
}
@@ -1090,8 +1068,7 @@ bool BlockManager::ReadBlockFromDisk(CBlock& block, const CBlockIndex& index) co
return false;
}
if (block.GetHash() != index.GetBlockHash()) {
- LogError("ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s\n",
- index.ToString(), block_pos.ToString());
+ LogError("%s: GetHash() doesn't match index for %s at %s\n", __func__, index.ToString(), block_pos.ToString());
return false;
}
return true;
@@ -1160,6 +1137,54 @@ FlatFilePos BlockManager::SaveBlockToDisk(const CBlock& block, int nHeight)
return blockPos;
}
+static auto InitBlocksdirXorKey(const BlockManager::Options& opts)
+{
+ // Bytes are serialized without length indicator, so this is also the exact
+ // size of the XOR-key file.
+ std::array<std::byte, 8> xor_key{};
+
+ if (opts.use_xor && fs::is_empty(opts.blocks_dir)) {
+ // Only use random fresh key when the boolean option is set and on the
+ // very first start of the program.
+ FastRandomContext{}.fillrand(xor_key);
+ }
+
+ const fs::path xor_key_path{opts.blocks_dir / "xor.dat"};
+ if (fs::exists(xor_key_path)) {
+ // A pre-existing xor key file has priority.
+ AutoFile xor_key_file{fsbridge::fopen(xor_key_path, "rb")};
+ xor_key_file >> xor_key;
+ } else {
+ // Create initial or missing xor key file
+ AutoFile xor_key_file{fsbridge::fopen(xor_key_path,
+#ifdef __MINGW64__
+ "wb" // Temporary workaround for https://github.com/bitcoin/bitcoin/issues/30210
+#else
+ "wbx"
+#endif
+ )};
+ xor_key_file << xor_key;
+ }
+ // If the user disabled the key, it must be zero.
+ if (!opts.use_xor && xor_key != decltype(xor_key){}) {
+ throw std::runtime_error{
+ strprintf("The blocksdir XOR-key can not be disabled when a random key was already stored! "
+ "Stored key: '%s', stored path: '%s'.",
+ HexStr(xor_key), fs::PathToString(xor_key_path)),
+ };
+ }
+ LogInfo("Using obfuscation key for blocksdir *.dat files (%s): '%s'\n", fs::PathToString(opts.blocks_dir), HexStr(xor_key));
+ return std::vector<std::byte>{xor_key.begin(), xor_key.end()};
+}
+
+BlockManager::BlockManager(const util::SignalInterrupt& interrupt, Options opts)
+ : m_prune_mode{opts.prune_target > 0},
+ m_xor_key{InitBlocksdirXorKey(opts)},
+ m_opts{std::move(opts)},
+ m_block_file_seq{FlatFileSeq{m_opts.blocks_dir, "blk", m_opts.fast_prune ? 0x4000 /* 16kB */ : BLOCKFILE_CHUNK_SIZE}},
+ m_undo_file_seq{FlatFileSeq{m_opts.blocks_dir, "rev", UNDOFILE_CHUNK_SIZE}},
+ m_interrupt{interrupt} {}
+
class ImportingNow
{
std::atomic<bool>& m_importing;
@@ -1177,7 +1202,7 @@ public:
}
};
-void ImportBlocks(ChainstateManager& chainman, std::vector<fs::path> vImportFiles)
+void ImportBlocks(ChainstateManager& chainman, std::span<const fs::path> import_paths)
{
ImportingNow imp{chainman.m_blockman.m_importing};
@@ -1212,7 +1237,7 @@ void ImportBlocks(ChainstateManager& chainman, std::vector<fs::path> vImportFile
}
// -loadblock=
- for (const fs::path& path : vImportFiles) {
+ for (const fs::path& path : import_paths) {
AutoFile file{fsbridge::fopen(path, "rb")};
if (!file.IsNull()) {
LogPrintf("Importing blocks file %s...\n", fs::PathToString(path));
diff --git a/src/node/blockstorage.h b/src/node/blockstorage.h
index 108a08a72b..03bc5f4600 100644
--- a/src/node/blockstorage.h
+++ b/src/node/blockstorage.h
@@ -29,6 +29,7 @@
#include <memory>
#include <optional>
#include <set>
+#include <span>
#include <string>
#include <unordered_map>
#include <utility>
@@ -166,9 +167,6 @@ private:
[[nodiscard]] bool FlushChainstateBlockFile(int tip_height);
bool FindUndoPos(BlockValidationState& state, int nFile, FlatFilePos& pos, unsigned int nAddSize);
- FlatFileSeq BlockFileSeq() const;
- FlatFileSeq UndoFileSeq() const;
-
AutoFile OpenUndoFile(const FlatFilePos& pos, bool fReadOnly = false) const;
/**
@@ -243,6 +241,8 @@ private:
const bool m_prune_mode;
+ const std::vector<std::byte> m_xor_key;
+
/** Dirty block index entries. */
std::set<CBlockIndex*> m_dirty_blockindex;
@@ -261,13 +261,13 @@ private:
const kernel::BlockManagerOpts m_opts;
+ const FlatFileSeq m_block_file_seq;
+ const FlatFileSeq m_undo_file_seq;
+
public:
using Options = kernel::BlockManagerOpts;
- explicit BlockManager(const util::SignalInterrupt& interrupt, Options opts)
- : m_prune_mode{opts.prune_target > 0},
- m_opts{std::move(opts)},
- m_interrupt{interrupt} {}
+ explicit BlockManager(const util::SignalInterrupt& interrupt, Options opts);
const util::SignalInterrupt& m_interrupt;
std::atomic<bool> m_importing{false};
@@ -372,16 +372,39 @@ public:
//! (part of the same chain).
bool CheckBlockDataAvailability(const CBlockIndex& upper_block LIFETIMEBOUND, const CBlockIndex& lower_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
- //! Find the first stored ancestor of start_block immediately after the last
- //! pruned ancestor. Return value will never be null. Caller is responsible
- //! for ensuring that start_block has data is not pruned.
- const CBlockIndex* GetFirstStoredBlock(const CBlockIndex& start_block LIFETIMEBOUND, const CBlockIndex* lower_block=nullptr) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
+ /**
+ * @brief Returns the earliest block with specified `status_mask` flags set after
+ * the latest block _not_ having those flags.
+ *
+ * This function starts from `upper_block`, which must have all
+ * `status_mask` flags set, and iterates backwards through its ancestors. It
+ * continues as long as each block has all `status_mask` flags set, until
+ * reaching the oldest ancestor or `lower_block`.
+ *
+ * @pre `upper_block` must have all `status_mask` flags set.
+ * @pre `lower_block` must be null or an ancestor of `upper_block`
+ *
+ * @param upper_block The starting block for the search, which must have all
+ * `status_mask` flags set.
+ * @param status_mask Bitmask specifying required status flags.
+ * @param lower_block The earliest possible block to return. If null, the
+ * search can extend to the genesis block.
+ *
+ * @return A non-null pointer to the earliest block between `upper_block`
+ * and `lower_block`, inclusive, such that every block between the
+ * returned block and `upper_block` has `status_mask` flags set.
+ */
+ const CBlockIndex* GetFirstBlock(
+ const CBlockIndex& upper_block LIFETIMEBOUND,
+ uint32_t status_mask,
+ const CBlockIndex* lower_block = nullptr
+ ) const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
/** True if any block files have ever been pruned. */
bool m_have_pruned = false;
//! Check whether the block associated with this index entry is pruned or not.
- bool IsBlockPruned(const CBlockIndex& block) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
+ bool IsBlockPruned(const CBlockIndex& block) const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
//! Create or update a prune lock identified by its name
void UpdatePruneLock(const std::string& name, const PruneLockInfo& lock_info) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
@@ -407,7 +430,7 @@ public:
void CleanupBlockRevFiles() const;
};
-void ImportBlocks(ChainstateManager& chainman, std::vector<fs::path> vImportFiles);
+void ImportBlocks(ChainstateManager& chainman, std::span<const fs::path> import_paths);
} // namespace node
#endif // BITCOIN_NODE_BLOCKSTORAGE_H
diff --git a/src/node/caches.cpp b/src/node/caches.cpp
index 7403f7ddea..dc4d98f592 100644
--- a/src/node/caches.cpp
+++ b/src/node/caches.cpp
@@ -13,7 +13,6 @@ CacheSizes CalculateCacheSizes(const ArgsManager& args, size_t n_indexes)
{
int64_t nTotalCache = (args.GetIntArg("-dbcache", nDefaultDbCache) << 20);
nTotalCache = std::max(nTotalCache, nMinDbCache << 20); // total cache cannot be less than nMinDbCache
- nTotalCache = std::min(nTotalCache, nMaxDbCache << 20); // total cache cannot be greater than nMaxDbcache
CacheSizes sizes;
sizes.block_tree_db = std::min(nTotalCache / 8, nMaxBlockDBCache << 20);
nTotalCache -= sizes.block_tree_db;
diff --git a/src/node/chainstatemanager_args.cpp b/src/node/chainstatemanager_args.cpp
index bc4a815a3e..b86d0b2991 100644
--- a/src/node/chainstatemanager_args.cpp
+++ b/src/node/chainstatemanager_args.cpp
@@ -32,13 +32,20 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& args, ChainstateManage
if (auto value{args.GetBoolArg("-checkpoints")}) opts.checkpoints_enabled = *value;
if (auto value{args.GetArg("-minimumchainwork")}) {
- if (!IsHexNumber(*value)) {
- return util::Error{strprintf(Untranslated("Invalid non-hex (%s) minimum chain work value specified"), *value)};
+ if (auto min_work{uint256::FromUserHex(*value)}) {
+ opts.minimum_chain_work = UintToArith256(*min_work);
+ } else {
+ return util::Error{strprintf(Untranslated("Invalid minimum work specified (%s), must be up to %d hex digits"), *value, uint256::size() * 2)};
}
- opts.minimum_chain_work = UintToArith256(uint256S(*value));
}
- if (auto value{args.GetArg("-assumevalid")}) opts.assumed_valid_block = uint256S(*value);
+ if (auto value{args.GetArg("-assumevalid")}) {
+ if (auto block_hash{uint256::FromUserHex(*value)}) {
+ opts.assumed_valid_block = *block_hash;
+ } else {
+ return util::Error{strprintf(Untranslated("Invalid assumevalid block hash specified (%s), must be up to %d hex digits (or 0 to disable)"), *value, uint256::size() * 2)};
+ }
+ }
if (auto value{args.GetIntArg("-maxtipage")}) opts.max_tip_age = std::chrono::seconds{*value};
@@ -56,6 +63,16 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& args, ChainstateManage
opts.worker_threads_num = std::clamp(script_threads - 1, 0, MAX_SCRIPTCHECK_THREADS);
LogPrintf("Script verification uses %d additional threads\n", opts.worker_threads_num);
+ if (auto max_size = args.GetIntArg("-maxsigcachesize")) {
+ // 1. When supplied with a max_size of 0, both the signature cache and
+ // script execution cache create the minimum possible cache (2
+ // elements). Therefore, we can use 0 as a floor here.
+ // 2. Multiply first, divide after to avoid integer truncation.
+ size_t clamped_size_each = std::max<int64_t>(*max_size, 0) * (1 << 20) / 2;
+ opts.script_execution_cache_bytes = clamped_size_each;
+ opts.signature_cache_bytes = clamped_size_each;
+ }
+
return {};
}
} // namespace node
diff --git a/src/node/context.h b/src/node/context.h
index a664fad80b..398089ff3c 100644
--- a/src/node/context.h
+++ b/src/node/context.h
@@ -9,6 +9,7 @@
#include <cstdlib>
#include <functional>
#include <memory>
+#include <thread>
#include <vector>
class ArgsManager;
@@ -86,6 +87,7 @@ struct NodeContext {
std::atomic<int> exit_status{EXIT_SUCCESS};
//! Manages all the node warnings
std::unique_ptr<node::Warnings> warnings;
+ std::thread background_init_thread;
//! Declare default constructor and destructor that are not inline, so code
//! instantiating the NodeContext struct doesn't need to #include class
diff --git a/src/node/interface_ui.h b/src/node/interface_ui.h
index 22c241cb78..85c34f5834 100644
--- a/src/node/interface_ui.h
+++ b/src/node/interface_ui.h
@@ -6,9 +6,10 @@
#ifndef BITCOIN_NODE_INTERFACE_UI_H
#define BITCOIN_NODE_INTERFACE_UI_H
+#include <cstdint>
#include <functional>
-#include <memory>
#include <string>
+#include <vector>
class CBlockIndex;
enum class SynchronizationState;
diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp
index fa151407fa..febd968313 100644
--- a/src/node/interfaces.cpp
+++ b/src/node/interfaces.cpp
@@ -17,6 +17,7 @@
#include <interfaces/handler.h>
#include <interfaces/mining.h>
#include <interfaces/node.h>
+#include <interfaces/types.h>
#include <interfaces/wallet.h>
#include <kernel/chain.h>
#include <kernel/context.h>
@@ -33,6 +34,7 @@
#include <node/interface_ui.h>
#include <node/mini_miner.h>
#include <node/miner.h>
+#include <node/kernel_notifications.h>
#include <node/transaction.h>
#include <node/types.h>
#include <node/warnings.h>
@@ -67,6 +69,8 @@
#include <boost/signals2/signal.hpp>
+using interfaces::BlockRef;
+using interfaces::BlockTemplate;
using interfaces::BlockTip;
using interfaces::Chain;
using interfaces::FoundBlock;
@@ -100,7 +104,7 @@ public:
void initParameterInteraction() override { InitParameterInteraction(args()); }
bilingual_str getWarnings() override { return Join(Assert(m_context->warnings)->GetMessages(), Untranslated("<hr />")); }
int getExitStatus() override { return Assert(m_context)->exit_status.load(); }
- uint32_t getLogCategories() override { return LogInstance().GetCategoryMask(); }
+ BCLog::CategoryMask getLogCategories() override { return LogInstance().GetCategoryMask(); }
bool baseInitialize() override
{
if (!AppInitBasicSetup(args(), Assert(context())->exit_status)) return false;
@@ -136,7 +140,7 @@ public:
// Stop RPC for clean shutdown if any of waitfor* commands is executed.
if (args().GetBoolArg("-server", false)) {
InterruptRPC();
- StopRPC();
+ StopRPC(m_context);
}
}
bool shutdownRequested() override { return ShutdownRequested(*Assert(m_context)); };
@@ -180,7 +184,7 @@ public:
});
args().WriteSettingsFile();
}
- void mapPort(bool use_upnp, bool use_natpmp) override { StartMapPort(use_upnp, use_natpmp); }
+ void mapPort(bool use_upnp, bool use_pcp) override { StartMapPort(use_upnp, use_pcp); }
bool getProxy(Network net, Proxy& proxy_info) override { return GetProxy(net, proxy_info); }
size_t getNodeCount(ConnectionDirection flags) override
{
@@ -278,6 +282,7 @@ public:
int64_t getTotalBytesSent() override { return m_context->connman ? m_context->connman->GetTotalBytesSent() : 0; }
size_t getMempoolSize() override { return m_context->mempool ? m_context->mempool->size() : 0; }
size_t getMempoolDynamicUsage() override { return m_context->mempool ? m_context->mempool->DynamicMemoryUsage() : 0; }
+ size_t getMempoolMaxUsage() override { return m_context->mempool ? m_context->mempool->m_opts.max_size_bytes : 0; }
bool getHeaderTip(int& height, int64_t& block_time) override
{
LOCK(::cs_main);
@@ -289,6 +294,13 @@ public:
}
return false;
}
+ std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses() override
+ {
+ if (m_context->connman)
+ return m_context->connman->getNetLocalAddresses();
+ else
+ return {};
+ }
int getNumBlocks() override
{
LOCK(::cs_main);
@@ -806,16 +818,34 @@ public:
});
return result;
}
- bool updateRwSetting(const std::string& name, const common::SettingsValue& value, bool write) override
+ bool updateRwSetting(const std::string& name,
+ const interfaces::SettingsUpdate& update_settings_func) override
{
+ std::optional<interfaces::SettingsAction> action;
args().LockSettings([&](common::Settings& settings) {
- if (value.isNull()) {
- settings.rw_settings.erase(name);
+ if (auto* value = common::FindKey(settings.rw_settings, name)) {
+ action = update_settings_func(*value);
+ if (value->isNull()) settings.rw_settings.erase(name);
} else {
- settings.rw_settings[name] = value;
+ UniValue new_value;
+ action = update_settings_func(new_value);
+ if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
}
});
- return !write || args().WriteSettingsFile();
+ if (!action) return false;
+ // Now dump value to disk if requested
+ return *action != interfaces::SettingsAction::WRITE || args().WriteSettingsFile();
+ }
+ bool overwriteRwSetting(const std::string& name, common::SettingsValue value, interfaces::SettingsAction action) override
+ {
+ return updateRwSetting(name, [&](common::SettingsValue& settings) {
+ settings = std::move(value);
+ return action;
+ });
+ }
+ bool deleteRwSettings(const std::string& name, interfaces::SettingsAction action) override
+ {
+ return overwriteRwSetting(name, {}, action);
}
void requestMempoolTransactions(Notifications& notifications) override
{
@@ -837,6 +867,52 @@ public:
NodeContext& m_node;
};
+class BlockTemplateImpl : public BlockTemplate
+{
+public:
+ explicit BlockTemplateImpl(std::unique_ptr<CBlockTemplate> block_template) : m_block_template(std::move(block_template))
+ {
+ assert(m_block_template);
+ }
+
+ CBlockHeader getBlockHeader() override
+ {
+ return m_block_template->block;
+ }
+
+ CBlock getBlock() override
+ {
+ return m_block_template->block;
+ }
+
+ std::vector<CAmount> getTxFees() override
+ {
+ return m_block_template->vTxFees;
+ }
+
+ std::vector<int64_t> getTxSigops() override
+ {
+ return m_block_template->vTxSigOpsCost;
+ }
+
+ CTransactionRef getCoinbaseTx() override
+ {
+ return m_block_template->block.vtx[0];
+ }
+
+ std::vector<unsigned char> getCoinbaseCommitment() override
+ {
+ return m_block_template->vchCoinbaseCommitment;
+ }
+
+ int getWitnessCommitmentIndex() override
+ {
+ return GetWitnessCommitmentIndex(m_block_template->block);
+ }
+
+ const std::unique_ptr<CBlockTemplate> m_block_template;
+};
+
class MinerImpl : public Mining
{
public:
@@ -852,12 +928,33 @@ public:
return chainman().IsInitialBlockDownload();
}
- std::optional<uint256> getTipHash() override
+ std::optional<BlockRef> getTip() override
{
LOCK(::cs_main);
CBlockIndex* tip{chainman().ActiveChain().Tip()};
if (!tip) return {};
- return tip->GetBlockHash();
+ return BlockRef{tip->GetBlockHash(), tip->nHeight};
+ }
+
+ BlockRef waitTipChanged(uint256 current_tip, MillisecondsDouble timeout) override
+ {
+ // Interrupt check interval
+ const MillisecondsDouble tick{1000};
+ auto now{std::chrono::steady_clock::now()};
+ auto deadline = now + timeout;
+ // std::chrono does not check against overflow
+ if (deadline < now) deadline = std::chrono::steady_clock::time_point::max();
+ {
+ WAIT_LOCK(notifications().m_tip_block_mutex, lock);
+ while ((notifications().m_tip_block == uint256() || notifications().m_tip_block == current_tip) && !chainman().m_interrupt) {
+ now = std::chrono::steady_clock::now();
+ if (now >= deadline) break;
+ notifications().m_tip_block_cv.wait_until(lock, std::min(deadline, now + tick));
+ }
+ }
+ // Must release m_tip_block_mutex before locking cs_main, to avoid deadlocks.
+ LOCK(::cs_main);
+ return BlockRef{chainman().ActiveChain().Tip()->GetBlockHash(), chainman().ActiveChain().Tip()->nHeight};
}
bool processNewBlock(const std::shared_ptr<const CBlock>& block, bool* new_block) override
@@ -883,16 +980,16 @@ public:
return TestBlockValidity(state, chainman().GetParams(), chainman().ActiveChainstate(), block, tip, /*fCheckPOW=*/false, check_merkle_root);
}
- std::unique_ptr<CBlockTemplate> createNewBlock(const CScript& script_pub_key, bool use_mempool) override
+ std::unique_ptr<BlockTemplate> createNewBlock(const CScript& script_pub_key, const BlockCreateOptions& options) override
{
- BlockAssembler::Options options;
- ApplyArgsManOptions(gArgs, options);
-
- return BlockAssembler{chainman().ActiveChainstate(), use_mempool ? context()->mempool.get() : nullptr, options}.CreateNewBlock(script_pub_key);
+ BlockAssembler::Options assemble_options{options};
+ ApplyArgsManOptions(*Assert(m_node.args), assemble_options);
+ return std::make_unique<BlockTemplateImpl>(BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(script_pub_key));
}
NodeContext* context() override { return &m_node; }
ChainstateManager& chainman() { return *Assert(m_node.chainman); }
+ KernelNotifications& notifications() { return *Assert(m_node.notifications); }
NodeContext& m_node;
};
} // namespace
diff --git a/src/node/kernel_notifications.cpp b/src/node/kernel_notifications.cpp
index 9894052a3a..40d45c8c2b 100644
--- a/src/node/kernel_notifications.cpp
+++ b/src/node/kernel_notifications.cpp
@@ -50,6 +50,12 @@ namespace node {
kernel::InterruptResult KernelNotifications::blockTip(SynchronizationState state, CBlockIndex& index)
{
+ {
+ LOCK(m_tip_block_mutex);
+ m_tip_block = index.GetBlockHash();
+ m_tip_block_cv.notify_all();
+ }
+
uiInterface.NotifyBlockTip(state, &index);
if (m_stop_at_height && index.nHeight >= m_stop_at_height) {
if (!m_shutdown()) {
diff --git a/src/node/kernel_notifications.h b/src/node/kernel_notifications.h
index e37f4d4e1e..9ff980ea56 100644
--- a/src/node/kernel_notifications.h
+++ b/src/node/kernel_notifications.h
@@ -7,6 +7,10 @@
#include <kernel/notifications_interface.h>
+#include <sync.h>
+#include <threadsafety.h>
+#include <uint256.h>
+
#include <atomic>
#include <cstdint>
@@ -34,7 +38,7 @@ public:
KernelNotifications(util::SignalInterrupt& shutdown, std::atomic<int>& exit_status, node::Warnings& warnings)
: m_shutdown(shutdown), m_exit_status{exit_status}, m_warnings{warnings} {}
- [[nodiscard]] kernel::InterruptResult blockTip(SynchronizationState state, CBlockIndex& index) override;
+ [[nodiscard]] kernel::InterruptResult blockTip(SynchronizationState state, CBlockIndex& index) override EXCLUSIVE_LOCKS_REQUIRED(!m_tip_block_mutex);
void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync) override;
@@ -52,6 +56,12 @@ public:
int m_stop_at_height{DEFAULT_STOPATHEIGHT};
//! Useful for tests, can be set to false to avoid shutdown on fatal error.
bool m_shutdown_on_fatal_error{true};
+
+ Mutex m_tip_block_mutex;
+ std::condition_variable m_tip_block_cv;
+ //! The block for which the last blockTip notification was received for.
+ uint256 m_tip_block;
+
private:
util::SignalInterrupt& m_shutdown;
std::atomic<int>& m_exit_status;
diff --git a/src/node/mempool_args.cpp b/src/node/mempool_args.cpp
index f329affb1d..a488c1b149 100644
--- a/src/node/mempool_args.cpp
+++ b/src/node/mempool_args.cpp
@@ -93,6 +93,9 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& argsman, const CChainP
}
mempool_opts.full_rbf = argsman.GetBoolArg("-mempoolfullrbf", mempool_opts.full_rbf);
+ if (!mempool_opts.full_rbf) {
+ LogInfo("Warning: mempoolfullrbf=0 set but deprecated and will be removed in a future release\n");
+ }
mempool_opts.persist_v1_dat = argsman.GetBoolArg("-persistmempoolv1", mempool_opts.persist_v1_dat);
diff --git a/src/kernel/mempool_persist.cpp b/src/node/mempool_persist.cpp
index 53028a45ae..ff7de8c64a 100644
--- a/src/kernel/mempool_persist.cpp
+++ b/src/node/mempool_persist.cpp
@@ -2,7 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <kernel/mempool_persist.h>
+#include <node/mempool_persist.h>
#include <clientversion.h>
#include <consensus/amount.h>
@@ -33,7 +33,7 @@
using fsbridge::FopenFn;
-namespace kernel {
+namespace node {
static const uint64_t MEMPOOL_DUMP_VERSION_NO_XOR_KEY{1};
static const uint64_t MEMPOOL_DUMP_VERSION{2};
@@ -199,8 +199,8 @@ bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path, FopenFn mock
LogInfo("Writing %d unbroadcast transactions to file.\n", unbroadcast_txids.size());
file << unbroadcast_txids;
- if (!skip_file_commit && !FileCommit(file.Get()))
- throw std::runtime_error("FileCommit failed");
+ if (!skip_file_commit && !file.Commit())
+ throw std::runtime_error("Commit failed");
file.fclose();
if (!RenameOver(dump_path + ".new", dump_path)) {
throw std::runtime_error("Rename failed");
@@ -218,4 +218,4 @@ bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path, FopenFn mock
return true;
}
-} // namespace kernel
+} // namespace node
diff --git a/src/kernel/mempool_persist.h b/src/node/mempool_persist.h
index e124a8eadf..7c5754a90c 100644
--- a/src/kernel/mempool_persist.h
+++ b/src/node/mempool_persist.h
@@ -2,15 +2,15 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_KERNEL_MEMPOOL_PERSIST_H
-#define BITCOIN_KERNEL_MEMPOOL_PERSIST_H
+#ifndef BITCOIN_NODE_MEMPOOL_PERSIST_H
+#define BITCOIN_NODE_MEMPOOL_PERSIST_H
#include <util/fs.h>
class Chainstate;
class CTxMemPool;
-namespace kernel {
+namespace node {
/** Dump the mempool to a file. */
bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path,
@@ -28,7 +28,7 @@ bool LoadMempool(CTxMemPool& pool, const fs::path& load_path,
Chainstate& active_chainstate,
ImportMempoolOptions&& opts);
-} // namespace kernel
+} // namespace node
-#endif // BITCOIN_KERNEL_MEMPOOL_PERSIST_H
+#endif // BITCOIN_NODE_MEMPOOL_PERSIST_H
diff --git a/src/node/miner.cpp b/src/node/miner.cpp
index 03c6d74deb..181ae2ef05 100644
--- a/src/node/miner.cpp
+++ b/src/node/miner.cpp
@@ -33,6 +33,14 @@ int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParam
int64_t nOldTime = pblock->nTime;
int64_t nNewTime{std::max<int64_t>(pindexPrev->GetMedianTimePast() + 1, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now()))};
+ if (consensusParams.enforce_BIP94) {
+ // Height of block to be mined.
+ const int height{pindexPrev->nHeight + 1};
+ if (height % consensusParams.DifficultyAdjustmentInterval() == 0) {
+ nNewTime = std::max<int64_t>(nNewTime, pindexPrev->GetBlockTime() - MAX_TIMEWARP);
+ }
+ }
+
if (nOldTime < nNewTime) {
pblock->nTime = nNewTime;
}
@@ -59,14 +67,17 @@ void RegenerateCommitments(CBlock& block, ChainstateManager& chainman)
static BlockAssembler::Options ClampOptions(BlockAssembler::Options options)
{
- // Limit weight to between 4K and DEFAULT_BLOCK_MAX_WEIGHT for sanity:
- options.nBlockMaxWeight = std::clamp<size_t>(options.nBlockMaxWeight, 4000, DEFAULT_BLOCK_MAX_WEIGHT);
+ Assert(options.coinbase_max_additional_weight <= DEFAULT_BLOCK_MAX_WEIGHT);
+ Assert(options.coinbase_output_max_additional_sigops <= MAX_BLOCK_SIGOPS_COST);
+ // Limit weight to between coinbase_max_additional_weight and DEFAULT_BLOCK_MAX_WEIGHT for sanity:
+ // Coinbase (reserved) outputs can safely exceed -blockmaxweight, but the rest of the block template will be empty.
+ options.nBlockMaxWeight = std::clamp<size_t>(options.nBlockMaxWeight, options.coinbase_max_additional_weight, DEFAULT_BLOCK_MAX_WEIGHT);
return options;
}
BlockAssembler::BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options)
: chainparams{chainstate.m_chainman.GetParams()},
- m_mempool{mempool},
+ m_mempool{options.use_mempool ? mempool : nullptr},
m_chainstate{chainstate},
m_options{ClampOptions(options)}
{
@@ -79,6 +90,7 @@ void ApplyArgsManOptions(const ArgsManager& args, BlockAssembler::Options& optio
if (const auto blockmintxfee{args.GetArg("-blockmintxfee")}) {
if (const auto parsed{ParseMoney(*blockmintxfee)}) options.blockMinFeeRate = CFeeRate{*parsed};
}
+ options.print_modified_fee = args.GetBoolArg("-printpriority", options.print_modified_fee);
}
void BlockAssembler::resetBlock()
@@ -86,8 +98,8 @@ void BlockAssembler::resetBlock()
inBlock.clear();
// Reserve space for coinbase tx
- nBlockWeight = 4000;
- nBlockSigOpsCost = 400;
+ nBlockWeight = m_options.coinbase_max_additional_weight;
+ nBlockSigOpsCost = m_options.coinbase_output_max_additional_sigops;
// These counters do not include coinbase tx
nBlockTx = 0;
@@ -101,10 +113,6 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
resetBlock();
pblocktemplate.reset(new CBlockTemplate());
-
- if (!pblocktemplate.get()) {
- return nullptr;
- }
CBlock* const pblock = &pblocktemplate->block; // pointer for convenience
// Add dummy coinbase tx as first transaction
@@ -167,7 +175,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
}
const auto time_2{SteadyClock::now()};
- LogPrint(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n",
+ LogDebug(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n",
Ticks<MillisecondsDouble>(time_1 - time_start), nPackagesSelected, nDescendantsUpdated,
Ticks<MillisecondsDouble>(time_2 - time_1),
Ticks<MillisecondsDouble>(time_2 - time_start));
@@ -222,8 +230,7 @@ void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
nFees += iter->GetFee();
inBlock.insert(iter->GetSharedTx()->GetHash());
- bool fPrintPriority = gArgs.GetBoolArg("-printpriority", DEFAULT_PRINTPRIORITY);
- if (fPrintPriority) {
+ if (m_options.print_modified_fee) {
LogPrintf("fee rate %s txid %s\n",
CFeeRate(iter->GetModifiedFee(), iter->GetTxSize()).ToString(),
iter->GetTx().GetHash().ToString());
@@ -379,7 +386,7 @@ void BlockAssembler::addPackageTxs(const CTxMemPool& mempool, int& nPackagesSele
++nConsecutiveFailed;
if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight >
- m_options.nBlockMaxWeight - 4000) {
+ m_options.nBlockMaxWeight - m_options.coinbase_max_additional_weight) {
// Give up if we're close to full and haven't succeeded in a while
break;
}
diff --git a/src/node/miner.h b/src/node/miner.h
index c3178a7532..1b82943766 100644
--- a/src/node/miner.h
+++ b/src/node/miner.h
@@ -6,6 +6,7 @@
#ifndef BITCOIN_NODE_MINER_H
#define BITCOIN_NODE_MINER_H
+#include <node/types.h>
#include <policy/policy.h>
#include <primitives/block.h>
#include <txmempool.h>
@@ -30,7 +31,7 @@ class ChainstateManager;
namespace Consensus { struct Params; };
namespace node {
-static const bool DEFAULT_PRINTPRIORITY = false;
+static const bool DEFAULT_PRINT_MODIFIED_FEE = false;
struct CBlockTemplate
{
@@ -96,21 +97,25 @@ struct CompareTxIterByAncestorCount {
}
};
+
+struct CTxMemPoolModifiedEntry_Indices final : boost::multi_index::indexed_by<
+ boost::multi_index::ordered_unique<
+ modifiedentry_iter,
+ CompareCTxMemPoolIter
+ >,
+ // sorted by modified ancestor fee rate
+ boost::multi_index::ordered_non_unique<
+ // Reuse same tag from CTxMemPool's similar index
+ boost::multi_index::tag<ancestor_score>,
+ boost::multi_index::identity<CTxMemPoolModifiedEntry>,
+ CompareTxMemPoolEntryByAncestorFee
+ >
+>
+{};
+
typedef boost::multi_index_container<
CTxMemPoolModifiedEntry,
- boost::multi_index::indexed_by<
- boost::multi_index::ordered_unique<
- modifiedentry_iter,
- CompareCTxMemPoolIter
- >,
- // sorted by modified ancestor fee rate
- boost::multi_index::ordered_non_unique<
- // Reuse same tag from CTxMemPool's similar index
- boost::multi_index::tag<ancestor_score>,
- boost::multi_index::identity<CTxMemPoolModifiedEntry>,
- CompareTxMemPoolEntryByAncestorFee
- >
- >
+ CTxMemPoolModifiedEntry_Indices
> indexed_modified_transaction_set;
typedef indexed_modified_transaction_set::nth_index<0>::type::iterator modtxiter;
@@ -153,12 +158,13 @@ private:
Chainstate& m_chainstate;
public:
- struct Options {
+ struct Options : BlockCreateOptions {
// Configuration parameters for the block size
size_t nBlockMaxWeight{DEFAULT_BLOCK_MAX_WEIGHT};
CFeeRate blockMinFeeRate{DEFAULT_BLOCK_MIN_TX_FEE};
// Whether to call TestBlockValidity() at the end of CreateNewBlock().
bool test_block_validity{true};
+ bool print_modified_fee{DEFAULT_PRINT_MODIFIED_FEE};
};
explicit BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options);
diff --git a/src/node/mini_miner.cpp b/src/node/mini_miner.cpp
index 58422c4439..d7d15554b3 100644
--- a/src/node/mini_miner.cpp
+++ b/src/node/mini_miner.cpp
@@ -174,7 +174,7 @@ MiniMiner::MiniMiner(const std::vector<MiniMinerMempoolEntry>& manual_entries,
SanityCheck();
}
-// Compare by min(ancestor feerate, individual feerate), then iterator
+// Compare by min(ancestor feerate, individual feerate), then txid
//
// Under the ancestor-based mining approach, high-feerate children can pay for parents, but high-feerate
// parents do not incentive inclusion of their children. Therefore the mining algorithm only considers
@@ -183,21 +183,13 @@ struct AncestorFeerateComparator
{
template<typename I>
bool operator()(const I& a, const I& b) const {
- auto min_feerate = [](const MiniMinerMempoolEntry& e) -> CFeeRate {
- const CAmount ancestor_fee{e.GetModFeesWithAncestors()};
- const int64_t ancestor_size{e.GetSizeWithAncestors()};
- const CAmount tx_fee{e.GetModifiedFee()};
- const int64_t tx_size{e.GetTxSize()};
- // Comparing ancestor feerate with individual feerate:
- // ancestor_fee / ancestor_size <= tx_fee / tx_size
- // Avoid division and possible loss of precision by
- // multiplying both sides by the sizes:
- return ancestor_fee * tx_size < tx_fee * ancestor_size ?
- CFeeRate(ancestor_fee, ancestor_size) :
- CFeeRate(tx_fee, tx_size);
+ auto min_feerate = [](const MiniMinerMempoolEntry& e) -> FeeFrac {
+ FeeFrac self_feerate(e.GetModifiedFee(), e.GetTxSize());
+ FeeFrac ancestor_feerate(e.GetModFeesWithAncestors(), e.GetSizeWithAncestors());
+ return std::min(ancestor_feerate, self_feerate);
};
- CFeeRate a_feerate{min_feerate(a->second)};
- CFeeRate b_feerate{min_feerate(b->second)};
+ FeeFrac a_feerate{min_feerate(a->second)};
+ FeeFrac b_feerate{min_feerate(b->second)};
if (a_feerate != b_feerate) {
return a_feerate > b_feerate;
}
diff --git a/src/node/transaction.cpp b/src/node/transaction.cpp
index 591dcd698d..0f45da45db 100644
--- a/src/node/transaction.cpp
+++ b/src/node/transaction.cpp
@@ -55,7 +55,7 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
const Coin& existingCoin = view.AccessCoin(COutPoint(txid, o));
// IsSpent doesn't mean the coin is spent, it means the output doesn't exist.
// So if the output does exist, then this transaction exists in the chain.
- if (!existingCoin.IsSpent()) return TransactionError::ALREADY_IN_CHAIN;
+ if (!existingCoin.IsSpent()) return TransactionError::ALREADY_IN_UTXO_SET;
}
if (auto mempool_tx = node.mempool->get(txid); mempool_tx) {
diff --git a/src/node/txreconciliation.cpp b/src/node/txreconciliation.cpp
index d62046daaa..e6e19c5756 100644
--- a/src/node/txreconciliation.cpp
+++ b/src/node/txreconciliation.cpp
@@ -85,7 +85,7 @@ public:
LOCK(m_txreconciliation_mutex);
LogPrintLevel(BCLog::TXRECONCILIATION, BCLog::Level::Debug, "Pre-register peer=%d\n", peer_id);
- const uint64_t local_salt{GetRand(UINT64_MAX)};
+ const uint64_t local_salt{FastRandomContext().rand64()};
// We do this exactly once per peer (which are unique by NodeId, see GetNewNodeId) so it's
// safe to assume we don't have this record yet.
diff --git a/src/node/types.h b/src/node/types.h
index 0461e85f43..1302f1b127 100644
--- a/src/node/types.h
+++ b/src/node/types.h
@@ -13,17 +13,37 @@
#ifndef BITCOIN_NODE_TYPES_H
#define BITCOIN_NODE_TYPES_H
+#include <cstddef>
+
namespace node {
enum class TransactionError {
OK, //!< No error
MISSING_INPUTS,
- ALREADY_IN_CHAIN,
+ ALREADY_IN_UTXO_SET,
MEMPOOL_REJECTED,
MEMPOOL_ERROR,
MAX_FEE_EXCEEDED,
MAX_BURN_EXCEEDED,
INVALID_PACKAGE,
};
+
+struct BlockCreateOptions {
+ /**
+ * Set false to omit mempool transactions
+ */
+ bool use_mempool{true};
+ /**
+ * The maximum additional weight which the pool will add to the coinbase
+ * scriptSig, witness and outputs. This must include any additional
+ * weight needed for larger CompactSize encoded lengths.
+ */
+ size_t coinbase_max_additional_weight{4000};
+ /**
+ * The maximum additional sigops which the pool will add in coinbase
+ * transaction outputs.
+ */
+ size_t coinbase_output_max_additional_sigops{400};
+};
} // namespace node
#endif // BITCOIN_NODE_TYPES_H
diff --git a/src/node/utxo_snapshot.cpp b/src/node/utxo_snapshot.cpp
index 976421e455..ca5491bdc2 100644
--- a/src/node/utxo_snapshot.cpp
+++ b/src/node/utxo_snapshot.cpp
@@ -73,10 +73,10 @@ std::optional<uint256> ReadSnapshotBaseBlockhash(fs::path chaindir)
}
afile >> base_blockhash;
- if (std::fgetc(afile.Get()) != EOF) {
+ int64_t position = afile.tell();
+ afile.seek(0, SEEK_END);
+ if (position != afile.tell()) {
LogPrintf("[snapshot] warning: unexpected trailing data in %s\n", read_from_str);
- } else if (std::ferror(afile.Get())) {
- LogPrintf("[snapshot] warning: i/o error reading %s\n", read_from_str);
}
return base_blockhash;
}
diff --git a/src/node/utxo_snapshot.h b/src/node/utxo_snapshot.h
index a7c4135787..e4eb6d60ad 100644
--- a/src/node/utxo_snapshot.h
+++ b/src/node/utxo_snapshot.h
@@ -28,16 +28,17 @@ class Chainstate;
namespace node {
//! Metadata describing a serialized version of a UTXO set from which an
//! assumeutxo Chainstate can be constructed.
+//! All metadata fields come from an untrusted file, so must be validated
+//! before being used. Thus, new fields should be added only if needed.
class SnapshotMetadata
{
- const uint16_t m_version{1};
- const std::set<uint16_t> m_supported_versions{1};
+ inline static const uint16_t VERSION{2};
+ const std::set<uint16_t> m_supported_versions{VERSION};
const MessageStartChars m_network_magic;
public:
//! The hash of the block that reflects the tip of the chain for the
//! UTXO set contained in this snapshot.
uint256 m_base_blockhash;
- uint32_t m_base_blockheight;
//! The number of coins in the UTXO set contained in this snapshot. Used
@@ -50,19 +51,16 @@ public:
SnapshotMetadata(
const MessageStartChars network_magic,
const uint256& base_blockhash,
- const int base_blockheight,
uint64_t coins_count) :
m_network_magic(network_magic),
m_base_blockhash(base_blockhash),
- m_base_blockheight(base_blockheight),
m_coins_count(coins_count) { }
template <typename Stream>
inline void Serialize(Stream& s) const {
s << SNAPSHOT_MAGIC_BYTES;
- s << m_version;
+ s << VERSION;
s << m_network_magic;
- s << m_base_blockheight;
s << m_base_blockhash;
s << m_coins_count;
}
@@ -98,7 +96,6 @@ public:
}
}
- s >> m_base_blockheight;
s >> m_base_blockhash;
s >> m_coins_count;
}
diff --git a/src/node/validation_cache_args.cpp b/src/node/validation_cache_args.cpp
deleted file mode 100644
index ddf24f798d..0000000000
--- a/src/node/validation_cache_args.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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 <node/validation_cache_args.h>
-
-#include <kernel/validation_cache_sizes.h>
-
-#include <common/args.h>
-
-#include <algorithm>
-#include <cstddef>
-#include <cstdint>
-#include <memory>
-#include <optional>
-
-using kernel::ValidationCacheSizes;
-
-namespace node {
-void ApplyArgsManOptions(const ArgsManager& argsman, ValidationCacheSizes& cache_sizes)
-{
- if (auto max_size = argsman.GetIntArg("-maxsigcachesize")) {
- // 1. When supplied with a max_size of 0, both InitSignatureCache and
- // InitScriptExecutionCache create the minimum possible cache (2
- // elements). Therefore, we can use 0 as a floor here.
- // 2. Multiply first, divide after to avoid integer truncation.
- size_t clamped_size_each = std::max<int64_t>(*max_size, 0) * (1 << 20) / 2;
- cache_sizes = {
- .signature_cache_bytes = clamped_size_each,
- .script_execution_cache_bytes = clamped_size_each,
- };
- }
-}
-} // namespace node
diff --git a/src/node/validation_cache_args.h b/src/node/validation_cache_args.h
deleted file mode 100644
index f447c13b49..0000000000
--- a/src/node/validation_cache_args.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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_NODE_VALIDATION_CACHE_ARGS_H
-#define BITCOIN_NODE_VALIDATION_CACHE_ARGS_H
-
-class ArgsManager;
-namespace kernel {
-struct ValidationCacheSizes;
-};
-
-namespace node {
-void ApplyArgsManOptions(const ArgsManager& argsman, kernel::ValidationCacheSizes& cache_sizes);
-} // namespace node
-
-#endif // BITCOIN_NODE_VALIDATION_CACHE_ARGS_H
diff --git a/src/node/warnings.cpp b/src/node/warnings.cpp
index b99c845900..87389e472b 100644
--- a/src/node/warnings.cpp
+++ b/src/node/warnings.cpp
@@ -28,8 +28,7 @@ Warnings::Warnings()
}
bool Warnings::Set(warning_type id, bilingual_str message)
{
- LOCK(m_mutex);
- const auto& [_, inserted]{m_warnings.insert({id, std::move(message)})};
+ const auto& [_, inserted]{WITH_LOCK(m_mutex, return m_warnings.insert({id, std::move(message)}))};
if (inserted) uiInterface.NotifyAlertChanged();
return inserted;
}
diff --git a/src/policy/feerate.h b/src/policy/feerate.h
index 2e50172914..d742a43acc 100644
--- a/src/policy/feerate.h
+++ b/src/policy/feerate.h
@@ -38,10 +38,8 @@ private:
public:
/** Fee rate of 0 satoshis per kvB */
CFeeRate() : nSatoshisPerK(0) { }
- template<typename I>
+ template<std::integral I> // Disallow silent float -> int conversion
explicit CFeeRate(const I _nSatoshisPerK): nSatoshisPerK(_nSatoshisPerK) {
- // We've previously had bugs creep in from silent double->int conversion...
- static_assert(std::is_integral<I>::value, "CFeeRate should be used without floats");
}
/**
diff --git a/src/policy/fees.cpp b/src/policy/fees.cpp
index 5f1d15c5f2..a17faa3b99 100644
--- a/src/policy/fees.cpp
+++ b/src/policy/fees.cpp
@@ -385,7 +385,7 @@ double TxConfirmStats::EstimateMedianVal(int confTarget, double sufficientTxVal,
failed_within_target_perc = 100 * failBucket.withinTarget / (failBucket.totalConfirmed + failBucket.inMempool + failBucket.leftMempool);
}
- LogPrint(BCLog::ESTIMATEFEE, "FeeEst: %d > %.0f%% decay %.5f: feerate: %g from (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out) Fail: (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out)\n",
+ LogDebug(BCLog::ESTIMATEFEE, "FeeEst: %d > %.0f%% decay %.5f: feerate: %g from (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out) Fail: (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out)\n",
confTarget, 100.0 * successBreakPoint, decay,
median, passBucket.start, passBucket.end,
passed_within_target_perc,
@@ -466,7 +466,7 @@ void TxConfirmStats::Read(AutoFile& filein, int nFileVersion, size_t numBuckets)
// to match the number of confirms and buckets
resizeInMemoryCounters(numBuckets);
- LogPrint(BCLog::ESTIMATEFEE, "Reading estimates: %u buckets counting confirms up to %u blocks\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Reading estimates: %u buckets counting confirms up to %u blocks\n",
numBuckets, maxConfirms);
}
@@ -485,7 +485,7 @@ void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHe
if (nBestSeenHeight == 0) // the BlockPolicyEstimator hasn't seen any blocks yet
blocksAgo = 0;
if (blocksAgo < 0) {
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error, blocks ago is negative for mempool tx\n");
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error, blocks ago is negative for mempool tx\n");
return; //This can't happen because we call this with our best seen height, no entries can have higher
}
@@ -493,7 +493,7 @@ void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHe
if (oldUnconfTxs[bucketindex] > 0) {
oldUnconfTxs[bucketindex]--;
} else {
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error, mempool tx removed from >25 blocks,bucketIndex=%u already\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error, mempool tx removed from >25 blocks,bucketIndex=%u already\n",
bucketindex);
}
}
@@ -502,7 +502,7 @@ void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHe
if (unconfTxs[blockIndex][bucketindex] > 0) {
unconfTxs[blockIndex][bucketindex]--;
} else {
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error, mempool tx removed from blockIndex=%u,bucketIndex=%u already\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error, mempool tx removed from blockIndex=%u,bucketIndex=%u already\n",
blockIndex, bucketindex);
}
}
@@ -595,7 +595,7 @@ void CBlockPolicyEstimator::processTransaction(const NewMempoolTransactionInfo&
const unsigned int txHeight = tx.info.txHeight;
const auto& hash = tx.info.m_tx->GetHash();
if (mapMemPoolTxs.count(hash)) {
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error mempool tx %s already being tracked\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error mempool tx %s already being tracked\n",
hash.ToString());
return;
}
@@ -649,7 +649,7 @@ bool CBlockPolicyEstimator::processBlockTx(unsigned int nBlockHeight, const Remo
if (blocksToConfirm <= 0) {
// This can't happen because we don't process transactions from a block with a height
// lower than our greatest seen height
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy error Transaction had negative blocksToConfirm\n");
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy error Transaction had negative blocksToConfirm\n");
return false;
}
@@ -699,11 +699,11 @@ void CBlockPolicyEstimator::processBlock(const std::vector<RemovedMempoolTransac
if (firstRecordedHeight == 0 && countedTxs > 0) {
firstRecordedHeight = nBestSeenHeight;
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy first recorded height %u\n", firstRecordedHeight);
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy first recorded height %u\n", firstRecordedHeight);
}
- LogPrint(BCLog::ESTIMATEFEE, "Blockpolicy estimates updated by %u of %u block txs, since last block %u of %u tracked, mempool map size %u, max target %u from %s\n",
+ LogDebug(BCLog::ESTIMATEFEE, "Blockpolicy estimates updated by %u of %u block txs, since last block %u of %u tracked, mempool map size %u, max target %u from %s\n",
countedTxs, txs_removed_for_block.size(), trackedTxs, trackedTxs + untrackedTxs, mapMemPoolTxs.size(),
MaxUsableEstimate(), HistoricalBlockSpan() > BlockSpan() ? "historical" : "current");
@@ -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 %.3fs\n", num_entries, Ticks<SecondsDouble>(endclear - startclear));
+ LogDebug(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/fees.h b/src/policy/fees.h
index f34f66d3f0..a95cc19dd4 100644
--- a/src/policy/fees.h
+++ b/src/policy/fees.h
@@ -283,7 +283,7 @@ private:
{
unsigned int blockHeight{0};
unsigned int bucketIndex{0};
- TxStatsInfo() {}
+ TxStatsInfo() = default;
};
// map of txids to information about that transaction
diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp
index e84a8428bf..68d879b5b8 100644
--- a/src/policy/policy.cpp
+++ b/src/policy/policy.cpp
@@ -225,6 +225,11 @@ bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
// get the scriptPubKey corresponding to this input:
CScript prevScript = prev.scriptPubKey;
+ // witness stuffing detected
+ if (prevScript.IsPayToAnchor()) {
+ return false;
+ }
+
bool p2sh = false;
if (prevScript.IsPayToScriptHash()) {
std::vector <std::vector<unsigned char> > stack;
diff --git a/src/policy/v3_policy.cpp b/src/policy/truc_policy.cpp
index 6bd043b8e3..69e8d5ed1d 100644
--- a/src/policy/v3_policy.cpp
+++ b/src/policy/truc_policy.cpp
@@ -2,7 +2,7 @@
// 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 <policy/truc_policy.h>
#include <coins.h>
#include <consensus/amount.h>
@@ -14,7 +14,7 @@
#include <numeric>
#include <vector>
-/** Helper for PackageV3Checks: Returns a vector containing the indices of transactions (within
+/** Helper for PackageTRUCChecks: 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)
{
@@ -37,13 +37,13 @@ std::vector<size_t> FindInPackageParents(const Package& package, const CTransact
return in_package_parents;
}
-/** Helper for PackageV3Checks, storing info for a mempool or package parent. */
+/** Helper for PackageTRUCChecks, 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;
- /** version used to check inheritance of v3 and non-v3 */
+ /** version used to check inheritance of TRUC and non-TRUC */
decltype(CTransaction::version) m_version;
/** If parent is in mempool, whether it has any descendants in mempool. */
bool m_has_mempool_descendant;
@@ -55,36 +55,36 @@ struct ParentInfo {
{}
};
-std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t vsize,
+std::optional<std::string> PackageTRUCChecks(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);
+ static_assert(TRUC_ANCESTOR_LIMIT == 2);
+ static_assert(TRUC_DESCENDANT_LIMIT == 2);
const auto in_package_parents{FindInPackageParents(package, ptx)};
- // Now we have all ancestors, so we can start checking v3 rules.
+ // Now we have all ancestors, so we can start checking TRUC rules.
if (ptx->version == TRUC_VERSION) {
- // SingleV3Checks should have checked this already.
- if (!Assume(vsize <= V3_MAX_VSIZE)) {
- return strprintf("v3 tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
- ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(), vsize, V3_MAX_VSIZE);
+ // SingleTRUCChecks should have checked this already.
+ if (!Assume(vsize <= TRUC_MAX_VSIZE)) {
+ return strprintf("version=3 tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(), vsize, TRUC_MAX_VSIZE);
}
- if (mempool_ancestors.size() + in_package_parents.size() + 1 > V3_ANCESTOR_LIMIT) {
+ if (mempool_ancestors.size() + in_package_parents.size() + 1 > TRUC_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",
+ // A TRUC child cannot be too large.
+ if (vsize > TRUC_CHILD_MAX_VSIZE) {
+ return strprintf("version=3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
- vsize, V3_CHILD_MAX_VSIZE);
+ vsize, TRUC_CHILD_MAX_VSIZE);
}
// Exactly 1 parent exists, either in mempool or package. Find it.
@@ -107,7 +107,7 @@ std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t v
// If there is a parent, it must have the right version.
if (parent_info.m_version != TRUC_VERSION) {
- return strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
+ return strprintf("version=3 tx %s (wtxid=%s) cannot spend from non-version=3 tx %s (wtxid=%s)",
ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
parent_info.m_txid.ToString(), parent_info.m_wtxid.ToString());
}
@@ -118,7 +118,7 @@ std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t v
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
+ // sibling is to-be-replaced (done in SingleTRUCChecks) 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",
@@ -140,17 +140,17 @@ std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t v
}
}
} else {
- // Non-v3 transactions cannot have v3 parents.
+ // Non-TRUC transactions cannot have TRUC parents.
for (auto it : mempool_ancestors) {
if (it->GetTx().version == TRUC_VERSION) {
- return strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ return strprintf("non-version=3 tx %s (wtxid=%s) cannot spend from version=3 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)->version == TRUC_VERSION) {
- return strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ return strprintf("non-version=3 tx %s (wtxid=%s) cannot spend from version=3 tx %s (wtxid=%s)",
ptx->GetHash().ToString(),
ptx->GetWitnessHash().ToString(),
package.at(index)->GetHash().ToString(),
@@ -161,20 +161,20 @@ std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t v
return std::nullopt;
}
-std::optional<std::pair<std::string, CTransactionRef>> SingleV3Checks(const CTransactionRef& ptx,
+std::optional<std::pair<std::string, CTransactionRef>> SingleTRUCChecks(const CTransactionRef& ptx,
const CTxMemPool::setEntries& mempool_ancestors,
const std::set<Txid>& direct_conflicts,
int64_t vsize)
{
- // Check v3 and non-v3 inheritance.
+ // Check TRUC and non-TRUC inheritance.
for (const auto& entry : mempool_ancestors) {
if (ptx->version != TRUC_VERSION && entry->GetTx().version == TRUC_VERSION) {
- return std::make_pair(strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ return std::make_pair(strprintf("non-version=3 tx %s (wtxid=%s) cannot spend from version=3 tx %s (wtxid=%s)",
ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
entry->GetSharedTx()->GetHash().ToString(), entry->GetSharedTx()->GetWitnessHash().ToString()),
nullptr);
} else if (ptx->version == TRUC_VERSION && entry->GetTx().version != TRUC_VERSION) {
- return std::make_pair(strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
+ return std::make_pair(strprintf("version=3 tx %s (wtxid=%s) cannot spend from non-version=3 tx %s (wtxid=%s)",
ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
entry->GetSharedTx()->GetHash().ToString(), entry->GetSharedTx()->GetWitnessHash().ToString()),
nullptr);
@@ -182,20 +182,20 @@ std::optional<std::pair<std::string, CTransactionRef>> SingleV3Checks(const CTra
}
// 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);
+ static_assert(TRUC_ANCESTOR_LIMIT == 2);
+ static_assert(TRUC_DESCENDANT_LIMIT == 2);
// The rest of the rules only apply to transactions with version=3.
if (ptx->version != TRUC_VERSION) return std::nullopt;
- if (vsize > V3_MAX_VSIZE) {
- return std::make_pair(strprintf("v3 tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
- ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(), vsize, V3_MAX_VSIZE),
+ if (vsize > TRUC_MAX_VSIZE) {
+ return std::make_pair(strprintf("version=3 tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(), vsize, TRUC_MAX_VSIZE),
nullptr);
}
- // Check that V3_ANCESTOR_LIMIT would not be violated.
- if (mempool_ancestors.size() + 1 > V3_ANCESTOR_LIMIT) {
+ // Check that TRUC_ANCESTOR_LIMIT would not be violated.
+ if (mempool_ancestors.size() + 1 > TRUC_ANCESTOR_LIMIT) {
return std::make_pair(strprintf("tx %s (wtxid=%s) would have too many ancestors",
ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString()),
nullptr);
@@ -203,10 +203,10 @@ std::optional<std::pair<std::string, CTransactionRef>> SingleV3Checks(const CTra
// 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 std::make_pair(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),
+ // If this transaction spends TRUC parents, it cannot be too large.
+ if (vsize > TRUC_CHILD_MAX_VSIZE) {
+ return std::make_pair(strprintf("version=3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(), vsize, TRUC_CHILD_MAX_VSIZE),
nullptr);
}
@@ -217,14 +217,14 @@ std::optional<std::pair<std::string, CTransactionRef>> SingleV3Checks(const CTra
// 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.
+ // any descendant of the TRUC transaction is a direct child, which makes sense because a
+ // TRUC 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) {
- // Allow sibling eviction for v3 transaction: if another child already exists, even if
- // we don't conflict inputs with it, consider evicting it under RBF rules. We rely on v3 rules
+ if (parent_entry->GetCountWithDescendants() + 1 > TRUC_DESCENDANT_LIMIT && !child_will_be_replaced) {
+ // Allow sibling eviction for TRUC transaction: if another child already exists, even if
+ // we don't conflict inputs with it, consider evicting it under RBF rules. We rely on TRUC rules
// only permitting 1 descendant, as otherwise we would need to have logic for deciding
// which descendant to evict. Skip if this isn't true, e.g. if the transaction has
// multiple children or the sibling also has descendants due to a reorg.
diff --git a/src/policy/truc_policy.h b/src/policy/truc_policy.h
new file mode 100644
index 0000000000..dbc77696c6
--- /dev/null
+++ b/src/policy/truc_policy.h
@@ -0,0 +1,94 @@
+// 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_TRUC_POLICY_H
+#define BITCOIN_POLICY_TRUC_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 BIP 431 TRUC transactions which help make
+// RBF abilities more robust. A transaction with version=3 is treated as TRUC.
+static constexpr decltype(CTransaction::version) TRUC_VERSION{3};
+
+// TRUC only allows 1 parent and 1 child when unconfirmed. This translates to a descendant set size
+// of 2 and ancestor set size of 2.
+/** Maximum number of transactions including an unconfirmed tx and its descendants. */
+static constexpr unsigned int TRUC_DESCENDANT_LIMIT{2};
+/** Maximum number of transactions including a TRUC tx and all its mempool ancestors. */
+static constexpr unsigned int TRUC_ANCESTOR_LIMIT{2};
+
+/** Maximum sigop-adjusted virtual size of all v3 transactions. */
+static constexpr int64_t TRUC_MAX_VSIZE{10000};
+/** Maximum sigop-adjusted virtual size of a tx which spends from an unconfirmed TRUC transaction. */
+static constexpr int64_t TRUC_CHILD_MAX_VSIZE{1000};
+// These limits are within the default ancestor/descendant limits.
+static_assert(TRUC_MAX_VSIZE + TRUC_CHILD_MAX_VSIZE <= DEFAULT_ANCESTOR_SIZE_LIMIT_KVB * 1000);
+static_assert(TRUC_MAX_VSIZE + TRUC_CHILD_MAX_VSIZE <= DEFAULT_DESCENDANT_SIZE_LIMIT_KVB * 1000);
+
+/** Must be called for every transaction, even if not TRUC. Not strictly necessary for transactions
+ * accepted through AcceptMultipleTransactions.
+ *
+ * Checks the following rules:
+ * 1. A TRUC tx must only have TRUC unconfirmed ancestors.
+ * 2. A non-TRUC tx must only have non-TRUC unconfirmed ancestors.
+ * 3. A TRUC's ancestor set, including itself, must be within TRUC_ANCESTOR_LIMIT.
+ * 4. A TRUC's descendant set, including itself, must be within TRUC_DESCENDANT_LIMIT.
+ * 5. If a TRUC tx has any unconfirmed ancestors, the tx's sigop-adjusted vsize must be within
+ * TRUC_CHILD_MAX_VSIZE.
+ * 6. A TRUC tx must be within TRUC_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 3 possibilities:
+ * - std::nullopt if all TRUC checks were applied successfully
+ * - debug string + pointer to a mempool sibling if this transaction would be the second child in a
+ * 1-parent-1-child cluster; the caller may consider evicting the specified sibling or return an
+ * error with the debug string.
+ * - debug string + nullptr if this transaction violates some TRUC rule and sibling eviction is not
+ * applicable.
+ */
+std::optional<std::pair<std::string, CTransactionRef>> SingleTRUCChecks(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 TRUC.
+ *
+ * For each transaction in a package:
+ * If it's not a TRUC transaction, verify it has no direct TRUC parents in the mempool or the package.
+
+ * If it is a TRUC transaction, verify that any direct parents in the mempool or the package are TRUC.
+ * 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 TRUC violations in the package exist, this test will fail for one of them:
+ * - if a TRUC transaction T has a parent in the mempool and a child in the package, then PTRUCC(T) will fail
+ * - if a TRUC transaction T has a parent in the package and a child in the package, then PTRUCC(T) will fail
+ * - if a TRUC transaction T and a TRUC (sibling) transaction U have some parent in the mempool,
+ * then PTRUCC(T) and PTRUCC(U) will fail
+ * - if a TRUC transaction T and a TRUC (sibling) transaction U have some parent in the package,
+ * then PTRUCC(T) and PTRUCC(U) will fail
+ * - if a TRUC transaction T has a parent P and a grandparent G in the package, then
+ * PTRUCC(P) will fail (though PTRUCC(G) and PTRUCC(T) might succeed).
+ *
+ * @returns debug string if an error occurs, std::nullopt otherwise.
+ * */
+std::optional<std::string> PackageTRUCChecks(const CTransactionRef& ptx, int64_t vsize,
+ const Package& package,
+ const CTxMemPool::setEntries& mempool_ancestors);
+
+#endif // BITCOIN_POLICY_TRUC_POLICY_H
diff --git a/src/policy/v3_policy.h b/src/policy/v3_policy.h
deleted file mode 100644
index 90eaeda46f..0000000000
--- a/src/policy/v3_policy.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// 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 BIP 431 TRUC transactions (with version=3) which help make
-// RBF abilities more robust.
-static constexpr decltype(CTransaction::version) TRUC_VERSION{3};
-
-// 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 all v3 transactions. */
-static constexpr int64_t V3_MAX_VSIZE{10000};
-/** 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_MAX_VSIZE + V3_CHILD_MAX_VSIZE <= DEFAULT_ANCESTOR_SIZE_LIMIT_KVB * 1000);
-static_assert(V3_MAX_VSIZE + V3_CHILD_MAX_VSIZE <= 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.
- * 6. A v3 tx must be within V3_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 3 possibilities:
- * - std::nullopt if all v3 checks were applied successfully
- * - debug string + pointer to a mempool sibling if this transaction would be the second child in a
- * 1-parent-1-child cluster; the caller may consider evicting the specified sibling or return an
- * error with the debug string.
- * - debug string + nullptr if this transaction violates some v3 rule and sibling eviction is not
- * applicable.
- */
-std::optional<std::pair<std::string, CTransactionRef>> 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/pow.cpp b/src/pow.cpp
index 1e8d53de8b..6c8e7e5d98 100644
--- a/src/pow.cpp
+++ b/src/pow.cpp
@@ -61,7 +61,19 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
// Retarget
const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
arith_uint256 bnNew;
- bnNew.SetCompact(pindexLast->nBits);
+
+ // Special difficulty rule for Testnet4
+ if (params.enforce_BIP94) {
+ // Here we use the first block of the difficulty period. This way
+ // the real difficulty is always preserved in the first block as
+ // it is not allowed to use the min-difficulty exception.
+ int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1);
+ const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);
+ bnNew.SetCompact(pindexFirst->nBits);
+ } else {
+ bnNew.SetCompact(pindexLast->nBits);
+ }
+
bnNew *= nActualTimespan;
bnNew /= params.nPowTargetTimespan;
@@ -122,8 +134,19 @@ bool PermittedDifficultyTransition(const Consensus::Params& params, int64_t heig
return true;
}
+// Bypasses the actual proof of work check during fuzz testing with a simplified validation checking whether
+// the most signficant bit of the last byte of the hash is set.
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params& params)
{
+#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
+ return (hash.data()[31] & 0x80) == 0;
+#else
+ return CheckProofOfWorkImpl(hash, nBits, params);
+#endif
+}
+
+bool CheckProofOfWorkImpl(uint256 hash, unsigned int nBits, const Consensus::Params& params)
+{
bool fNegative;
bool fOverflow;
arith_uint256 bnTarget;
diff --git a/src/pow.h b/src/pow.h
index ec03f318a4..2b28ade273 100644
--- a/src/pow.h
+++ b/src/pow.h
@@ -19,6 +19,7 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&);
+bool CheckProofOfWorkImpl(uint256 hash, unsigned int nBits, const Consensus::Params&);
/**
* Return false if the proof-of-work requirement specified by new_nbits at a
diff --git a/src/prevector.h b/src/prevector.h
index 4776db789b..d14e5f64e9 100644
--- a/src/prevector.h
+++ b/src/prevector.h
@@ -5,13 +5,13 @@
#ifndef BITCOIN_PREVECTOR_H
#define BITCOIN_PREVECTOR_H
-#include <assert.h>
-#include <cstdlib>
-#include <stdint.h>
-#include <string.h>
-
#include <algorithm>
+#include <cassert>
#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+#include <cstring>
+#include <iterator>
#include <type_traits>
#include <utility>
@@ -50,7 +50,6 @@ public:
T* ptr{};
public:
typedef Diff difference_type;
- typedef T value_type;
typedef T* pointer;
typedef T& reference;
using element_type = T;
@@ -102,7 +101,6 @@ public:
const T* ptr{};
public:
typedef Diff difference_type;
- typedef const T value_type;
typedef const T* pointer;
typedef const T& reference;
using element_type = const T;
@@ -212,7 +210,7 @@ private:
std::fill_n(dst, count, value);
}
- template<typename InputIterator>
+ template <std::input_iterator InputIterator>
void fill(T* dst, InputIterator first, InputIterator last) {
while (first != last) {
new(static_cast<void*>(dst)) T(*first);
@@ -231,7 +229,7 @@ public:
fill(item_ptr(0), n, val);
}
- template<typename InputIterator>
+ template <std::input_iterator InputIterator>
void assign(InputIterator first, InputIterator last) {
size_type n = last - first;
clear();
@@ -242,7 +240,7 @@ public:
fill(item_ptr(0), first, last);
}
- prevector() {}
+ prevector() = default;
explicit prevector(size_type n) {
resize(n);
@@ -254,7 +252,7 @@ public:
fill(item_ptr(0), n, val);
}
- template<typename InputIterator>
+ template <std::input_iterator InputIterator>
prevector(InputIterator first, InputIterator last) {
size_type n = last - first;
change_capacity(n);
@@ -365,7 +363,8 @@ public:
change_capacity(new_size + (new_size >> 1));
}
T* ptr = item_ptr(p);
- memmove(ptr + 1, ptr, (size() - p) * sizeof(T));
+ T* dst = ptr + 1;
+ memmove(dst, ptr, (size() - p) * sizeof(T));
_size++;
new(static_cast<void*>(ptr)) T(value);
return iterator(ptr);
@@ -378,12 +377,13 @@ public:
change_capacity(new_size + (new_size >> 1));
}
T* ptr = item_ptr(p);
- memmove(ptr + count, ptr, (size() - p) * sizeof(T));
+ T* dst = ptr + count;
+ memmove(dst, ptr, (size() - p) * sizeof(T));
_size += count;
fill(item_ptr(p), count, value);
}
- template<typename InputIterator>
+ template <std::input_iterator InputIterator>
void insert(iterator pos, InputIterator first, InputIterator last) {
size_type p = pos - begin();
difference_type count = last - first;
@@ -392,7 +392,8 @@ public:
change_capacity(new_size + (new_size >> 1));
}
T* ptr = item_ptr(p);
- memmove(ptr + count, ptr, (size() - p) * sizeof(T));
+ T* dst = ptr + count;
+ memmove(dst, ptr, (size() - p) * sizeof(T));
_size += count;
fill(ptr, first, last);
}
diff --git a/src/primitives/block.h b/src/primitives/block.h
index 832f8a03f7..207d2b2980 100644
--- a/src/primitives/block.h
+++ b/src/primitives/block.h
@@ -133,7 +133,7 @@ struct CBlockLocator
std::vector<uint256> vHave;
- CBlockLocator() {}
+ CBlockLocator() = default;
explicit CBlockLocator(std::vector<uint256>&& have) : vHave(std::move(have)) {}
diff --git a/src/psbt.h b/src/psbt.h
index 4607304046..6d49864b3c 100644
--- a/src/psbt.h
+++ b/src/psbt.h
@@ -225,7 +225,7 @@ struct PSBTInput
void FillSignatureData(SignatureData& sigdata) const;
void FromSignatureData(const SignatureData& sigdata);
void Merge(const PSBTInput& input);
- PSBTInput() {}
+ PSBTInput() = default;
template <typename Stream>
inline void Serialize(Stream& s) const {
@@ -726,7 +726,7 @@ struct PSBTOutput
void FillSignatureData(SignatureData& sigdata) const;
void FromSignatureData(const SignatureData& sigdata);
void Merge(const PSBTOutput& output);
- PSBTOutput() {}
+ PSBTOutput() = default;
template <typename Stream>
inline void Serialize(Stream& s) const {
@@ -967,7 +967,7 @@ struct PartiallySignedTransaction
[[nodiscard]] bool Merge(const PartiallySignedTransaction& psbt);
bool AddInput(const CTxIn& txin, PSBTInput& psbtin);
bool AddOutput(const CTxOut& txout, const PSBTOutput& psbtout);
- PartiallySignedTransaction() {}
+ PartiallySignedTransaction() = default;
explicit PartiallySignedTransaction(const CMutableTransaction& tx);
/**
* Finds the UTXO for a given input index
@@ -1177,8 +1177,13 @@ struct PartiallySignedTransaction
inputs.push_back(input);
// Make sure the non-witness utxo matches the outpoint
- if (input.non_witness_utxo && input.non_witness_utxo->GetHash() != tx->vin[i].prevout.hash) {
- throw std::ios_base::failure("Non-witness UTXO does not match outpoint hash");
+ if (input.non_witness_utxo) {
+ if (input.non_witness_utxo->GetHash() != tx->vin[i].prevout.hash) {
+ throw std::ios_base::failure("Non-witness UTXO does not match outpoint hash");
+ }
+ if (tx->vin[i].prevout.n >= input.non_witness_utxo->vout.size()) {
+ throw std::ios_base::failure("Input specifies output index that does not exist");
+ }
}
++i;
}
diff --git a/src/pubkey.cpp b/src/pubkey.cpp
index 13e3c2dbe0..0849d2a266 100644
--- a/src/pubkey.cpp
+++ b/src/pubkey.cpp
@@ -18,6 +18,8 @@
#include <algorithm>
#include <cassert>
+using namespace util::hex_literals;
+
namespace {
struct Secp256k1SelfTester
@@ -190,14 +192,7 @@ int ecdsa_signature_parse_der_lax(secp256k1_ecdsa_signature* sig, const unsigned
* For an example script for calculating H, refer to the unit tests in
* ./test/functional/test_framework/crypto/secp256k1.py
*/
-static const std::vector<unsigned char> NUMS_H_DATA{ParseHex("50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0")};
-const XOnlyPubKey XOnlyPubKey::NUMS_H{NUMS_H_DATA};
-
-XOnlyPubKey::XOnlyPubKey(Span<const unsigned char> bytes)
-{
- assert(bytes.size() == 32);
- std::copy(bytes.begin(), bytes.end(), m_keydata.begin());
-}
+constexpr XOnlyPubKey XOnlyPubKey::NUMS_H{"50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0"_hex_u8};
std::vector<CKeyID> XOnlyPubKey::GetKeyIDs() const
{
diff --git a/src/pubkey.h b/src/pubkey.h
index ae34ddd0af..b4666aad22 100644
--- a/src/pubkey.h
+++ b/src/pubkey.h
@@ -254,7 +254,7 @@ public:
bool IsNull() const { return m_keydata.IsNull(); }
/** Construct an x-only pubkey from exactly 32 bytes. */
- explicit XOnlyPubKey(Span<const unsigned char> bytes);
+ constexpr explicit XOnlyPubKey(std::span<const unsigned char> bytes) : m_keydata{bytes} {}
/** Construct an x-only pubkey from a normal pubkey. */
explicit XOnlyPubKey(const CPubKey& pubkey) : XOnlyPubKey(Span{pubkey}.subspan(1, 32)) {}
diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt
new file mode 100644
index 0000000000..7ec2b74cc8
--- /dev/null
+++ b/src/qt/CMakeLists.txt
@@ -0,0 +1,330 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ enable_language(OBJCXX)
+ set(CMAKE_OBJCXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
+ set(CMAKE_OBJCXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
+ set(CMAKE_OBJCXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
+ set(CMAKE_OBJCXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
+ string(APPEND CMAKE_OBJCXX_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CXXFLAGS}")
+endif()
+
+get_target_property(qt_lib_type Qt5::Core TYPE)
+
+function(import_plugins target)
+ if(qt_lib_type STREQUAL "STATIC_LIBRARY")
+ set(plugins Qt5::QMinimalIntegrationPlugin)
+ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ list(APPEND plugins Qt5::QXcbIntegrationPlugin)
+ elseif(WIN32)
+ list(APPEND plugins Qt5::QWindowsIntegrationPlugin Qt5::QWindowsVistaStylePlugin)
+ elseif(APPLE)
+ list(APPEND plugins Qt5::QCocoaIntegrationPlugin Qt5::QMacStylePlugin)
+ endif()
+ qt5_import_plugins(${target}
+ INCLUDE ${plugins}
+ EXCLUDE_BY_TYPE imageformats iconengines
+ )
+ endif()
+endfunction()
+
+# For Qt-specific commands and variables, please consult:
+# - https://cmake.org/cmake/help/latest/manual/cmake-qt.7.html
+# - https://doc.qt.io/qt-5/cmake-manual.html
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+set(CMAKE_AUTOUIC_SEARCH_PATHS forms)
+
+# TODO: The file(GLOB ...) command should be replaced with an explicit
+# file list. Such a change must be synced with the corresponding change
+# to https://github.com/bitcoin-core/bitcoin-maintainer-tools/blob/main/update-translations.py
+file(GLOB ts_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} locale/*.ts)
+set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/locale)
+qt5_add_translation(qm_files ${ts_files})
+
+configure_file(bitcoin_locale.qrc bitcoin_locale.qrc USE_SOURCE_PERMISSIONS COPYONLY)
+
+# The bitcoinqt sources have to include headers in
+# order to parse them to collect translatable strings.
+add_library(bitcoinqt STATIC EXCLUDE_FROM_ALL
+ bantablemodel.cpp
+ bantablemodel.h
+ bitcoin.cpp
+ bitcoin.h
+ bitcoinaddressvalidator.cpp
+ bitcoinaddressvalidator.h
+ bitcoinamountfield.cpp
+ bitcoinamountfield.h
+ bitcoingui.cpp
+ bitcoingui.h
+ bitcoinunits.cpp
+ bitcoinunits.h
+ clientmodel.cpp
+ clientmodel.h
+ csvmodelwriter.cpp
+ csvmodelwriter.h
+ guiutil.cpp
+ guiutil.h
+ initexecutor.cpp
+ initexecutor.h
+ intro.cpp
+ intro.h
+ $<$<PLATFORM_ID:Darwin>:macdockiconhandler.h>
+ $<$<PLATFORM_ID:Darwin>:macdockiconhandler.mm>
+ $<$<PLATFORM_ID:Darwin>:macnotificationhandler.h>
+ $<$<PLATFORM_ID:Darwin>:macnotificationhandler.mm>
+ $<$<PLATFORM_ID:Darwin>:macos_appnap.h>
+ $<$<PLATFORM_ID:Darwin>:macos_appnap.mm>
+ modaloverlay.cpp
+ modaloverlay.h
+ networkstyle.cpp
+ networkstyle.h
+ notificator.cpp
+ notificator.h
+ optionsdialog.cpp
+ optionsdialog.h
+ optionsmodel.cpp
+ optionsmodel.h
+ peertablemodel.cpp
+ peertablemodel.h
+ peertablesortproxy.cpp
+ peertablesortproxy.h
+ platformstyle.cpp
+ platformstyle.h
+ qvalidatedlineedit.cpp
+ qvalidatedlineedit.h
+ qvaluecombobox.cpp
+ qvaluecombobox.h
+ rpcconsole.cpp
+ rpcconsole.h
+ splashscreen.cpp
+ splashscreen.h
+ trafficgraphwidget.cpp
+ trafficgraphwidget.h
+ utilitydialog.cpp
+ utilitydialog.h
+ $<$<PLATFORM_ID:Windows>:winshutdownmonitor.cpp>
+ $<$<PLATFORM_ID:Windows>:winshutdownmonitor.h>
+ bitcoin.qrc
+ ${CMAKE_CURRENT_BINARY_DIR}/bitcoin_locale.qrc
+)
+target_compile_definitions(bitcoinqt
+ PUBLIC
+ QT_NO_KEYWORDS
+ QT_USE_QSTRINGBUILDER
+)
+target_include_directories(bitcoinqt
+ PUBLIC
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
+)
+set_property(SOURCE macnotificationhandler.mm
+ # Ignore warnings "'NSUserNotificationCenter' is deprecated: first deprecated in macOS 11.0".
+ APPEND PROPERTY COMPILE_OPTIONS -Wno-deprecated-declarations
+)
+target_link_libraries(bitcoinqt
+ PUBLIC
+ Qt5::Widgets
+ PRIVATE
+ core_interface
+ bitcoin_cli
+ leveldb
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:MiniUPnPc::MiniUPnPc>
+ $<TARGET_NAME_IF_EXISTS:PkgConfig::libqrencode>
+ $<$<PLATFORM_ID:Darwin>:-framework\ AppKit>
+ $<$<CXX_COMPILER_ID:MSVC>:shlwapi>
+)
+
+if(ENABLE_WALLET)
+ target_sources(bitcoinqt
+ PRIVATE
+ addressbookpage.cpp
+ addressbookpage.h
+ addresstablemodel.cpp
+ addresstablemodel.h
+ askpassphrasedialog.cpp
+ askpassphrasedialog.h
+ coincontroldialog.cpp
+ coincontroldialog.h
+ coincontroltreewidget.cpp
+ coincontroltreewidget.h
+ createwalletdialog.cpp
+ createwalletdialog.h
+ editaddressdialog.cpp
+ editaddressdialog.h
+ openuridialog.cpp
+ openuridialog.h
+ overviewpage.cpp
+ overviewpage.h
+ paymentserver.cpp
+ paymentserver.h
+ psbtoperationsdialog.cpp
+ psbtoperationsdialog.h
+ qrimagewidget.cpp
+ qrimagewidget.h
+ receivecoinsdialog.cpp
+ receivecoinsdialog.h
+ receiverequestdialog.cpp
+ receiverequestdialog.h
+ recentrequeststablemodel.cpp
+ recentrequeststablemodel.h
+ sendcoinsdialog.cpp
+ sendcoinsdialog.h
+ sendcoinsentry.cpp
+ sendcoinsentry.h
+ signverifymessagedialog.cpp
+ signverifymessagedialog.h
+ transactiondesc.cpp
+ transactiondesc.h
+ transactiondescdialog.cpp
+ transactiondescdialog.h
+ transactionfilterproxy.cpp
+ transactionfilterproxy.h
+ transactionoverviewwidget.cpp
+ transactionoverviewwidget.h
+ transactionrecord.cpp
+ transactionrecord.h
+ transactiontablemodel.cpp
+ transactiontablemodel.h
+ transactionview.cpp
+ transactionview.h
+ walletcontroller.cpp
+ walletcontroller.h
+ walletframe.cpp
+ walletframe.h
+ walletmodel.cpp
+ walletmodel.h
+ walletmodeltransaction.cpp
+ walletmodeltransaction.h
+ walletview.cpp
+ walletview.h
+ )
+ target_link_libraries(bitcoinqt
+ PRIVATE
+ bitcoin_wallet
+ Qt5::Network
+ )
+endif()
+
+if(WITH_DBUS)
+ target_link_libraries(bitcoinqt PRIVATE Qt5::DBus)
+endif()
+
+if(qt_lib_type STREQUAL "STATIC_LIBRARY")
+ # We want to define static plugins to link ourselves, thus preventing
+ # automatic linking against a "sane" set of default static plugins.
+ qt5_import_plugins(bitcoinqt
+ EXCLUDE_BY_TYPE bearer iconengines imageformats platforms styles
+ )
+endif()
+
+add_executable(bitcoin-qt
+ main.cpp
+ ../init/bitcoin-qt.cpp
+)
+
+add_windows_resources(bitcoin-qt res/bitcoin-qt-res.rc)
+
+target_link_libraries(bitcoin-qt
+ core_interface
+ bitcoinqt
+ bitcoin_node
+)
+
+import_plugins(bitcoin-qt)
+set(installable_targets bitcoin-qt)
+if(WIN32)
+ set_target_properties(bitcoin-qt PROPERTIES WIN32_EXECUTABLE TRUE)
+endif()
+
+if(WITH_MULTIPROCESS)
+ add_executable(bitcoin-gui
+ main.cpp
+ ../init/bitcoin-gui.cpp
+ )
+ target_link_libraries(bitcoin-gui
+ core_interface
+ bitcoinqt
+ bitcoin_node
+ bitcoin_ipc
+ )
+ import_plugins(bitcoin-gui)
+ list(APPEND installable_targets bitcoin-gui)
+ if(WIN32)
+ set_target_properties(bitcoin-gui PROPERTIES WIN32_EXECUTABLE TRUE)
+ endif()
+endif()
+
+install(TARGETS ${installable_targets}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ COMPONENT GUI
+)
+
+if(BUILD_GUI_TESTS)
+ add_subdirectory(test)
+endif()
+
+
+# Gets sources to be parsed to gather translatable strings.
+function(get_translatable_sources var)
+ set(result)
+ set(targets)
+ foreach(dir IN ITEMS ${ARGN})
+ get_directory_property(dir_targets DIRECTORY ${PROJECT_SOURCE_DIR}/${dir} BUILDSYSTEM_TARGETS)
+ list(APPEND targets ${dir_targets})
+ endforeach()
+ foreach(target IN LISTS targets)
+ get_target_property(target_sources ${target} SOURCES)
+ if(target_sources)
+ foreach(source IN LISTS target_sources)
+ # Get an expression from the generator expression, if any.
+ if(source MATCHES ":([^>]+)>$")
+ set(source ${CMAKE_MATCH_1})
+ endif()
+ cmake_path(GET source EXTENSION LAST_ONLY ext)
+ if(ext STREQUAL ".qrc")
+ continue()
+ endif()
+ if(NOT IS_ABSOLUTE source)
+ get_target_property(target_source_dir ${target} SOURCE_DIR)
+ cmake_path(APPEND target_source_dir ${source} OUTPUT_VARIABLE source)
+ endif()
+ list(APPEND result ${source})
+ endforeach()
+ endif()
+ endforeach()
+ set(${var} ${result} PARENT_SCOPE)
+endfunction()
+
+find_program(XGETTEXT_EXECUTABLE xgettext)
+find_program(SED_EXECUTABLE sed)
+if(NOT XGETTEXT_EXECUTABLE)
+ add_custom_target(translate
+ COMMAND ${CMAKE_COMMAND} -E echo "Error: GNU gettext-tools not found"
+ )
+elseif(NOT SED_EXECUTABLE)
+ add_custom_target(translate
+ COMMAND ${CMAKE_COMMAND} -E echo "Error: GNU sed not found"
+ )
+else()
+ set(translatable_sources_directories src src/qt src/util)
+ if(ENABLE_WALLET)
+ list(APPEND translatable_sources_directories src/wallet)
+ endif()
+ get_translatable_sources(translatable_sources ${translatable_sources_directories})
+ get_translatable_sources(qt_translatable_sources src/qt)
+ file(GLOB ui_files ${CMAKE_CURRENT_SOURCE_DIR}/forms/*.ui)
+ add_custom_target(translate
+ COMMAND ${CMAKE_COMMAND} -E env XGETTEXT=${XGETTEXT_EXECUTABLE} COPYRIGHT_HOLDERS=${COPYRIGHT_HOLDERS} ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/share/qt/extract_strings_qt.py ${translatable_sources}
+ COMMAND Qt5::lupdate -no-obsolete -I ${PROJECT_SOURCE_DIR}/src -locations relative ${CMAKE_CURRENT_SOURCE_DIR}/bitcoinstrings.cpp ${ui_files} ${qt_translatable_sources} -ts ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts
+ COMMAND Qt5::lconvert -drop-translations -o ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf -i ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts
+ COMMAND ${SED_EXECUTABLE} -i.old -e "s|source-language=\"en\" target-language=\"en\"|source-language=\"en\"|" -e "/<target xml:space=\"preserve\"><\\/target>/d" ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf
+ COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf.old
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src
+ VERBATIM
+ )
+endif()
diff --git a/src/qt/Makefile b/src/qt/Makefile
deleted file mode 100644
index 3bd6199059..0000000000
--- a/src/qt/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-.PHONY: FORCE
-all: FORCE
- $(MAKE) -C .. bitcoin_qt test_bitcoin_qt
-clean: FORCE
- $(MAKE) -C .. bitcoin_qt_clean test_bitcoin_qt_clean
-check: FORCE
- $(MAKE) -C .. test_bitcoin_qt_check
-bitcoin-qt bitcoin-qt.exe: FORCE
- $(MAKE) -C .. bitcoin_qt
-apk: FORCE
- $(MAKE) -C .. bitcoin_qt_apk
diff --git a/src/qt/README.md b/src/qt/README.md
index 20c712c98d..3ecdd0888e 100644
--- a/src/qt/README.md
+++ b/src/qt/README.md
@@ -4,14 +4,14 @@ The current precise version for Qt 5 is specified in [qt.mk](/depends/packages/q
## Compile and run
-See build instructions: [Unix](/doc/build-unix.md), [macOS](/doc/build-osx.md), [Windows](/doc/build-windows.md), [FreeBSD](/doc/build-freebsd.md), [NetBSD](/doc/build-netbsd.md), [OpenBSD](/doc/build-openbsd.md)
+See build instructions: [Unix](/doc/build-unix.md), [macOS](/doc/build-osx.md), [Windows](/doc/build-windows-msvc.md), [FreeBSD](/doc/build-freebsd.md), [NetBSD](/doc/build-netbsd.md), [OpenBSD](/doc/build-openbsd.md)
When following your systems build instructions, make sure to install the `Qt` dependencies.
To run:
```sh
-./src/qt/bitcoin-qt
+./build/src/qt/bitcoin-qt
```
## Files and Directories
@@ -99,7 +99,7 @@ sudo apt-get install qtcreator
#### Setup Qt Creator
1. Make sure you've installed all dependencies specified in your systems build instructions
-2. Follow the compile instructions for your system, run `./configure` with the `--enable-debug` flag
+2. Follow the compile instructions for your system, adding the `-DCMAKE_BUILD_TYPE=Debug` build flag
3. Start Qt Creator. At the start page, do: `New` -> `Import Project` -> `Import Existing Project`
4. Enter `bitcoin-qt` as the Project Name and enter the absolute path to `src/qt` as Location
5. Check over the file selection, you may need to select the `forms` directory (necessary if you intend to edit *.ui files)
diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp
index 70ed40b2a1..b0bc1f4806 100644
--- a/src/qt/askpassphrasedialog.cpp
+++ b/src/qt/askpassphrasedialog.cpp
@@ -44,6 +44,7 @@ AskPassphraseDialog::AskPassphraseDialog(Mode _mode, QWidget *parent, SecureStri
ui->passEdit1->hide();
setWindowTitle(tr("Encrypt wallet"));
break;
+ case UnlockMigration:
case Unlock: // Ask passphrase
ui->warningLabel->setText(tr("This operation needs your wallet passphrase to unlock the wallet."));
ui->passLabel2->hide();
@@ -80,7 +81,7 @@ void AskPassphraseDialog::setModel(WalletModel *_model)
void AskPassphraseDialog::accept()
{
SecureString oldpass, newpass1, newpass2;
- if (!model && mode != Encrypt)
+ if (!model && mode != Encrypt && mode != UnlockMigration)
return;
oldpass.reserve(MAX_PASSPHRASE_SIZE);
newpass1.reserve(MAX_PASSPHRASE_SIZE);
@@ -181,6 +182,10 @@ void AskPassphraseDialog::accept()
QMessageBox::critical(this, tr("Wallet unlock failed"), e.what());
}
break;
+ case UnlockMigration:
+ Assume(m_passphrase_out)->assign(oldpass);
+ QDialog::accept();
+ break;
case ChangePass:
if(newpass1 == newpass2)
{
@@ -224,6 +229,7 @@ void AskPassphraseDialog::textChanged()
case Encrypt: // New passphrase x2
acceptable = !ui->passEdit2->text().isEmpty() && !ui->passEdit3->text().isEmpty();
break;
+ case UnlockMigration:
case Unlock: // Old passphrase x1
acceptable = !ui->passEdit1->text().isEmpty();
break;
diff --git a/src/qt/askpassphrasedialog.h b/src/qt/askpassphrasedialog.h
index 370ea1de7e..c567c29428 100644
--- a/src/qt/askpassphrasedialog.h
+++ b/src/qt/askpassphrasedialog.h
@@ -26,6 +26,7 @@ public:
Encrypt, /**< Ask passphrase twice and encrypt */
Unlock, /**< Ask passphrase and unlock */
ChangePass, /**< Ask old passphrase + new passphrase twice */
+ UnlockMigration, /**< Ask passphrase for unlocking during migration */
};
explicit AskPassphraseDialog(Mode mode, QWidget *parent, SecureString* passphrase_out = nullptr);
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 6c5725533b..ec415f0bac 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -60,21 +60,6 @@
#include <QTranslator>
#include <QWindow>
-#if defined(QT_STATICPLUGIN)
-#include <QtPlugin>
-#if defined(QT_QPA_PLATFORM_XCB)
-Q_IMPORT_PLUGIN(QXcbIntegrationPlugin);
-#elif defined(QT_QPA_PLATFORM_WINDOWS)
-Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
-Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin);
-#elif defined(QT_QPA_PLATFORM_COCOA)
-Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin);
-Q_IMPORT_PLUGIN(QMacStylePlugin);
-#elif defined(QT_QPA_PLATFORM_ANDROID)
-Q_IMPORT_PLUGIN(QAndroidPlatformIntegrationPlugin)
-#endif
-#endif
-
// Declare meta types used for QMetaObject::invokeMethod
Q_DECLARE_METATYPE(bool*)
Q_DECLARE_METATYPE(CAmount)
@@ -212,7 +197,7 @@ void DebugMessageHandler(QtMsgType type, const QMessageLogContext& context, cons
{
Q_UNUSED(context);
if (type == QtDebugMsg) {
- LogPrint(BCLog::QT, "GUI: %s\n", msg.toStdString());
+ LogDebug(BCLog::QT, "GUI: %s\n", msg.toStdString());
} else {
LogPrintf("GUI: %s\n", msg.toStdString());
}
@@ -540,7 +525,7 @@ int GuiMain(int argc, char* argv[])
/// 2. Parse command-line options. We do this after qt in order to show an error if there are problems parsing these
// Command-line options take precedence:
- SetupServerArgs(gArgs);
+ SetupServerArgs(gArgs, init->canListenIpc());
SetupUIArgs(gArgs);
std::string error;
if (!gArgs.ParseParameters(argc, argv, error)) {
diff --git a/src/qt/bitcoin_locale.qrc b/src/qt/bitcoin_locale.qrc
index 8883134b83..e1f2697391 100644
--- a/src/qt/bitcoin_locale.qrc
+++ b/src/qt/bitcoin_locale.qrc
@@ -1,6 +1,5 @@
<!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>
@@ -104,6 +103,7 @@
<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 a43009d954..6d66c7473b 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -360,6 +360,7 @@ void BitcoinGUI::createActions()
m_migrate_wallet_action = new QAction(tr("Migrate Wallet"), this);
m_migrate_wallet_action->setEnabled(false);
m_migrate_wallet_action->setStatusTip(tr("Migrate a wallet"));
+ m_migrate_wallet_menu = new QMenu(this);
showHelpMessageAction = new QAction(tr("&Command-line options"), this);
showHelpMessageAction->setMenuRole(QAction::NoRole);
@@ -396,16 +397,15 @@ void BitcoinGUI::createActions()
connect(openAction, &QAction::triggered, this, &BitcoinGUI::openClicked);
connect(m_open_wallet_menu, &QMenu::aboutToShow, [this] {
m_open_wallet_menu->clear();
- for (const std::pair<const std::string, bool>& i : m_wallet_controller->listWalletDir()) {
- const std::string& path = i.first;
- QString name = path.empty() ? QString("["+tr("default wallet")+"]") : QString::fromStdString(path);
- // Menu items remove single &. Single & are shown when && is in
- // the string, but only the first occurrence. So replace only
- // the first & with &&.
- name.replace(name.indexOf(QChar('&')), 1, QString("&&"));
+ for (const auto& [path, info] : m_wallet_controller->listWalletDir()) {
+ const auto& [loaded, _] = info;
+ QString name = GUIUtil::WalletDisplayName(path);
+ // An single ampersand in the menu item's text sets a shortcut for this item.
+ // Single & are shown when && is in the string. So replace & with &&.
+ name.replace(QChar('&'), QString("&&"));
QAction* action = m_open_wallet_menu->addAction(name);
- if (i.second) {
+ if (loaded) {
// This wallet is already loaded
action->setEnabled(false);
continue;
@@ -456,10 +456,31 @@ void BitcoinGUI::createActions()
connect(m_close_all_wallets_action, &QAction::triggered, [this] {
m_wallet_controller->closeAllWallets(this);
});
- connect(m_migrate_wallet_action, &QAction::triggered, [this] {
- auto activity = new MigrateWalletActivity(m_wallet_controller, this);
- connect(activity, &MigrateWalletActivity::migrated, this, &BitcoinGUI::setCurrentWallet);
- activity->migrate(walletFrame->currentWalletModel());
+ connect(m_migrate_wallet_menu, &QMenu::aboutToShow, [this] {
+ m_migrate_wallet_menu->clear();
+ for (const auto& [wallet_name, info] : m_wallet_controller->listWalletDir()) {
+ const auto& [loaded, format] = info;
+
+ if (format != "bdb") { // Skip already migrated wallets
+ continue;
+ }
+
+ QString name = GUIUtil::WalletDisplayName(wallet_name);
+ // An single ampersand in the menu item's text sets a shortcut for this item.
+ // Single & are shown when && is in the string. So replace & with &&.
+ name.replace(QChar('&'), QString("&&"));
+ QAction* action = m_migrate_wallet_menu->addAction(name);
+
+ connect(action, &QAction::triggered, [this, wallet_name] {
+ auto activity = new MigrateWalletActivity(m_wallet_controller, this);
+ connect(activity, &MigrateWalletActivity::migrated, this, &BitcoinGUI::setCurrentWallet);
+ activity->migrate(wallet_name);
+ });
+ }
+ if (m_migrate_wallet_menu->isEmpty()) {
+ QAction* action = m_migrate_wallet_menu->addAction(tr("No wallets available"));
+ action->setEnabled(false);
+ }
});
connect(m_mask_values_action, &QAction::toggled, this, &BitcoinGUI::setPrivacy);
connect(m_mask_values_action, &QAction::toggled, this, &BitcoinGUI::enableHistoryAction);
@@ -692,6 +713,8 @@ void BitcoinGUI::setWalletController(WalletController* wallet_controller, bool s
m_open_wallet_action->setEnabled(true);
m_open_wallet_action->setMenu(m_open_wallet_menu);
m_restore_wallet_action->setEnabled(true);
+ m_migrate_wallet_action->setEnabled(true);
+ m_migrate_wallet_action->setMenu(m_migrate_wallet_menu);
GUIUtil::ExceptionSafeConnect(wallet_controller, &WalletController::walletAdded, this, &BitcoinGUI::addWallet);
connect(wallet_controller, &WalletController::walletRemoved, this, &BitcoinGUI::removeWallet);
@@ -772,7 +795,6 @@ void BitcoinGUI::setCurrentWallet(WalletModel* wallet_model)
}
}
updateWindowTitle();
- m_migrate_wallet_action->setEnabled(wallet_model->wallet().isLegacy());
}
void BitcoinGUI::setCurrentWalletBySelectorIndex(int index)
@@ -806,7 +828,6 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled)
openAction->setEnabled(enabled);
m_close_wallet_action->setEnabled(enabled);
m_close_all_wallets_action->setEnabled(enabled);
- m_migrate_wallet_action->setEnabled(enabled);
}
void BitcoinGUI::createTrayIcon()
diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp
index 6035647f1c..13773831a0 100644
--- a/src/qt/bitcoinstrings.cpp
+++ b/src/qt/bitcoinstrings.cpp
@@ -87,6 +87,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous "
"cluster of unconfirmed transactions."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Failed to remove snapshot chainstate dir (%s). Manually remove it before "
+"restarting.\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Failed to rename invalid peers.dat file. Please move or delete it and try "
"again."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -96,6 +99,11 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"File %s already exists. If you are sure this is what you want, move it out "
"of the way first."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Flushing block file to disk failed. This is likely the result of an I/O "
+"error."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Flushing undo file to disk failed. This is likely the result of an I/O error."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet "
"forbids connections to IPv4/IPv6"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -106,6 +114,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"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."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Maximum transaction weight is less than transaction weight without inputs"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Maximum transaction weight is too low, can not accommodate change output"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"More than one onion bind address is provided. Using %s for the automatically "
"created Tor onion service."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -130,9 +142,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not "
"provided"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"Please check that your computer's date and time are correct! If your clock "
-"is wrong, %s will not work properly."),
-QT_TRANSLATE_NOOP("bitcoin-core", ""
"Please contribute if you find %s useful. Visit %s for further information "
"about the software."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -144,6 +153,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Prune: last wallet synchronisation goes beyond pruned data. You need to -"
"reindex (download the whole blockchain again in case of pruned node)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Rename of '%s' -> '%s' failed. Cannot clean up the background chainstate "
+"leveldb directory."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Rename of '%s' -> '%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."),
@@ -156,6 +168,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"rebuild the block database if you are sure that your computer's date and "
"time are correct"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"The combination of the pre-selected inputs and the wallet automatic inputs "
+"selection exceeds the transaction maximum weight. Please try sending a "
+"smaller amount or manually consolidating your wallet's UTXOs"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"The inputs size exceeds the maximum weight. Please try sending a smaller "
"amount or manually consolidating your wallet's UTXOs"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -236,14 +252,25 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"You need to rebuild the database using -reindex to go back to unpruned "
"mode. This will redownload the entire blockchain"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Your computer's date and time appear to be more than %d minutes out of sync "
+"with the network, this may lead to consensus failure. After you've confirmed "
+"your computer's clock, this message should no longer appear when you restart "
+"your node. Without a restart, it should stop showing automatically after "
+"you've connected to a sufficient number of new outbound peers, which may "
+"take some time. You can inspect the `timeoffset` field of the `getpeerinfo` "
+"and `getnetworkinfo` RPC methods to get more info."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"\n"
"Unable to cleanup failed migration"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"\n"
"Unable to restore backup of wallet."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"whitebind may only be used for incoming connections (\"out\" was passed)"),
QT_TRANSLATE_NOOP("bitcoin-core", "%s is set very high!"),
QT_TRANSLATE_NOOP("bitcoin-core", "-maxmempool must be at least %d MB"),
-QT_TRANSLATE_NOOP("bitcoin-core", "A fatal internal error occurred, see debug.log for details"),
+QT_TRANSLATE_NOOP("bitcoin-core", "A fatal internal error occurred, see debug.log for details: "),
+QT_TRANSLATE_NOOP("bitcoin-core", "Assumeutxo data not found for the given blockhash '%s'."),
QT_TRANSLATE_NOOP("bitcoin-core", "Block verification was interrupted"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -%s address: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot set -forcednsseed to true when setting -dnsseed to false."),
@@ -251,6 +278,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Cannot set -peerblockfilters without -blockfi
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot write to data directory '%s'; check permissions."),
QT_TRANSLATE_NOOP("bitcoin-core", "Config setting for %s only applied on %s network when in [%s] section."),
QT_TRANSLATE_NOOP("bitcoin-core", "Copyright (C) %i-%i"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Corrupt block found indicating potential hardware failure."),
QT_TRANSLATE_NOOP("bitcoin-core", "Corrupted block database detected"),
QT_TRANSLATE_NOOP("bitcoin-core", "Could not find asmap file %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Could not parse asmap file %s"),
@@ -258,6 +286,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", "Elliptic curve cryptography sanity check failure. %s is shutting down."),
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"),
@@ -297,10 +326,17 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to write solvable wallet best b
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 connect best block (%s)."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Failed to disconnect block."),
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 read block."),
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", "Failed to write block."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Failed to write to block index database."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Failed to write to coin database."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Failed to write undo data."),
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."),
@@ -325,6 +361,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Loading P2P addresses…"),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading banlist…"),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading block index…"),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading wallet…"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Maximum transaction weight must be between %d and %d"),
QT_TRANSLATE_NOOP("bitcoin-core", "Missing amount"),
QT_TRANSLATE_NOOP("bitcoin-core", "Missing solving data for estimating transaction size"),
QT_TRANSLATE_NOOP("bitcoin-core", "Need to specify a port with -whitebind: '%s'"),
@@ -332,6 +369,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "No addresses available"),
QT_TRANSLATE_NOOP("bitcoin-core", "Not enough file descriptors available."),
QT_TRANSLATE_NOOP("bitcoin-core", "Not found pre-selected input %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Not solvable pre-selected input %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Only direction was set, no permissions: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Prune cannot be configured with a negative value."),
QT_TRANSLATE_NOOP("bitcoin-core", "Prune mode is incompatible with -txindex."),
QT_TRANSLATE_NOOP("bitcoin-core", "Pruning blockstore…"),
@@ -345,6 +383,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", "SQLiteDatabase: Unexpected application id. Ex
QT_TRANSLATE_NOOP("bitcoin-core", "Section [%s] is not recognized."),
QT_TRANSLATE_NOOP("bitcoin-core", "Settings file could not be read"),
QT_TRANSLATE_NOOP("bitcoin-core", "Settings file could not be written"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Signer did not echo address"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Signer echoed unexpected address %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Signer returned error: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Signing transaction failed"),
QT_TRANSLATE_NOOP("bitcoin-core", "Specified -walletdir \"%s\" does not exist"),
QT_TRANSLATE_NOOP("bitcoin-core", "Specified -walletdir \"%s\" is a relative path"),
@@ -352,10 +393,14 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Specified -walletdir \"%s\" is not a director
QT_TRANSLATE_NOOP("bitcoin-core", "Specified blocks directory \"%s\" does not exist."),
QT_TRANSLATE_NOOP("bitcoin-core", "Specified data directory \"%s\" does not exist."),
QT_TRANSLATE_NOOP("bitcoin-core", "Starting network threads…"),
+QT_TRANSLATE_NOOP("bitcoin-core", "System error while flushing: %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "System error while loading external block file: %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "System error while saving block to disk: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "The source code is available from %s."),
QT_TRANSLATE_NOOP("bitcoin-core", "The specified config file %s does not exist"),
QT_TRANSLATE_NOOP("bitcoin-core", "The transaction amount is too small to pay the fee"),
QT_TRANSLATE_NOOP("bitcoin-core", "The wallet will avoid paying less than the minimum relay fee."),
+QT_TRANSLATE_NOOP("bitcoin-core", "There is no ScriptPubKeyManager for this address"),
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."),
@@ -366,7 +411,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Transaction change output index out of range"
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"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Unable to allocate memory for -maxsigcachesize: '%s' MiB"),
QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer (bind returned error %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer. %s is probably already running."),
QT_TRANSLATE_NOOP("bitcoin-core", "Unable to create the PID file '%s': %s"),
@@ -382,6 +426,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Unknown address type '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Unknown change type '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Unknown network specified in -onlynet: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Unknown new rules activated (versionbit %i)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Unrecognised option \"%s\" provided in -test=<option>."),
QT_TRANSLATE_NOOP("bitcoin-core", "Unsupported global logging level %s=%s. Valid values: %s."),
QT_TRANSLATE_NOOP("bitcoin-core", "Unsupported logging category %s=%s."),
QT_TRANSLATE_NOOP("bitcoin-core", "User Agent comment (%s) contains unsafe characters."),
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index 2f3bad37e6..5c70c2695c 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -53,7 +53,7 @@ ClientModel::ClientModel(interfaces::Node& node, OptionsModel *_optionsModel, QO
connect(timer, &QTimer::timeout, [this] {
// no locking required at this point
// the following calls will acquire the required lock
- Q_EMIT mempoolSizeChanged(m_node.getMempoolSize(), m_node.getMempoolDynamicUsage());
+ Q_EMIT mempoolSizeChanged(m_node.getMempoolSize(), m_node.getMempoolDynamicUsage(), m_node.getMempoolMaxUsage());
Q_EMIT bytesChanged(m_node.getTotalBytesRecv(), m_node.getTotalBytesSent());
});
connect(m_thread, &QThread::finished, timer, &QObject::deleteLater);
@@ -123,6 +123,13 @@ int64_t ClientModel::getHeaderTipTime() const
return cachedBestHeaderTime;
}
+
+std::map<CNetAddr, LocalServiceInfo> ClientModel::getNetLocalAddresses() const
+{
+ return m_node.getNetLocalAddresses();
+}
+
+
int ClientModel::getNumBlocks() const
{
if (m_cached_num_blocks == -1) {
diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h
index 624056b5df..7d0e35e7f9 100644
--- a/src/qt/clientmodel.h
+++ b/src/qt/clientmodel.h
@@ -13,12 +13,15 @@
#include <sync.h>
#include <uint256.h>
+#include <netaddress.h>
+
class BanTableModel;
class CBlockIndex;
class OptionsModel;
class PeerTableModel;
class PeerTableSortProxy;
enum class SynchronizationState;
+struct LocalServiceInfo;
namespace interfaces {
class Handler;
@@ -68,6 +71,7 @@ public:
//! Return number of connections, default is in- and outbound (total)
int getNumConnections(unsigned int flags = CONNECTIONS_ALL) const;
+ std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses() const;
int getNumBlocks() const;
uint256 getBestBlockHash() EXCLUSIVE_LOCKS_REQUIRED(!m_cached_tip_mutex);
int getHeaderTipHeight() const;
@@ -113,7 +117,7 @@ private:
Q_SIGNALS:
void numConnectionsChanged(int count);
void numBlocksChanged(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType header, SynchronizationState sync_state);
- void mempoolSizeChanged(long count, size_t mempoolSizeInBytes);
+ void mempoolSizeChanged(long count, size_t mempoolSizeInBytes, size_t mempoolMaxSizeInBytes);
void networkActiveChanged(bool networkActive);
void alertsChanged(const QString &warnings);
void bytesChanged(quint64 totalBytesIn, quint64 totalBytesOut);
diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp
index 5e412bd6b1..febf1ee82f 100644
--- a/src/qt/coincontroldialog.cpp
+++ b/src/qt/coincontroldialog.cpp
@@ -174,22 +174,17 @@ void CoinControlDialog::showMenu(const QPoint &point)
contextMenuItem = item;
// disable some items (like Copy Transaction ID, lock, unlock) for tree roots in context menu
- if (item->data(COLUMN_ADDRESS, TxHashRole).toString().length() == 64) // transaction hash is 64 characters (this means it is a child node, so it is not a parent node in tree mode)
- {
+ auto txid{Txid::FromHex(item->data(COLUMN_ADDRESS, TxHashRole).toString().toStdString())};
+ if (txid) { // a valid txid means this is a child node, and not a parent node in tree mode
m_copy_transaction_outpoint_action->setEnabled(true);
- if (model->wallet().isLockedCoin(COutPoint(TxidFromString(item->data(COLUMN_ADDRESS, TxHashRole).toString().toStdString()), item->data(COLUMN_ADDRESS, VOutRole).toUInt())))
- {
+ if (model->wallet().isLockedCoin(COutPoint(*txid, item->data(COLUMN_ADDRESS, VOutRole).toUInt()))) {
lockAction->setEnabled(false);
unlockAction->setEnabled(true);
- }
- else
- {
+ } else {
lockAction->setEnabled(true);
unlockAction->setEnabled(false);
}
- }
- else // this means click on parent node in tree mode -> disable all
- {
+ } else { // this means click on parent node in tree mode -> disable all
m_copy_transaction_outpoint_action->setEnabled(false);
lockAction->setEnabled(false);
unlockAction->setEnabled(false);
@@ -240,7 +235,7 @@ void CoinControlDialog::lockCoin()
if (contextMenuItem->checkState(COLUMN_CHECKBOX) == Qt::Checked)
contextMenuItem->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked);
- COutPoint outpt(TxidFromString(contextMenuItem->data(COLUMN_ADDRESS, TxHashRole).toString().toStdString()), contextMenuItem->data(COLUMN_ADDRESS, VOutRole).toUInt());
+ COutPoint outpt(Txid::FromHex(contextMenuItem->data(COLUMN_ADDRESS, TxHashRole).toString().toStdString()).value(), contextMenuItem->data(COLUMN_ADDRESS, VOutRole).toUInt());
model->wallet().lockCoin(outpt, /* write_to_db = */ true);
contextMenuItem->setDisabled(true);
contextMenuItem->setIcon(COLUMN_CHECKBOX, platformStyle->SingleColorIcon(":/icons/lock_closed"));
@@ -250,7 +245,7 @@ void CoinControlDialog::lockCoin()
// context menu action: unlock coin
void CoinControlDialog::unlockCoin()
{
- COutPoint outpt(TxidFromString(contextMenuItem->data(COLUMN_ADDRESS, TxHashRole).toString().toStdString()), contextMenuItem->data(COLUMN_ADDRESS, VOutRole).toUInt());
+ COutPoint outpt(Txid::FromHex(contextMenuItem->data(COLUMN_ADDRESS, TxHashRole).toString().toStdString()).value(), contextMenuItem->data(COLUMN_ADDRESS, VOutRole).toUInt());
model->wallet().unlockCoin(outpt);
contextMenuItem->setDisabled(false);
contextMenuItem->setIcon(COLUMN_CHECKBOX, QIcon());
@@ -340,9 +335,10 @@ void CoinControlDialog::radioListMode(bool checked)
// checkbox clicked by user
void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column)
{
- if (column == COLUMN_CHECKBOX && item->data(COLUMN_ADDRESS, TxHashRole).toString().length() == 64) // transaction hash is 64 characters (this means it is a child node, so it is not a parent node in tree mode)
- {
- COutPoint outpt(TxidFromString(item->data(COLUMN_ADDRESS, TxHashRole).toString().toStdString()), item->data(COLUMN_ADDRESS, VOutRole).toUInt());
+ if (column != COLUMN_CHECKBOX) return;
+ auto txid{Txid::FromHex(item->data(COLUMN_ADDRESS, TxHashRole).toString().toStdString())};
+ if (txid) { // a valid txid means this is a child node, and not a parent node in tree mode
+ COutPoint outpt(*txid, item->data(COLUMN_ADDRESS, VOutRole).toUInt());
if (item->checkState(COLUMN_CHECKBOX) == Qt::Unchecked)
m_coin_control.UnSelect(outpt);
diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui
index eeea53864a..eccea14318 100644
--- a/src/qt/forms/debugwindow.ui
+++ b/src/qt/forms/debugwindow.ui
@@ -249,6 +249,41 @@
</widget>
</item>
<item row="9" column="0">
+ <widget class="QLabel" name="label_14">
+ <property name="text">
+ <string>Local Addresses</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="1" colspan="2">
+ <widget class="QLabel" name="localAddresses">
+ <property name="cursor">
+ <cursorShape>IBeamCursor</cursorShape>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string notr="true">N/A</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ <property name="toolTip">
+ <string>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="0">
<widget class="QLabel" name="label_10">
<property name="font">
<font>
@@ -261,14 +296,14 @@
</property>
</widget>
</item>
- <item row="10" column="0">
+ <item row="11" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Current block height</string>
</property>
</widget>
</item>
- <item row="10" column="1" colspan="2">
+ <item row="11" column="1" colspan="2">
<widget class="QLabel" name="numberOfBlocks">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -284,14 +319,14 @@
</property>
</widget>
</item>
- <item row="11" column="0">
+ <item row="12" column="0">
<widget class="QLabel" name="labelLastBlockTime">
<property name="text">
<string>Last block time</string>
</property>
</widget>
</item>
- <item row="11" column="1" colspan="2">
+ <item row="12" column="1" colspan="2">
<widget class="QLabel" name="lastBlockTime">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -307,7 +342,7 @@
</property>
</widget>
</item>
- <item row="12" column="0">
+ <item row="13" column="0">
<widget class="QLabel" name="labelMempoolTitle">
<property name="font">
<font>
@@ -320,14 +355,14 @@
</property>
</widget>
</item>
- <item row="13" column="0">
+ <item row="14" column="0">
<widget class="QLabel" name="labelNumberOfTransactions">
<property name="text">
<string>Current number of transactions</string>
</property>
</widget>
</item>
- <item row="13" column="1">
+ <item row="14" column="1">
<widget class="QLabel" name="mempoolNumberTxs">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -343,14 +378,14 @@
</property>
</widget>
</item>
- <item row="14" column="0">
+ <item row="15" column="0">
<widget class="QLabel" name="labelMemoryUsage">
<property name="text">
<string>Memory usage</string>
</property>
</widget>
</item>
- <item row="14" column="1">
+ <item row="15" column="1">
<widget class="QLabel" name="mempoolSize">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -366,7 +401,7 @@
</property>
</widget>
</item>
- <item row="12" column="2" rowspan="3">
+ <item row="13" column="2" rowspan="3">
<layout class="QVBoxLayout" name="verticalLayoutDebugButton">
<property name="spacing">
<number>3</number>
@@ -406,7 +441,7 @@
</item>
</layout>
</item>
- <item row="15" column="0">
+ <item row="16" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -984,42 +1019,117 @@
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
- <item>
- <widget class="QLabel" name="peerHeading">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>32</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
- </property>
- <property name="cursor">
- <cursorShape>IBeamCursor</cursorShape>
- </property>
- <property name="text">
- <string>Select a peer to view detailed information.</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignHCenter|Qt::AlignTop</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
- </property>
- </widget>
- </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_8">
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="peerHeading">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="cursor">
+ <cursorShape>IBeamCursor</cursorShape>
+ </property>
+ <property name="text">
+ <string>Select a peer to view detailed information.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignHCenter|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="hidePeersDetail" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <widget class="QToolButton" name="hidePeersDetailButton">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>32</width>
+ <height>32</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Hide Peers Detail</string>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="text">
+ <string />
+ </property>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/remove</normaloff>
+ :/icons/remove
+ </iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+X</string>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </item>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui
index 99fb238772..2056b2cccd 100644
--- a/src/qt/forms/optionsdialog.ui
+++ b/src/qt/forms/optionsdialog.ui
@@ -105,7 +105,7 @@
<item>
<widget class="QLabel" name="databaseCacheLabel">
<property name="toolTip">
- <string extracomment="Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.">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.</string>
+ <string extracomment="Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.">Maximum database cache size. Make sure you have enough RAM. 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.</string>
</property>
<property name="text">
<string>Size of &amp;database cache</string>
@@ -328,10 +328,10 @@
<item>
<widget class="QCheckBox" name="mapPortNatpmp">
<property name="toolTip">
- <string>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.</string>
+ <string>Automatically open the Bitcoin client port on the router. This only works when your router supports PCP or NAT-PMP and it is enabled. The external port could be random.</string>
</property>
<property name="text">
- <string>Map port using NA&amp;T-PMP</string>
+ <string>Map port using PCP or NA&amp;T-PMP</string>
</property>
</widget>
</item>
diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h
index 0386689baf..30ffa302a4 100644
--- a/src/qt/guiconstants.h
+++ b/src/qt/guiconstants.h
@@ -50,6 +50,7 @@ static const int TOOLTIP_WRAP_THRESHOLD = 80;
#define QAPP_ORG_DOMAIN "bitcoin.org"
#define QAPP_APP_NAME_DEFAULT "Bitcoin-Qt"
#define QAPP_APP_NAME_TESTNET "Bitcoin-Qt-testnet"
+#define QAPP_APP_NAME_TESTNET4 "Bitcoin-Qt-testnet4"
#define QAPP_APP_NAME_SIGNET "Bitcoin-Qt-signet"
#define QAPP_APP_NAME_REGTEST "Bitcoin-Qt-regtest"
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index ee841ce626..2369f6b631 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -2,8 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
-
#include <qt/guiutil.h>
#include <qt/bitcoinaddressvalidator.h>
@@ -117,6 +115,7 @@ static std::string DummyAddress(const CChainParams &params)
break;
case ChainType::SIGNET:
case ChainType::TESTNET:
+ case ChainType::TESTNET4:
addr = "tb1p35yvjel7srp783ztf8v6jdra7dhfzk5jaun8xz2qp6ws7z80n4tqa6qnlg";
break;
case ChainType::REGTEST:
@@ -406,19 +405,26 @@ bool isObscured(QWidget *w)
void bringToFront(QWidget* w)
{
-#ifdef Q_OS_MACOS
- ForceActivation();
-#endif
-
if (w) {
- // activateWindow() (sometimes) helps with keyboard focus on Windows
- if (w->isMinimized()) {
- w->showNormal();
- } else {
+ if (QGuiApplication::platformName() == "wayland") {
+ auto flags = w->windowFlags();
+ w->setWindowFlags(flags|Qt::WindowStaysOnTopHint);
w->show();
+ w->setWindowFlags(flags);
+ w->show();
+ } else {
+#ifdef Q_OS_MACOS
+ ForceActivation();
+#endif
+ // activateWindow() (sometimes) helps with keyboard focus on Windows
+ if (w->isMinimized()) {
+ w->showNormal();
+ } else {
+ w->show();
+ }
+ w->activateWindow();
+ w->raise();
}
- w->activateWindow();
- w->raise();
}
}
@@ -918,29 +924,24 @@ void LogQtInfo()
#else
const std::string qt_link{"dynamic"};
#endif
-#ifdef QT_STATICPLUGIN
- const std::string plugin_link{"static"};
-#else
- const std::string plugin_link{"dynamic"};
-#endif
- LogPrintf("Qt %s (%s), plugin=%s (%s)\n", qVersion(), qt_link, QGuiApplication::platformName().toStdString(), plugin_link);
+ LogInfo("Qt %s (%s), plugin=%s\n", qVersion(), qt_link, QGuiApplication::platformName().toStdString());
const auto static_plugins = QPluginLoader::staticPlugins();
if (static_plugins.empty()) {
- LogPrintf("No static plugins.\n");
+ LogInfo("No static plugins.\n");
} else {
- LogPrintf("Static plugins:\n");
+ LogInfo("Static plugins:\n");
for (const QStaticPlugin& p : static_plugins) {
QJsonObject meta_data = p.metaData();
const std::string plugin_class = meta_data.take(QString("className")).toString().toStdString();
const int plugin_version = meta_data.take(QString("version")).toInt();
- LogPrintf(" %s, version %d\n", plugin_class, plugin_version);
+ LogInfo(" %s, version %d\n", plugin_class, plugin_version);
}
}
- LogPrintf("Style: %s / %s\n", QApplication::style()->objectName().toStdString(), QApplication::style()->metaObject()->className());
- LogPrintf("System: %s, %s\n", QSysInfo::prettyProductName().toStdString(), QSysInfo::buildAbi().toStdString());
+ LogInfo("Style: %s / %s\n", QApplication::style()->objectName().toStdString(), QApplication::style()->metaObject()->className());
+ LogInfo("System: %s, %s\n", QSysInfo::prettyProductName().toStdString(), QSysInfo::buildAbi().toStdString());
for (const QScreen* s : QGuiApplication::screens()) {
- LogPrintf("Screen: %s %dx%d, pixel ratio=%.1f\n", s->name().toStdString(), s->size().width(), s->size().height(), s->devicePixelRatio());
+ LogInfo("Screen: %s %dx%d, pixel ratio=%.1f\n", s->name().toStdString(), s->size().width(), s->size().height(), s->devicePixelRatio());
}
}
@@ -1007,4 +1008,13 @@ void ShowModalDialogAsynchronously(QDialog* dialog)
dialog->show();
}
+QString WalletDisplayName(const QString& name)
+{
+ return name.isEmpty() ? "[" + QObject::tr("default wallet") + "]" : name;
+}
+
+QString WalletDisplayName(const std::string& name)
+{
+ return WalletDisplayName(QString::fromStdString(name));
+}
} // namespace GUIUtil
diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h
index 3e28e54557..4525198794 100644
--- a/src/qt/guiutil.h
+++ b/src/qt/guiutil.h
@@ -436,6 +436,9 @@ namespace GUIUtil
return false;
}
+ QString WalletDisplayName(const std::string& name);
+ QString WalletDisplayName(const QString& name);
+
} // namespace GUIUtil
#endif // BITCOIN_QT_GUIUTIL_H
diff --git a/src/qt/locale/bitcoin_af.ts b/src/qt/locale/bitcoin_af.ts
deleted file mode 100644
index cc4eefbe31..0000000000
--- a/src/qt/locale/bitcoin_af.ts
+++ /dev/null
@@ -1,315 +0,0 @@
-<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 502acb9879..c02049b984 100644
--- a/src/qt/locale/bitcoin_am.ts
+++ b/src/qt/locale/bitcoin_am.ts
@@ -176,6 +176,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ቦርሳዎ áˆáˆµáŒ¢áˆ­ ተደርጓáˆ</translation>
</message>
<message>
+ <source>Back</source>
+ <translation type="unfinished">ተመለስ</translation>
+ </message>
+ <message>
<source>Wallet to be encrypted</source>
<translation type="unfinished">ለመመስጠር የተዘጋጀ ዋሌት</translation>
</message>
@@ -254,6 +258,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ስህተትᥠ%1</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>
@@ -299,7 +315,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">መደበኛ ዋሌት</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -359,6 +379,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;ተቀበáˆ</translation>
</message>
<message>
+ <source>&amp;Change Passphrase…</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;File</source>
<translation type="unfinished">&amp;á‹á‹­áˆ</translation>
</message>
@@ -402,8 +430,12 @@ 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>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">ዋሌትዎን á‹«á‹›á‹áˆ©</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">ዋሌትዎን á‹«á‹›á‹áˆ©</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -423,6 +455,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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">አዲስ ዋሌት መáጠር አáˆá‰°á‰»áˆˆáˆá£ ሶáትዌሩ የተቀናበረዠያለ ስኩላይት ድጋá áŠá‹ (ለገላጭ ዋሌቶች ያስáˆáˆáŒ‹áˆ)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">ስህተትᥠ%1</translation>
</message>
@@ -485,12 +525,51 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>OpenWalletActivity</name>
+ <name>MigrateWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">መደበኛ ዋሌት</translation>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">ዋሌት á‹«á‹›á‹áˆ©</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-2 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</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">ዋሌት ክáˆá‰µ</translation>
@@ -506,6 +585,14 @@ 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">አዲሱን ዋሌትዎን ለመáጠር አንድ እርáˆáŒƒ ይቀርዎታáˆ</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>
@@ -594,6 +681,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>OptionsDialog</name>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">በአጠቃላይ እይታ ትር á‹áˆµáŒ¥ ያለ áŠá‹°áˆ</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">ስህተት</translation>
</message>
@@ -606,6 +697,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">%1 ወደ %2 á‹­áˆáŠ«áˆ</translation>
+ </message>
+ </context>
+<context>
<name>PeerTableModel</name>
<message>
<source>Address</source>
@@ -614,6 +712,56 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">የአካባቢ አድራሻዎች</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">የእርስዎ Bitcoin ኖድ ከሌሎች ኖዶች ጋር ለመገናኘት በአáˆáŠ‘ ጊዜ እየተጠቀመበት ያለዠየአá‹á‰³áˆ¨ መረብ አድራሻá¢</translation>
+ </message>
+ <message>
+ <source>Hide Peers Detail</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>Session ID</source>
+ <translation type="unfinished">የክáለ ጊዜ መለያ</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">የBIP324 ክáለ ጊዜ መለያ ሕብረá‰áˆáŠ በሄክስá¢</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>Node window - [%1]</source>
+ <translation type="unfinished">የኖድ መስኮት - [%1]</translation>
+ </message>
+ </context>
+<context>
<name>ReceiveRequestDialog</name>
<message>
<source>Amount:</source>
@@ -665,6 +813,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Copy fee</source>
<translation type="unfinished">ክáያዠቅዳ</translation>
</message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 ከዋሌት %2'</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -678,6 +830,17 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">ወደ እáŠáˆ­áˆ± የተላኩ ቢትኮይን መቀበሠእንደሚችሉ ለማረጋገጥ ከርስዎ (P2PKH) አድራሻዎች ጋር መáˆá‹•áŠ­á‰¶á‰½áŠ•/ስáˆáˆáŠá‰¶á‰½áŠ• መáˆáˆ¨áˆ ይችላሉᢠየማስገር ጥቃቶች እርስዎን ማንáŠá‰µá‹ŽáŠ• በእáŠáˆ± ላይ እንዲáˆáˆ­áˆ™ ሊያታáˆáˆ‰á‹Žá‰µ ስለሚችሉ áŒáˆáŒ½ á‹«áˆáˆ†áŠ ወይሠበዘáˆá‰€á‹° ላለመáˆáˆ¨áˆ ይጠንቀá‰á¢ የተስማሙባቸá‹áŠ• ሙሉ á‹áˆ­á‹áˆ­ መáŒáˆˆáŒ«á‹Žá‰½ ብቻ á‹­áˆáˆ­áˆ™á¢</translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">የገባዠአድራሻ የቅርስ (P2PKH) á‰áˆáን አያመለክትáˆá¢ ለሴáŒá‹Šá‰µ እና ሌሎች P2PKH ላáˆáˆ†áŠ‘ የአድራሻ አይáŠá‰¶á‰½ የመáˆá‹•áŠ­á‰µ መáˆáˆ¨áˆ በዚህ የ%1 ስሪት á‹áˆµáŒ¥ አይደገááˆá¢ እባክዎ አድራሻá‹áŠ• ያረጋáŒáŒ¡ እና እንደገና ይሞክሩá¢</translation>
+ </message>
+ </context>
+<context>
<name>TransactionDesc</name>
<message>
<source>Date</source>
@@ -691,6 +854,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (ማረጋገጫዠአáˆá‰°áˆ¨áŒ‹áŒˆáŒ áˆ)</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">መጠን</translation>
</message>
@@ -748,10 +915,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>WalletModel</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">መደበኛ ዋሌት</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">ከክáá‹«-áŠáƒ PSBT ወደ ቅንጥብ ሰሌዳ ተቀድቷáˆá¢</translation>
</message>
-</context>
+ <message>
+ <source>Signer error</source>
+ <translation type="unfinished">የáˆáˆ«áˆš ስህተት</translation>
+ </message>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_ar.ts b/src/qt/locale/bitcoin_ar.ts
index e58c221a86..86fef05136 100644
--- a/src/qt/locale/bitcoin_ar.ts
+++ b/src/qt/locale/bitcoin_ar.ts
@@ -2,275 +2,17 @@
<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">‫هذه عناوين البتكوين الخاصة بك لإرسال المدÙوعات. تأكد دائما من القيم المدخلة ومن العنوان المستلم قبل الارسال.‬</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">&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;ستÙقد كل البتكوين&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>
+ <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">‫تحذير: Ù…Ùتاح الحرو٠الكبيرة Ù…Ùعل!‬</translation>
- </message>
-</context>
-<context>
- <name>BanTableModel</name>
- <message>
- <source>IP/Netmask</source>
- <translation type="unfinished">‫بروتوكول الانترنت/قناع الشبكة‬</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>Runaway exception</source>
- <translation type="unfinished">‫‫Runaway exception‬</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>
<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>
@@ -279,10 +21,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">‫%1 لم يغلق بامان بعد…‬</translation>
</message>
<message>
- <source>unknown</source>
- <translation type="unfinished">غير معروÙ</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">‫القيمة‬</translation>
</message>
@@ -443,6 +181,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ‫جيجابايت‬</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">‫محÙظة اÙتراضية‬</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -528,10 +270,6 @@ 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">&amp; خيارات</translation>
- </message>
- <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp; تشÙير المحÙظة</translation>
</message>
@@ -644,7 +382,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">خل٠%1</translation>
+ <translation type="unfinished">‫متأخر‬ %1</translation>
</message>
<message>
<source>Catching up…</source>
@@ -652,11 +390,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">تم توليد الكتلة المستقبلة الأخيرة منذ %1.</translation>
+ <translation type="unfinished">‫آخر طابق مستلم تم بناءه قبل %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">المعاملات بعد ذلك لن تكون مريئة بعد.</translation>
+ <translation type="unfinished">‫المعاملات بعد هذه لن تكون ظاهرة Ùورا.‬</translation>
</message>
<message>
<source>Error</source>
@@ -672,35 +410,39 @@ 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>
- <translation type="unfinished">تحميل معاملة بتكوين الموقعة جزئيًا</translation>
+ <translation type="unfinished">‫تحميل معاملة بتكوين موقعة جزئيًا (PSBT)‬</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>
+ <translation type="unfinished">‫تحميل معاملة بتكوين موقعة جزئيًا ‫(‫PSBT) من الحاÙظة‬</translation>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">ناÙذة Node </translation>
+ <translation type="unfinished">‫ناÙذة النود‬</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">اÙتح وحدة التحكم ÙÙŠ تصحيح أخطاء node والتشخيص</translation>
+ <translation type="unfinished">‫اÙتح وحدة التحكم ÙÙŠ تصحيح الأخطاء والتشخيص للنود‬</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;عناوين الإرسال</translation>
+ <translation type="unfinished">‫&amp;عناوين الإرسال‬</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;عناوين الإستقبال</translation>
+ <translation type="unfinished">‫&amp;عناوين الإستلام‬</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">اÙتح عملة بيتكوين: URI</translation>
+ <translation type="unfinished">‫اÙتح رابط بتكوين: URI‬</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -708,7 +450,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">اÙتح المحÙظة</translation>
+ <translation type="unfinished">‫اÙتح محÙظة‬</translation>
</message>
<message>
<source>Close wallet</source>
@@ -726,7 +468,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">إغلاق جميع المحاÙظ ...</translation>
+ <translation type="unfinished">‫إغلاق جميع المحاÙظ‬</translation>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
@@ -741,10 +483,6 @@ 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>No wallets available</source>
<translation type="unfinished">‫لا يوجد محÙظة متاحة‬</translation>
</message>
@@ -759,18 +497,13 @@ 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>
</message>
<message>
<source>&amp;Window</source>
- <translation type="unfinished">‫&amp;ناÙذة‬</translation>
+ <translation type="unfinished">&amp;ناÙذة</translation>
</message>
<message>
<source>Zoom</source>
@@ -833,108 +566,13 @@ Signing is only possible with addresses of the type 'legacy'.</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
-</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>
<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>
@@ -1032,19 +670,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished">‫يمكن يزيد أو ينقص %1 ساتوشي لكل مدخل.‬</translation>
+ <translation type="unfinished">يمكن أن يختل٠+/- %1 من ساتوشي(s) لكل إدخال.</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ <translation type="unfinished">(بدون وسم)</translation>
</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>
@@ -1057,11 +695,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ <translation type="unfinished">Ùشل إنشاء المحÙظة</translation>
</message>
<message>
<source>Create wallet warning</source>
@@ -1071,227 +709,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Can't list signers</source>
<translation type="unfinished">لا يمكن سرد الموقعين</translation>
</message>
- <message>
- <source>Too many external signers found</source>
- <translation type="unfinished">‫تم العثور على موقّعين خارجيين ÙƒÙثر (Too Many)‬</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>
<context>
<name>WalletController</name>
<message>
- <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>
- <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">تعطيل المÙاتيح الخاصة لهذه المحÙظة. لن تحتوي المحاÙظ ذات المÙاتيح الخاصة المعطلة على Ù…Ùاتيح خاصة ولا يمكن أن تحتوي على Ù…Ùتاح 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>
- <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 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>
- <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>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;العنوان</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">عنوان إرسال جديد</translation>
+ <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>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>
- <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>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>
<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">
@@ -1300,7 +727,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n GB of space available</numerusform>
<numerusform>%n GB of space available</numerusform>
<numerusform>%n GB of space available</numerusform>
- <numerusform>‫‫%n جيجابايت من المساحة متوÙرة</numerusform>
+ <numerusform>%n GB of space available</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1311,7 +738,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>(of %n GB needed)</numerusform>
<numerusform>(of %n GB needed)</numerusform>
<numerusform>(of %n GB needed)</numerusform>
- <numerusform>‫(مطلوب %n جيجابايت)‬</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1322,17 +749,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>(%n GB needed for full chain)</numerusform>
<numerusform>(%n GB needed for full chain)</numerusform>
<numerusform>(%n GB needed for full chain)</numerusform>
- <numerusform>‫( مطلوب %n جيجابايت لكامل المتتالية)‬</numerusform>
+ <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">سيتم تخزين %1 جيجابايت على الأقل من البيانات ÙÙŠ هذا الدليل، وستنمو مع الوقت.</translation>
- </message>
- <message>
- <source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">سيتم تخزين %1 جيجابايت تقريباً من البيانات ÙÙŠ هذا الدليل.</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>
@@ -1345,211 +764,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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 بتنزيل نسخة من سلسلة كتل بتكوين وتخزينها.</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> GB</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 سنبدأ التحميل ومعالجة كامل %4 الطوابق المتتالية (%2 GB) بدأً من أوائل العمليات ÙÙŠ %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>
- <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>Esc</source>
- <translation type="unfinished">خروج</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>URI:</source>
- <translation type="unfinished">العنوان:</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>
<context>
<name>OptionsDialog</name>
<message>
- <source>Options</source>
- <translation type="unfinished">خيارات</translation>
- </message>
- <message>
- <source>&amp;Main</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>&amp;Start %1 on system login</source>
- <translation type="unfinished">تشغيل %1 عند الدخول إلى النظام</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;قاعدة البيانات‬</translation>
- </message>
- <message>
- <source>Number of script &amp;verification threads</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>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
- <translation type="unfinished">إظهار ما إذا كان وكيل SOCKS5 الاÙتراضي الموÙر تم استخدامه للوصول إلى الأقران عبر نوع الشبكة هذا.</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">‫التصغير بدلاً من الخروج من التطبيق عند إغلاق الناÙذة. عند تÙعيل هذا الخيار، سيتم إغلاق التطبيق Ùقط بعد النقر على خروج من القائمة المنسدلة.‬</translation>
- </message>
- <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">‫التÙضيلات المعينة عن طريق سطر الأوامر لها أولوية أكبر وتتجاوز التÙضيلات المختارة هنا:‬</translation>
</message>
@@ -1639,11 +857,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">‫تÙعيل التحكم ب &amp;المعاملات الموقعة جزئيا‬</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">‫خيار عرض التحكم بالمعاملات الموقعة جزئيا.‬</translation>
- </message>
- <message>
<source>External Signer (e.g. hardware wallet)</source>
<translation type="unfinished">‫جهاز التوقيع الخارجي (مثل المحÙظة الخارجية)‬</translation>
</message>
@@ -2156,867 +1369,47 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;احÙظ الصورة...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;نسخ الصورة</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">‫العنوان الناتج طويل جدًا، حاول أن تقلص النص للمذكرة / الرسالة.‬</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">‫خطأ ÙÙŠ ترميز العنوان إلى رمز الاستجابة السريع QR.‬</translation>
- </message>
- <message>
- <source>QR code support not available.</source>
- <translation type="unfinished">‫دعم رمز الاستجابة السريع QR غير متوÙر.‬</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">Ø­Ùظ رمز الاستجابة السريع QR</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;المعلومات‬</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;إعادة تعيين‬</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;أقران‬</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>Version</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">‫‫Mapped 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>
- </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>
- </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>
- </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>
- </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>
- </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>
- </message>
- <message>
- <source>User Agent</source>
- <translation type="unfinished">وكيل المستخدم</translation>
- </message>
- <message>
<source>Node window</source>
- <translation type="unfinished">ناÙذة Node </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>
+ <translation type="unfinished">‫ناÙذة النود‬</translation>
</message>
- <message>
- <source>Services</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>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">وقت الرنين</translation>
- </message>
- <message>
- <source>The duration of a currently outstanding ping.</source>
- <translation type="unfinished">مدة الرنين المعلقة حالياً.</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">انتظار الرنين</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">أقل رنين</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;Ùتح‬</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">‫&amp;سطر الأوامر‬</translation>
- </message>
- <message>
- <source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;حركة الشبكة</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>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>Ctrl++</source>
- <extracomment>Main 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>&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>
- <message>
- <source>1 &amp;hour</source>
- <translation type="unfinished">1 &amp;ساعة</translation>
- </message>
- <message>
- <source>1 d&amp;ay</source>
- <translation type="unfinished">ي&amp;وم 1</translation>
- </message>
- <message>
- <source>1 &amp;week</source>
- <translation type="unfinished">1 &amp; اسبوع</translation>
- </message>
- <message>
- <source>1 &amp;year</source>
- <translation type="unfinished">1 &amp; سنة</translation>
- </message>
- <message>
- <source>&amp;Unban</source>
- <translation type="unfinished">&amp;رÙع الحظر</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>Executing command using "%1" wallet</source>
- <translation type="unfinished">‫تنÙيذ الأوامر باستخدام "%1" من المحÙظة‬</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;القيمة</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;مذكرة :</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">&amp;رسالة:</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;إنشاء عناوين استلام جديدة</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;مذكرة‬</translation>
- </message>
- <message>
- <source>Copy &amp;message</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>
- <message>
- <source>Could not generate new %1 address</source>
- <translation type="unfinished">تعذر توليد عنوان %1 جديد.</translation>
- </message>
-</context>
+ </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;العنوان</translation>
- </message>
- <message>
- <source>&amp;Verify</source>
- <translation type="unfinished">&amp;تحقق</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;احÙظ الصورة...</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>
<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>
+ <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>
<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">لكل كيلوبايت</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;مستلم</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">‫حدد الرسوم المخصصة لكل كيلوبايت (١٠٠٠ بايت) من حجم العملية الاÙتراضي.
-
-ملاحظة: بما أن الرسوم تحتسب لكل بايت، معدل الرسوم Ù„ “ ١٠٠ ساتوشي لكل كيلوبايت اÙتراضي†لعملية بحجم ٥٠٠ بايت اÙتراضي (نص٠كيلوبايت اÙتراضي) ستكون ٥٠ ساتوشي Ùقط.‬</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">‫يمكنك زيادة رسوم المعاملة بعد إرسالها عند تÙعيل الاستبدال بواسطة الرسوم (BIP-125). نوصي بوضع رسوم أعلى اذا لم يتم التÙعيل لتÙادي مخاطر تأخير العملية.‬</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">مسح الكل</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;رسال‬</translation>
- </message>
- <message>
<source>Copy quantity</source>
<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>
- <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;شاء من غير توقيع‬</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>
+ <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>Partially Signed Transaction (Binary)</source>
@@ -3024,90 +1417,9 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>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>
- </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>
- </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>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">
@@ -3116,333 +1428,16 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
<numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
<numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
- <numerusform>‫الوقت التقديري للنÙاذ خلال %n طوابق.‬</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</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;القيمة</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">ادÙع &amp;الى :</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;مذكرة :</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;رح الرسوم من القيمة‬</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">‫الرسالة يتم إرÙاقها مع البتكوين: الرابط سيتم تخزينه مع العملية لك للرجوع إليه. ملاحظة: لن يتم إرسال هذه الرسالة عبر شبكة البتكوين.‬</translation>
- </message>
-</context>
-<context>
- <name>SendConfirmationDialog</name>
- <message>
- <source>Send</source>
- <translation type="unfinished">إرسال</translation>
- </message>
- <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;توقيع الرسالة</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;الرسالة</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">‫إعادة تعيين كاÙØ© حقول توقيع الرسالة‬</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">مسح الكل</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">‫&amp;تحقق من الرسالة‬</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">أدخل عنوان المتلقي، راسل (تأكد من نسخ Ùواصل الأسطر، الÙراغات، الخ.. تماما) والتوقيع أسÙله لتأكيد الرسالة. كن حذرا من عدم قراءة داخل التوقيع أكثر مما هو موقع بالرسالة Ù†Ùسها، لتجنب خداعك بهجوم man-in-the-middle. لاحظ أنه هذا لاثبات أن الجهة الموقعة تستقبل مع العنوان Ùقط، لا تستطيع اثبات الارسال لأي معاملة.</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;الرسالة</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>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">‫(انقر q للاغلاق والمواصلة لاحقا)‬</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">‫انقر q للاغلاق‬</translation>
- </message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
- <message>
- <source>kB/s</source>
- <translation type="unfinished">كيلوبايت/ثانية</translation>
+ <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>
- <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>
- </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>
- </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 numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -3455,348 +1450,35 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</translation>
</message>
<message>
- <source>not accepted</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">‫رقم العملية‬</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>Merchant</source>
- <translation type="unfinished">تاجر</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>
+ <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>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>
<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">قيد التأكيد (%1 من %2 تأكيد موصى به)</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>
+ <translation type="unfinished">(بدون وسم)</translation>
</message>
- <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>
<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>
- <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 transaction &amp;ID</source>
- <translation type="unfinished">‫نسخ &amp;معر٠العملية‬</translation>
- </message>
- <message>
- <source>Copy &amp;raw transaction</source>
- <translation type="unfinished">‫نسخ &amp;النص الأصلي للعملية‬</translation>
- </message>
- <message>
- <source>Copy full transaction &amp;details</source>
- <translation type="unfinished">‫نسخ كامل &amp;تÙاصيل العملية‬</translation>
- </message>
- <message>
- <source>&amp;Show transaction details</source>
- <translation type="unfinished">‫&amp; اظهر تÙاصيل العملية‬</translation>
- </message>
- <message>
- <source>Increase transaction &amp;fee</source>
- <translation type="unfinished">‫زيادة العملية و الرسوم‬</translation>
- </message>
- <message>
- <source>A&amp;bandon transaction</source>
- <translation type="unfinished">‫ال&amp;تخلي عن العملية</translation>
- </message>
- <message>
- <source>&amp;Edit address label</source>
- <translation type="unfinished">و تحرير تسمية العنوان </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>
- <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>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>
<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>
@@ -3804,100 +1486,12 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Error</source>
<translation type="unfinished">خطأ</translation>
</message>
- <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 يجب أن يكون أصغر من 100 ميجابايت</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>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>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>
<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>
- <message>
- <source>Backup Wallet</source>
- <translation type="unfinished">‫انسخ المحÙظة احتياطيا‬</translation>
+ <translation type="unfinished">و إستخرج</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -3905,22 +1499,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -3928,456 +1506,12 @@ Go to File &gt; Open Wallet to load a wallet.
<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 مشكل. حاول استخدام أداة محÙظة البتكوين للاصلاح أو استعادة نسخة احتياطية.‬</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>
- <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>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 reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">‫خطأ ÙÙŠ قراءة %s بيانات العملية قد تكون Ù…Ùقودة أو غير صحيحة. اعادة Ùحص المحÙظة.‬</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>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 ميجابايت. من Ùضلك ارÙع الحد.‬</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">‫الاختصار: اخر مزامنة للمحÙظة كانت قبل البيانات المختصرة. تحتاج الى - اعادة Ùهرسة (قم بتنزيل الطوابق المتتالية بأكملها مرة أخرى ÙÙŠ حال تم اختصار النود)‬</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 transaction amount is too small to send after the fee has been deducted</source>
- <translation type="unfinished">قيمة المعاملة صغيرة جدًا ولا يمكن إرسالها بعد خصم الرسوم</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">‫هذا هو الحد الاعلى للرسوم التي تدÙعها (بالاضاÙØ© للرسوم العادية) لتÙادي الدÙع الجزئي واعطاء أولوية لاختيار الوحدات.‬</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>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">‫صيغة مل٠المحÙظة غير معروÙØ© “%sâ€. الرجاء تقديم اما “bdb†أو “sqliteâ€.‬</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>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <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>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">‫-الحد الأقصى لتجمع الذاكرة %d ميجابايت‬ على الأقل</translation>
- </message>
- <message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">‫حدث خطأ داخلي شديد، راجع مل٠تصحيح الأخطاء للتÙاصيل‬</translation>
- </message>
- <message>
- <source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">لا يمكن الحل - %s العنوان: '%s'</translation>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">أكثر من عنوان مربوط بالonion مقدم. استخدام %s من أجل خدمة تور (Tor) المنشأة تلقائيا.</translation>
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">‫لايمكن الكتابة ÙÙŠ المجلد '%s'Ø› تحقق من الصلاحيات.‬</translation>
- </message>
- <message>
- <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">‫Ùشل ÙÙŠ إعادة تسمية مل٠invalid peers.dat. يرجى نقله أو حذÙÙ‡ وحاول مرة أخرى.‬</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 creating %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>
+ <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 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: Couldn't create cursor into database</source>
- <translation type="unfinished">‫خطأ : لم نتمكن من انشاء علامة Ùارقة (cursor) ÙÙŠ قاعدة البيانات‬</translation>
- </message>
- <message>
- <source>Error: Disk space is low for %s</source>
- <translation type="unfinished">‫خطأ : مساحة التخزين منخÙضة Ù„ %s</translation>
- </message>
- <message>
- <source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">‫خطأ: Ùشل انشاء محÙظة المراقبة Ùقط الجديدة‬</translation>
- </message>
- <message>
- <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: 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: Unable to begin reading all records in the database</source>
- <translation type="unfinished">‫خطأ: غير قادر على قراءة السجلات ÙÙŠ قاعدة البيانات‬</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>
- <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>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Ùشل ÙÙŠ الاستماع على أي منÙØ°. استخدام الاستماع = 0 إذا كنت تريد هذا.</translation>
- </message>
- <message>
- <source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">‫Ùشلت عملية اعادة تÙحص وتدقيق المحÙظة أثناء التهيئة‬</translation>
- </message>
- <message>
- <source>Failed to verify database</source>
- <translation type="unfinished">Ùشل ÙÙŠ التحقق من قاعدة البيانات</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">‫تجاهل المحÙظة المكررة %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>
- </message>
- <message>
- <source>Insufficient funds</source>
- <translation type="unfinished">الرصيد غير كاÙÙŠ</translation>
- </message>
- <message>
- <source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">عنوان اونيون غير صحيح : '%s'</translation>
- </message>
- <message>
- <source>Invalid P2P permission: '%s'</source>
- <translation type="unfinished">‫إذن القرين للقرين غير صالح: ‘%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>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>
- </message>
- <message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">لا تتوÙر واصÙات ملÙات كاÙية.</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>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>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">‫مجلد المحÙظة المحددة "%s" غير موجود</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" is a relative path</source>
- <translation type="unfinished">‫مسار مجلد المحÙظة المحدد "%s" مختصر ومتغير‬</translation>
- </message>
- <message>
- <source>The source code is available from %s.</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">‫سو٠تتجنب المحÙظة دÙع رسوم أقل من الحد الأدنى للتوصيل.‬</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 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 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 bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">يتعذر الربط مع %s على هذا الكمبيوتر (الربط انتج خطأ %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 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 start HTTP server. See debug log for details.</source>
- <translation type="unfinished">غير قادر على بدء خادم ال HTTP. راجع سجل تصحيح الأخطاء للحصول على التÙاصيل.</translation>
- </message>
- <message>
- <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 network specified in -onlynet: '%s'</source>
- <translation type="unfinished">شبكة مجهولة عرÙت حددت ÙÙŠ -onlynet: '%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>
- <translation type="unfinished">‫مل٠الاعدادات لا يمكن قراءته‬</translation>
- </message>
- <message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">‫لم نتمكن من كتابة مل٠الاعدادات‬</translation>
- </message>
-</context>
+ </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_az.ts b/src/qt/locale/bitcoin_az.ts
index 3bba7a2b40..ad81f3a0bd 100644
--- a/src/qt/locale/bitcoin_az.ts
+++ b/src/qt/locale/bitcoin_az.ts
@@ -2,6 +2,10 @@
<context>
<name>AddressBookPage</name>
<message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Ünvanı və ya etiketi redaktə etmək üçün sağ klikləyin</translation>
+ </message>
+ <message>
<source>Create a new address</source>
<translation type="unfinished">Yeni ünvan yaradın</translation>
</message>
@@ -172,6 +176,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Pulqabı üçün köhnə şifrəli sözü və yeni şifrəli sözü daxil edin</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Davam et</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">Unutmayın ki, pulqabınızın şifrələməsi bitcoinlərinizi kompüterinizə zərərli proqram tərəfindən oğurlanmaqdan tamamilə qoruya bilməz.</translation>
</message>
@@ -281,46 +289,50 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <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 />
- <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 />
- <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 />
- <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 />
- <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 />
- <numerusform />
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart cüzdan</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -502,7 +514,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Ödəmə tələbi (QR-kodlar və Bitcoin URI-ləri yaradılır)^</translation>
+ <translation type="unfinished">Ödəmə tələbi (QR-kodlar və Bitcoin URI-ləri yaradılır):</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -510,7 +522,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Ä°stifadÉ™ edilmiÅŸ </translation>
+ <translation type="unfinished">İstifadə edilmiş qəbuletmə ünvanlarının və etiketlərin siyahısını göstərmək</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -525,7 +537,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 geridə qaldı</translation>
+ <translation type="unfinished">%1 geridə qalır</translation>
</message>
<message>
<source>Catching up…</source>
@@ -626,10 +638,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">İcmal vərəqində dəyərləri gizlədin</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Heç bir cüzdan yoxdur</translation>
</message>
@@ -646,7 +654,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<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">Cüzdanı bərpa et</translation>
+ <translation type="unfinished">Pulqabını bərpa et</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -963,6 +971,13 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Pulqabını köçür</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -973,13 +988,9 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Pulqabının açılması xəbərdarlığı</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Cüzdanı açın</translation>
+ <translation type="unfinished">Pulqabını açın</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -992,7 +1003,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">Cüzdanı bərpa et</translation>
+ <translation type="unfinished">Pulqabını bərpa et</translation>
</message>
<message>
<source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1002,24 +1013,24 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</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">Cüzdan bərpa oluna bilmədi</translation>
+ <translation type="unfinished">Pulqabı bərpa oluna bilmədi</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">Cüzdanın bərpa olunması xəbərdarlığı</translation>
+ <translation type="unfinished">Pulqabının bərpa olunması xəbərdarlığı</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">Cüzdanın bərpası ismarıcı</translation>
+ <translation type="unfinished">Pulqabının bərpası ismarıcı</translation>
</message>
</context>
<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
- <translation type="unfinished">Cüzdanı bağlayın</translation>
+ <translation type="unfinished">Pulqabını bağlayın</translation>
</message>
<message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
@@ -1042,7 +1053,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<name>CreateWalletDialog</name>
<message>
<source>Create Wallet</source>
- <translation type="unfinished">Cüzdan yaradın</translation>
+ <translation type="unfinished">Pulqabı yaradın</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -1136,30 +1147,30 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <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 />
- <numerusform />
+ <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 />
- <numerusform />
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</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>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
</translation>
</message>
<message>
@@ -1412,17 +1423,29 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Komissiydan sonra:</translation>
+ <translation type="unfinished">Komissiyadan sonra:</translation>
</message>
<message>
<source>Change:</source>
<translation type="unfinished">Qalıq:</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">kilobayt başına</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">GizlÉ™</translation>
</message>
<message>
+ <source>Choose…</source>
+ <translation type="unfinished">Seçin…</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation type="unfinished">Balans:</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">Miqdarı kopyalayın</translation>
</message>
@@ -1457,8 +1480,8 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
<message>
@@ -1476,11 +1499,15 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<source>unknown</source>
<translation type="unfinished">naməlum</translation>
</message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">öz ünvanı</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<message>
@@ -1559,13 +1586,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_az@latin.ts b/src/qt/locale/bitcoin_az@latin.ts
index bb808eaddb..c35a060fa4 100644
--- a/src/qt/locale/bitcoin_az@latin.ts
+++ b/src/qt/locale/bitcoin_az@latin.ts
@@ -176,6 +176,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Pulqabı üçün köhnə şifrəli sözü və yeni şifrəli sözü daxil edin</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Davam et</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">Unutmayın ki, pulqabınızın şifrələməsi bitcoinlərinizi kompüterinizə zərərli proqram tərəfindən oğurlanmaqdan tamamilə qoruya bilməz.</translation>
</message>
@@ -285,46 +289,50 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <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 />
- <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 />
- <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 />
- <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 />
- <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 />
- <numerusform />
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart cüzdan</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -506,7 +514,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Ödəmə tələbi (QR-kodlar və Bitcoin URI-ləri yaradılır)^</translation>
+ <translation type="unfinished">Ödəmə tələbi (QR-kodlar və Bitcoin URI-ləri yaradılır):</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -514,7 +522,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Ä°stifadÉ™ edilmiÅŸ </translation>
+ <translation type="unfinished">İstifadə edilmiş qəbuletmə ünvanlarının və etiketlərin siyahısını göstərmək</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -529,7 +537,7 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 geridə qaldı</translation>
+ <translation type="unfinished">%1 geridə qalır</translation>
</message>
<message>
<source>Catching up…</source>
@@ -630,10 +638,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">İcmal vərəqində dəyərləri gizlədin</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Heç bir cüzdan yoxdur</translation>
</message>
@@ -977,10 +981,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Pulqabının açılması xəbərdarlığı</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Cüzdanı açın</translation>
@@ -1140,30 +1140,30 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <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 />
- <numerusform />
+ <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 />
- <numerusform />
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</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>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
</translation>
</message>
<message>
@@ -1461,8 +1461,8 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
<message>
@@ -1483,8 +1483,8 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<message>
@@ -1563,13 +1563,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart cüzdan</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_be.ts b/src/qt/locale/bitcoin_be.ts
index f53ba3f5b2..9b6445ff24 100644
--- a/src/qt/locale/bitcoin_be.ts
+++ b/src/qt/locale/bitcoin_be.ts
@@ -83,6 +83,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>
@@ -157,6 +165,10 @@
<translation type="unfinished">Гаманец зашыфраваны</translation>
</message>
<message>
+ <source>Wallet to be 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>
diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts
index 7eefe113ce..bfbc848fb6 100644
--- a/src/qt/locale/bitcoin_bg.ts
+++ b/src/qt/locale/bitcoin_bg.ts
@@ -183,6 +183,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Въведете Ñтарата и новата паролна фраза за портфейла.</translation>
</message>
<message>
+ <source>Continue</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>
@@ -397,6 +401,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 Гигабайт</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Портфейл по подразбиране</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -491,7 +499,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">Шифровай портфейла</translation>
+ <translation type="unfinished">&amp;Крипритай уолет..</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -642,7 +650,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 (чаÑтично подпиÑана Bitcoin транÑакциÑ) от &amp;клипборд...</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
@@ -715,10 +723,6 @@ 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>No wallets available</source>
<translation type="unfinished">ÐÑма доÑтъпни портфейли</translation>
</message>
@@ -800,7 +804,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Предварителна ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° Headers (%1%)…</translation>
+ <translation type="unfinished">Предварителна ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° хедъри (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -1109,10 +1113,6 @@ 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>
@@ -1500,7 +1500,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>
@@ -2133,6 +2137,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Копирай адреÑ</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">нито един</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Извършване на команда без портфейл</translation>
</message>
@@ -2554,10 +2562,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -2937,11 +2941,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">Изпращане</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Портфейл по подразбиране</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_bn.ts b/src/qt/locale/bitcoin_bn.ts
index f4cdcd1a4b..bfb104a7a3 100644
--- a/src/qt/locale/bitcoin_bn.ts
+++ b/src/qt/locale/bitcoin_bn.ts
@@ -276,6 +276,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">&amp;কà§à¦²à¦¿à¦ªà¦¬à§‹à¦°à§à¦¡ থেকে আংশিক সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¿à¦¤ বিটকয়েন লেনদেন আনà§à¦¨</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">কà§à¦²à¦¿à¦ªà¦¬à§‹à¦°à§à¦¡ থেকে আংশিক সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¿à¦¤ বিটকয়েন লেনদেন লোড করà§à¦¨</translation>
</message>
@@ -466,6 +470,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ঠিকানা কপি করà§à¦¨</translation>
</message>
<message>
+ <source>via %1</source>
+ <translation type="unfinished">à¦à¦° মাধà§à¦¯à¦®à§‡ %1</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation type="unfinished">অজানা</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bs.ts b/src/qt/locale/bitcoin_bs.ts
index 2667d04cb7..e71def3e6c 100644
--- a/src/qt/locale/bitcoin_bs.ts
+++ b/src/qt/locale/bitcoin_bs.ts
@@ -329,7 +329,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">zadani novÄanik</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -598,10 +602,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Maskirajte vrijednosti na kartici Pregled</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">zadani novÄanik</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nema dostupnih novÄanika</translation>
</message>
@@ -851,10 +851,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">zadani novÄanik</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otvorite NovÄanik</translation>
@@ -1515,13 +1511,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">zadani novÄanik</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts
index 2ea1e0a2a2..eff91d3387 100644
--- a/src/qt/locale/bitcoin_ca.ts
+++ b/src/qt/locale/bitcoin_ca.ts
@@ -184,6 +184,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Introduïu la contrasenya antiga i la contrasenya nova a la cartera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continua</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">Recorda que tot i xifrant la teva cartera, els teus bitcoins no estan completament protegits de robatori a través de programari maliciós que estigui infectant el teu ordinador.</translation>
</message>
@@ -273,7 +277,11 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<source>Internal error</source>
<translation type="unfinished">Error intern</translation>
</message>
- </context>
+ <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">S'ha produït un error intern. %1 intentarà continuar amb seguretat. Es tracta d’un error inesperat que es pot informar tal com es descriu a continuació.</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -311,6 +319,12 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">No encaminable</translation>
</message>
<message>
+ <source>Onion</source>
+ <comment>network name</comment>
+ <extracomment>Name of Tor network in peer info</extracomment>
+ <translation type="unfinished">Ceba</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">Entrant</translation>
@@ -347,36 +361,36 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n segons</numerusform>
+ <numerusform>%n segon(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n minuts</numerusform>
+ <numerusform>%n minuts</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n hores</numerusform>
+ <numerusform>%n hores</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n dies</numerusform>
+ <numerusform>%n dies</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n setmanes</numerusform>
+ <numerusform>%n setmanes</numerusform>
</translation>
</message>
<message>
@@ -386,11 +400,15 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n any</numerusform>
+ <numerusform>%n anys</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">cartera predeterminada</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -700,10 +718,6 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Emmascara els valors en la pestanya Visió general</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">cartera predeterminada</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">No hi ha cap cartera disponible</translation>
</message>
@@ -1110,10 +1124,6 @@ El procés de migració crearà una còpia de seguretat de la cartera abans de m
<translation type="unfinished">Avís en l'obertura de la cartera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">cartera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Obre la cartera</translation>
@@ -1136,7 +1146,22 @@ El procés de migració crearà una còpia de seguretat de la cartera abans de m
<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>
+ <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">Reestablir cartera ha fallat</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">Avís al restaurar la cartera</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">Missatge al restaurar la cartera</translation>
+ </message>
+</context>
<context>
<name>WalletController</name>
<message>
@@ -1167,6 +1192,14 @@ El procés de migració crearà una còpia de seguretat de la cartera abans de m
<translation type="unfinished">Crear cartera</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">A un pas de crear la teva nova cartera</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Si us plau, proporciona un nom i, si vols, activa qualsevol opció avançada</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nom de la cartera</translation>
</message>
@@ -1304,8 +1337,8 @@ Això és ideal per a carteres de mode només lectura.</translation>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n GB d'espai lliure disponible</numerusform>
+ <numerusform>%n GB d'espai lliure disponibles</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1379,6 +1412,10 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Aquesta sincronització inicial és molt exigent i pot exposar problemes de maquinari amb l'equip que anteriorment havien passat desapercebuts. Cada vegada que executeu %1, continuarà descarregant des del punt on es va deixar.</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">Quan feu clic a D'acord, %1 començarà a descarregar i processar la cadena de blocs %4 completa (%2 GB) començant per les primeres transaccions de %3, any de llençament inicial de %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">Si heu decidit limitar l'emmagatzematge de la cadena de blocs (podar), les dades històriques encara s'hauran de baixar i processar, però se suprimiran més endavant per a mantenir baix l'ús del disc.</translation>
</message>
@@ -1471,7 +1508,11 @@ Això és ideal per a carteres de mode només lectura.</translation>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
<translation type="unfinished">Desconegut. Sincronització de les capçaleres (%1, %2%)...</translation>
</message>
- </context>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Desconegut. Sincronització de les capçaleres (%1, %2%)...</translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1515,6 +1556,10 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Nombre de fils de &amp;verificació d'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">Camí complet a %1 script compatible amb Bitcoin Core (per exemple, C:\Downloads\hwi.exe o /Users/you/Downloads/hwi.py). Aneu amb compte: el programari maliciós pot robar-vos les monedes!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Adreça IP del proxy (p. ex. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1527,6 +1572,10 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Minimitza en comptes de sortir de l'aplicació quan la finestra es tanca. Quan s'habilita aquesta opció l'aplicació es tancarà només quan se selecciona Surt del menú. </translation>
</message>
<message>
+ <source>Options set in this dialog are overridden by the command line:</source>
+ <translation type="unfinished">Les opcions configurades en aquest diàleg són sobreescrites per la línia de comandes:</translation>
+ </message>
+ <message>
<source>Open the %1 configuration file from the working directory.</source>
<translation type="unfinished">Obriu el fitxer de configuració %1 des del directori de treball.</translation>
</message>
@@ -1559,6 +1608,11 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">(0 = auto, &lt;0 = deixa tants nuclis lliures)</translation>
</message>
<message>
+ <source>Enable R&amp;PC server</source>
+ <extracomment>An Options window setting to enable the RPC server.</extracomment>
+ <translation type="unfinished">Activa el servidor R&amp;PC</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation type="unfinished">&amp;Moneder</translation>
</message>
@@ -1575,6 +1629,11 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">&amp;Gasta el canvi sense confirmar</translation>
</message>
<message>
+ <source>Enable &amp;PSBT controls</source>
+ <extracomment>An options window setting to enable PSBT controls.</extracomment>
+ <translation type="unfinished">Activa els controls &amp;PSBT</translation>
+ </message>
+ <message>
<source>External Signer (e.g. hardware wallet)</source>
<translation type="unfinished">Signador extern (per exemple, cartera de maquinari)</translation>
</message>
@@ -1671,6 +1730,14 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Selecciona la unitat de subdivisió per defecte per a mostrar en la interfície quan s'envien monedes.</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 de terceres parts (p. ex. explorador de blocs) que apareix en la pestanya de transaccions com elements del menú contextual. %s en l'URL es reemplaçat pel resum de la transacció. Diferents URL estan separades per una barra vertical |.</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">URL de transaccions de tercers</translation>
+ </message>
+ <message>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished">Si voleu mostrar les funcions de control de monedes o no.</translation>
</message>
@@ -1729,6 +1796,10 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">El fitxer de configuració s'utilitza per a especificar les opcions d'usuari avançades que substitueixen la configuració de la interfície gràfica d'usuari. A més, qualsevol opció de la línia d'ordres substituirà aquest fitxer de configuració.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continua</translation>
+ </message>
+ <message>
<source>Cancel</source>
<translation type="unfinished">Cancel·la</translation>
</message>
@@ -1819,6 +1890,10 @@ Això és ideal per a carteres de mode només lectura.</translation>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>PSBT Operations</source>
+ <translation type="unfinished">Operacions PSBT</translation>
+ </message>
+ <message>
<source>Sign Tx</source>
<translation type="unfinished">Signa Tx</translation>
</message>
@@ -1916,6 +1991,10 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">La transacció encara necessita una o vàries firmes.</translation>
</message>
<message>
+ <source>(But no wallet is loaded.)</source>
+ <translation type="unfinished">(Cap cartera ha estat carregada.)</translation>
+ </message>
+ <message>
<source>(But this wallet cannot sign transactions.)</source>
<translation type="unfinished">(Però aquesta cartera no pot firmar transaccions.)</translation>
</message>
@@ -1980,6 +2059,11 @@ Si rebeu aquest error, haureu de sol·licitar al comerciant que proporcioni un U
<translation type="unfinished">Igual</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">Edat</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">Direcció</translation>
@@ -2367,6 +2451,10 @@ Si rebeu aquest error, haureu de sol·licitar al comerciant que proporcioni un U
<translation type="unfinished">Activitat de xarxa inhabilitada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Cap</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">S'està executant l'ordre sense cap cartera</translation>
</message>
@@ -2564,8 +2652,7 @@ No utilitzeu aquesta consola sense entendre completament les ramificacions d'una
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">&amp;Verifica
-</translation>
+ <translation type="unfinished">&amp;Verifica</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
@@ -2864,6 +2951,11 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Si us plau, revisa la teva proposta de transacció. Es produirà una transacció de Bitcoin amb firma parcial (PSBT) que podeu guardar o copiar i després firmar, per exemple, amb una cartera %1, o amb una cartera física compatible amb PSBT.</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">Voleu crear aquesta transacció?</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">Reviseu la transacció</translation>
@@ -3035,10 +3127,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">&amp;Signa el missatge</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">Podeu signar missatges/acords amb les vostres adreces per a provar que rebeu les bitcoins que s'hi envien. Aneu amb compte no signar res que sigui vague o aleatori, perquè en alguns atacs de suplantació es pot provar que hi signeu la vostra identitat. Només signeu aquelles declaracions completament detallades en què hi esteu d'acord. </translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">L'adreça Bitcoin amb què signar el missatge</translation>
</message>
@@ -3127,10 +3215,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Comproveu l'adreça i torneu-ho a provar.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L'adreça introduïda no referencia a cap clau.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">S'ha cancel·lat el desblocatge de la cartera.</translation>
</message>
@@ -3247,8 +3331,8 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>madura en %n bloc més</numerusform>
+ <numerusform>madura en %n blocs més</numerusform>
</translation>
</message>
<message>
@@ -3669,11 +3753,6 @@ 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>
@@ -3685,10 +3764,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<source>Can't display address</source>
<translation type="unfinished">No es pot mostrar l'adreça</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">cartera predeterminada</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3793,10 +3868,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">No s'ha proporcionat cap format de fitxer de cartera. Per a utilitzar createfromdump, s'ha de proporcionar&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">Comproveu que la data i hora de l'ordinador són correctes. Si el rellotge és incorrecte, %s no funcionarà correctament.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Contribueix si trobes %s útil. Visita %s per a obtenir més informació sobre el programari.</translation>
</message>
@@ -3881,10 +3952,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">-maxmempool ha de tenir almenys %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">S'ha produït un error intern fatal. Consulteu debug.log per a més detalls</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">No es pot resoldre -%s adreça: '%s'</translation>
</message>
@@ -3897,6 +3964,22 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">No es pot escriure en el directori de dades "%s". Reviseu-ne els permisos.</translation>
</message>
<message>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s especificat molt alt! Tarifes tan grans podrien pagar-se en una única transacció.</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'ha produït un error en llegir %s. Totes les claus es llegeixen correctament, però les dades de la transacció o les entra des de la llibreta d'adreces podrien faltar o ser incorrectes.</translation>
+ </message>
+ <message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">L'estimació de la quota ha fallat. Fallbackfee està desactivat. Espereu uns quants blocs o activeu %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">Import no vàlid per a %s=&lt;amount&gt;: '%s' (cal que sigui com a mínim la tarifa de minrelay de %s per evi tar que les tarifes s'encallin)</translation>
+ </message>
+ <message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
<translation type="unfinished">Configuració per a %s únicament aplicada a %s de la xarxa quan es troba a la secció [%s].</translation>
</message>
@@ -4070,6 +4153,14 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">Permís P2P no vàlid: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Import no vàlid per a %s=&lt;amount&gt;: «%s» (ha de ser com a mínim %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Import invàlid per a %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Import invàlid per a -%s=&lt;amount&gt;: '%s'</translation>
</message>
@@ -4078,6 +4169,10 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">S'ha especificat una màscara de xarxa no vàlida a -whitelist: «%s»</translation>
</message>
<message>
+ <source>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">ha fallat escoltar les connexions entrants (l'escoltament ha retornat l'error %s)</translation>
+ </message>
+ <message>
<source>Loading P2P addresses…</source>
<translation type="unfinished">S'estan carregant les adreces P2P...</translation>
</message>
@@ -4166,6 +4261,10 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">El directori de blocs especificat "%s" no existeix.</translation>
</message>
<message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">El directori de dades especificat «%s» no existeix.</translation>
+ </message>
+ <message>
<source>Starting network threads…</source>
<translation type="unfinished">S'estan iniciant fils de xarxa...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cmn.ts b/src/qt/locale/bitcoin_cmn.ts
index d65385fd59..b5d9efb79d 100644
--- a/src/qt/locale/bitcoin_cmn.ts
+++ b/src/qt/locale/bitcoin_cmn.ts
@@ -175,6 +175,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -257,6 +265,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>
@@ -428,7 +440,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -506,7 +518,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -517,16 +529,8 @@ Signing is only possible with addresses of the type 'legacy'.</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>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -537,18 +541,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">修改密ç (&amp;C)</translation>
</message>
<message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">ç­¾å消æ¯(&amp;M)</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>
@@ -565,32 +557,20 @@ Signing is only possible with addresses of the type 'legacy'.</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;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <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>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -602,7 +582,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>
@@ -632,15 +612,15 @@ 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>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -726,7 +706,7 @@ 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帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -737,10 +717,6 @@ 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>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -762,7 +738,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">钱包å称</translation>
+ <translation type="unfinished">錢包å稱</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -778,15 +754,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</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;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -798,26 +774,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ <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>
@@ -919,11 +885,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -938,14 +904,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -958,22 +916,10 @@ 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>
@@ -998,10 +944,6 @@ 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>
@@ -1037,11 +979,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1133,10 +1071,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1186,7 +1120,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1237,7 +1171,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
</context>
<context>
@@ -1276,7 +1210,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1299,7 +1233,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1307,7 +1241,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1344,7 +1278,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1375,7 +1309,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <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>
@@ -1383,7 +1317,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>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>
@@ -1425,7 +1359,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1436,15 +1370,15 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</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>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1456,7 +1390,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1468,7 +1402,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1496,7 +1430,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1507,11 +1441,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1523,11 +1457,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</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>
@@ -2274,10 +2208,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2384,6 +2314,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2446,7 +2380,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>
@@ -2552,7 +2486,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2576,6 +2510,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2611,7 +2549,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2801,11 +2739,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2943,7 +2881,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2957,9 +2895,9 @@ For more information on using this console, type %6.
<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字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–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>
@@ -3074,6 +3012,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>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3082,6 +3024,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3205,7 +3152,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>
@@ -3262,10 +3209,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3275,7 +3218,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>
@@ -3350,10 +3293,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>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>
@@ -3406,6 +3345,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3772,7 +3718,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3906,11 +3852,6 @@ 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>
@@ -3920,11 +3861,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
@@ -3974,6 +3911,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -3987,7 +3928,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <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>
@@ -4015,7 +3956,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%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>
@@ -4054,10 +3997,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4166,10 +4105,6 @@ 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>
@@ -4304,6 +4239,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4321,7 +4260,7 @@ 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">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4412,14 +4351,34 @@ Unable to restore backup of wallet.</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: 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">錯誤:keypool已用完,請先é‡æ–°å‘¼å«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>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4472,6 +4431,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4480,6 +4443,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4504,6 +4475,10 @@ Unable to restore backup of wallet.</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>
@@ -4672,10 +4647,6 @@ Unable to restore backup of wallet.</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. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts
index 5f2ffc5bd0..1f5c6d9610 100644
--- a/src/qt/locale/bitcoin_cs.ts
+++ b/src/qt/locale/bitcoin_cs.ts
@@ -171,6 +171,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Zadej staré a nové heslo k peněžence.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">PokraÄovat</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">Pamatujte, že zaÅ¡ifrování peněženky nemůže plnÄ› ochránit vaÅ¡e bitcoiny pÅ™ed krádeží, pokud by byl váš poÄítaÄ napadem malwarem.</translation>
</message>
@@ -396,7 +400,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n let</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">výchozí peněženka</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -597,7 +605,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">
<numerusform>Zpracován %n blok transakÄní historie.</numerusform>
<numerusform>Zpracovány %n bloky transakÄní historie.</numerusform>
- <numerusform>Zpracováno %n bloků transakÄní historie.</numerusform>
+ <numerusform>Zpracováno %n bloků transakÄní historie</numerusform>
</translation>
</message>
<message>
@@ -703,10 +711,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Skrýt Äástky v pÅ™ehledu</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">výchozí peněženka</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nejsou dostupné žádné peněženky</translation>
</message>
@@ -1059,10 +1063,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Varování otevření peněženky</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">výchozí peněženka</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otevřít peněženku</translation>
@@ -2531,6 +2531,10 @@ Pokud vidíte tuto chybu, měli byste požádat, aby obchodník poskytl adresu k
<translation type="unfinished">Síť je vypnutá</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Žádné</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Spouštění příkazu bez jakékoliv peněženky</translation>
</message>
@@ -2539,6 +2543,23 @@ Pokud vidíte tuto chybu, měli byste požádat, aby obchodník poskytl adresu k
<translation type="unfinished">Příkaz se vykonává s použitím peněženky "%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">Vítejte v konzole %1 RPC.
+ Použijte šipky nahoru a dolů k procházení historie a %2 k vymazání obrazovky.
+ Použijte %3 a %4 ke zvětšení nebo zmenšení velikosti písma.
+ Pro přehled dostupných příkazů zadejte %5.
+ Další informace o používání této konzoly získáte zadáním %6
+
+ %7VAROVÃNÃ: Podvodníci byli aktivní a říkali uživatelům, aby sem zadávali příkazy, a kradli jim obsah peněženky. Nepoužívejte tuto konzolu, aniž byste plnÄ› porozumÄ›li důsledkům příkazu.%8</translation>
+ </message>
+ <message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished">Provádím...</translation>
@@ -3225,10 +3246,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">&amp;Podepiš zprávu</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">Podepsáním zprávy/smlouvy svými adresami můžeÅ¡ prokázat, že jsi na nÄ› schopen pÅ™ijmout bitcoiny. BuÄ opatrný a nepodepisuj nic vágního nebo náhodného; například pÅ™i phishingových útocích můžeÅ¡ být lákán, abys nÄ›co takového podepsal. Podepisuj pouze naprosto úplná a detailní prohlášení, se kterými souhlasíš.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoinová adresa, kterou se zpráva podepíše</translation>
</message>
@@ -3313,10 +3330,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Zkontroluj ji prosím a zkus to pak znovu.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Zadaná adresa nepasuje ke klíÄi.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">OdemÄení peněženky bylo zruÅ¡eno.</translation>
</message>
@@ -3871,11 +3884,6 @@ PÅ™ejdÄ›te do Soubor &gt; Otevřít peněženku pro naÄtení peněženky.
<translation type="unfinished">PSBT zkopírována</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Zkopírováno do schránky</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Nemůžu podepsat transakci.</translation>
</message>
@@ -3887,10 +3895,6 @@ PÅ™ejdÄ›te do Soubor &gt; Otevřít peněženku pro naÄtení peněženky.
<source>Can't display address</source>
<translation type="unfinished">Nemohu zobrazit adresu</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">výchozí peněženka</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4016,10 +4020,6 @@ Ověřuji peněženku.</translation>
<translation type="unfinished">Nebyl poskytnut formát souboru peněženky. Pro použití createfromdump, -format=&lt;format&gt; musí být poskytnut.</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">Zkontroluj, že máš v poÄítaÄi správnÄ› nastavený datum a Äas! Pokud jsou nastaveny Å¡patnÄ›, %s nebude fungovat správnÄ›.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Prosíme, zapoj se nebo pÅ™ispÄ›j, pokud ti %s pÅ™ijde užiteÄný. Více informací o programu je na %s.</translation>
</message>
@@ -4116,10 +4116,6 @@ Ověřuji peněženku.</translation>
<translation type="unfinished">-maxmempool musí být alespoň %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Nastala závažná vnitřní chyba, podrobnosti viz v debug.log.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Nemohu přeložit -%s adresu: '%s'</translation>
</message>
@@ -4148,6 +4144,10 @@ Ověřuji peněženku.</translation>
<translation type="unfinished">Chyba pÅ™i naÄtení %s: Externí podepisovací peněženka se naÄítá bez zkompilované podpory externího podpisovatele.</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">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: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Chyba: Data adres v peněžence není možné identifikovat jako data patřící k migrovaným peněženkám.</translation>
</message>
@@ -4662,10 +4662,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Transakce je příliš velká</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Není možné alokovat paměť pro -maxsigcachesize '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Nedaří se mi pÅ™ipojit na %s na tomhle poÄítaÄi (operace bind vrátila chybu %s)</translation>
</message>
@@ -4730,6 +4726,10 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Nepodporovaná logovací kategorie %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Chyba: Nelze pÅ™idat pouze-sledovací tx %s do peněženky pro Ätení</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Komentář u typu klienta (%s) obsahuje riskantní znaky.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts
index 53a4f6a223..78ce4e7155 100644
--- a/src/qt/locale/bitcoin_da.ts
+++ b/src/qt/locale/bitcoin_da.ts
@@ -175,6 +175,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Indtast den gamle adgangskode og en ny adgangskode til tegnebogen.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Forsæt</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">Husk, at kryptere din tegnebog vil ikke fuldt ud beskytte dine bitcoins mod at blive stjålet af malware på din computer.</translation>
</message>
@@ -382,7 +386,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n år</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard tegnebog</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -680,10 +688,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Maskér værdierne i Oversigt-fanebladet</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard tegnebog</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ingen tegnebøger tilgængelige</translation>
</message>
@@ -1007,10 +1011,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Advarsel for åbning af tegnebog</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard tegnebog</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ã…ben Tegnebog</translation>
@@ -1187,8 +1187,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n GB fri plads tilgængelig</numerusform>
+ <numerusform>%n GB fri plads tilgængelig</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1266,6 +1266,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Denne indledningsvise synkronisering er meget krævende, og den kan potentielt afsløre hardwareproblemer med din computer, som du ellers ikke har lagt mærke til. Hver gang, du kører %1, vil den fortsætte med at downloade, hvor den sidst slap.</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">Når du klikker OK, vil %1 begynde at downloade og bearbejde den fulde %4-blokkæde (%2 GB), startende med de tidligste transaktioner i %3, da %4 først startede.</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">Hvis du har valgt at begrænse opbevaringen af blokkæden (beskæring/pruning), vil al historisk data stadig skulle downloades og bearbejdes men vil blive slettet efterfølgende for at holde dit diskforbrug lavt.</translation>
</message>
@@ -1398,6 +1402,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Antallet af script&amp;verificeringstråde</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">Fuld sti til et %1-kompatibelt script (f.eks. C:\Downloads\hwi.exe eller /Users/you/Downloads/hwi.py). Pas på: malware kan stjæle dine mønter!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">IP-adresse for proxyen (fx IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -2354,6 +2362,10 @@ Hvis du modtager denne fejl, skal du anmode forhandleren om en BIP21-kompatibel
<translation type="unfinished">Netværksaktivitet deaktiveret</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ingen</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Udfører kommando uden en tegnebog</translation>
</message>
@@ -2794,6 +2806,10 @@ 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>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">Laver en delvist signeret bitcointransaktion (forkortet PSBT) som kan bruges med f.eks. en offline %1 tegnebog. De kan også bruges med PSBT-kompatible hardwaretegnebøger.</translation>
+ </message>
+ <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 til '%2'</translation>
</message>
@@ -2916,8 +2932,8 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Anslået at begynde bekræftelse inden for %n blok(e).</numerusform>
- <numerusform>Anslået at begynde bekræftelse inden for %n blok(e).</numerusform>
+ <numerusform>Anslået at begynde bekræftelse inden for %n blok.</numerusform>
+ <numerusform>Anslået at begynde bekræftelse inden for %n blokke.</numerusform>
</translation>
</message>
<message>
@@ -3022,10 +3038,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">&amp;Singér besked</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">Du kan signere beskeder/aftaler med dine adresser for at bevise, at du kan modtage bitcoin, der bliver sendt til adresserne. Vær forsigtig med ikke at signere noget vagt eller tilfældigt, da eventuelle phishing-angreb kan snyde dig til at overlade din identitet til dem. Signér kun fuldt ud detaljerede udsagn, som du er enig i.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-adresse, som beskeden skal signeres med</translation>
</message>
@@ -3110,10 +3122,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">Tjek venligst adressen og forsøg igen.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Den indtastede adresse henviser ikke til en nøgle.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Tegnebogsoplåsning annulleret.</translation>
</message>
@@ -3230,8 +3238,8 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>modnes i yderligere %n blok(e)</numerusform>
- <numerusform>modnes i yderligere %n blok(e)</numerusform>
+ <numerusform>modnes i yderligere %n blok</numerusform>
+ <numerusform>modnes i yderligere %n blokke</numerusform>
</translation>
</message>
<message>
@@ -3664,10 +3672,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<source>Can't display address</source>
<translation type="unfinished">Adressen kan ikke vises</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Standard tegnebog</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3780,10 +3784,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Der er ikke angivet noget tegnebogsfilformat. For at bruge createfromdump skal -format=&lt;format&gt; angives.</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">Undersøg venligst at din computers dato og klokkeslet er korrekt indstillet! Hvis der er fejl i disse, vil %s ikke fungere korrekt.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Overvej venligst at bidrage til udviklingen, hvis du finder %s brugbar. Besøg %s for yderligere information om softwaren.</translation>
</message>
@@ -3868,10 +3868,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">-maxmempool skal være mindst %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Der er sket en fatal intern fejl, se debug.log for detaljer</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Kan ikke finde -%s-adressen: “%sâ€</translation>
</message>
@@ -3888,6 +3884,10 @@ 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>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s er sat meget højt! Gebyrer så store risikeres betalt på en enkelt transaktion.</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>
@@ -3896,10 +3896,22 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Fejlindlæsning %s: Ekstern underskriver-tegnebog indlæses uden ekstern underskriverunderstøttelse kompileret</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">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>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Kunne ikke omdøbe ugyldig peers.dat fil. Flyt eller slet den venligst og prøv igen.</translation>
</message>
<message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Estimering af gebyr mislykkedes. Tilbagefaldsgebyr er deaktiveret. Vent et par blokke eller aktiver %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">Ugyldigt beløb for %s=&lt;beløb&gt;: “%s†(skal være på mindst minrelay-gebyret på %s for at undgå hængende transaktioner)</translation>
+ </message>
+ <message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
<translation type="unfinished">Opsætningen af %s bliver kun udført på %s-netværk under [%s]-sektionen.</translation>
</message>
@@ -4076,6 +4088,14 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Invalid P2P tilladelse: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Ugyldigt beløb for %s=&lt;beløb&gt;: “%s†(skal være mindst %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Ugyldigt beløb for %s=&lt;beløb&gt;: “%sâ€</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Ugyldigt beløb for -%s=&lt;beløb&gt;: “%sâ€</translation>
</message>
@@ -4084,6 +4104,10 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Ugyldig netmaske angivet i -whitelist: “%sâ€</translation>
</message>
<message>
+ <source>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">Lytning efter indkommende forbindelser mislykkedes (lytning resultarede i fejl %s)</translation>
+ </message>
+ <message>
<source>Loading P2P addresses…</source>
<translation type="unfinished">Indlæser P2P-adresser...</translation>
</message>
@@ -4184,6 +4208,10 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Angivet blokmappe “%s†eksisterer ikke.</translation>
</message>
<message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Angivet datamappe “%s†eksisterer ikke.</translation>
+ </message>
+ <message>
<source>Starting network threads…</source>
<translation type="unfinished">Starter netværkstråde...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts
index e7a3710dfb..807a1c64ee 100644
--- a/src/qt/locale/bitcoin_de.ts
+++ b/src/qt/locale/bitcoin_de.ts
@@ -184,6 +184,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Geben Sie die alte und die neue Wallet-Passphrase ein.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Weiter</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Zurück</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">Beachten Sie, dass das Verschlüsseln Ihrer Wallet nicht komplett vor Diebstahl Ihrer Bitcoins durch Malware schützt, die Ihren Computer infiziert hat.</translation>
</message>
@@ -291,6 +299,10 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<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>Error: %1</source>
+ <translation type="unfinished">Fehler: %1</translation>
+ </message>
+ <message>
<source>%1 didn't yet exit safely…</source>
<translation type="unfinished">%1 noch nicht sicher beendet…</translation>
</message>
@@ -366,10 +378,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<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>
@@ -427,7 +435,11 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<numerusform>%n Jahre</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard-Wallet</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -505,7 +517,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</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>
+ <translation type="unfinished">Ändert die Passphrase, die für die Wallet-Verschlüsselung benutzt wird</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -525,7 +537,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</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>
+ <translation type="unfinished">Verschlüsselt die zu Ihrer Wallet gehörenden privaten Schlüssel</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -537,7 +549,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">&amp;Nachricht signieren</translation>
+ <translation type="unfinished">&amp;Nachricht unterzeichnen…</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
@@ -561,11 +573,11 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Wallet schließen</translation>
+ <translation type="unfinished">Schließe Wallet…</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Wallet erstellen…</translation>
+ <translation type="unfinished">Erstelle Wallet…</translation>
</message>
<message>
<source>Close All Wallets…</source>
@@ -589,7 +601,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisiere Header (%1%)…</translation>
+ <translation type="unfinished">Synchronisiere Headers (%1%)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -605,126 +617,16 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</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>
+ <translation type="unfinished">Verbindung zu Peers wird hergestellt…</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform> %n Block der Transaktionshistorie verarbeitet.</numerusform>
- <numerusform> %n Blöcke der Transaktionshistorie verarbeitet.</numerusform>
+ <numerusform>%n Block der Transaktionshistorie prozessiert.</numerusform>
+ <numerusform>%n Block/Blöcke der Transaktionshistorie prozessiert.</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>
@@ -745,10 +647,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<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>
@@ -804,8 +702,8 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<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 aktive Verbindung(en) zum Bitcoin-Netzwerk</numerusform>
+ <numerusform>%n aktive Verbindung zum Bitcoin-Netzwerk</numerusform>
+ <numerusform>%n aktive Verbindungen zum Bitcoin-Netzwerk</numerusform>
</translation>
</message>
<message>
@@ -816,7 +714,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<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>
+ <translation type="unfinished">Reiter mit Peers anzeigen</translation>
</message>
<message>
<source>Disable network activity</source>
@@ -830,7 +728,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisiere Header vorab (%1%)…</translation>
+ <translation type="unfinished">Synchronisiere Header (%1%)…</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -1153,10 +1051,6 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<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>
@@ -1226,7 +1120,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</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>
+ <translation type="unfinished">Nur noch einen Schritt entfernt um das neue Wallet zu erstellen!</translation>
</message>
<message>
<source>Please provide a name and, if desired, enable any advanced options</source>
@@ -1530,7 +1424,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</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>
+ <translation type="unfinished">%1 synchronisiert gerade. Es lädt Header und Blöcke von Peers und validiert sie bis zum Erreichen der Spitze der Blockchain.</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
@@ -1749,7 +1643,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</message>
<message>
<source>Used for reaching peers via:</source>
- <translation type="unfinished">Benutzt um Gegenstellen zu erreichen über:</translation>
+ <translation type="unfinished">Benutzt um Peers zu erreichen über:</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -1813,7 +1707,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</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>
+ <translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Peers über Tor-Onion-Dienste zu erreichen:</translation>
</message>
<message>
<source>&amp;Cancel</source>
@@ -2152,11 +2046,6 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<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>
@@ -2169,7 +2058,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<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>
+ <translation type="unfinished">Gesendet</translation>
</message>
<message>
<source>Received</source>
@@ -2281,6 +2170,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Anzahl der Verbindungen</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Lokale Adressen</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Netzwerk-Adressen, die dein Bitcoin-Node aktuell verwendet, um mit anderen Nodes zu kommunizieren.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Blockchain</translation>
</message>
@@ -2310,31 +2207,31 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</message>
<message>
<source>Sent</source>
- <translation type="unfinished">Ãœbertragen</translation>
- </message>
- <message>
- <source>&amp;Peers</source>
- <translation type="unfinished">&amp;Gegenstellen</translation>
+ <translation type="unfinished">Gesendet</translation>
</message>
<message>
<source>Banned peers</source>
- <translation type="unfinished">Gesperrte Gegenstellen</translation>
+ <translation type="unfinished">Gesperrte Peers</translation>
</message>
<message>
<source>Select a peer to view detailed information.</source>
- <translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
+ <translation type="unfinished">Peers 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>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Reiter mit Peers verstecken</translation>
+ </message>
+ <message>
+ <source>Ctrl+X</source>
+ <translation type="unfinished">Strg+X</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>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Die Transportschicht-Version: %1</translation>
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
+ <translation type="unfinished">Ob wir Adressen an diesen Peer weiterleiten.</translation>
</message>
<message>
<source>Transaction Relay</source>
@@ -2358,7 +2255,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</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>
+ <translation type="unfinished">Das zugeordnete autonome System zur Diversifizierung der Peer-Auswahl.</translation>
</message>
<message>
<source>Mapped AS</source>
@@ -2367,7 +2264,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<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>
+ <translation type="unfinished">Ob wir Adressen an diesen Peer weiterleiten.</translation>
</message>
<message>
<source>Address Relay</source>
@@ -2377,12 +2274,12 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<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>
+ <translation type="unfinished">Die Gesamtzahl der von diesem Peer 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>
+ <translation type="unfinished">Die Gesamtzahl der von diesem Peer empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -2399,10 +2296,6 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<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>
@@ -2424,15 +2317,19 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</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>
+ <translation type="unfinished">Die Richtung und der Typ der Peer-Verbindung: %1</translation>
</message>
<message>
<source>Direction/Type</source>
<translation type="unfinished">Richtung/Typ</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form.</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>
+ <translation type="unfinished">Das Netzwerkprotokoll, über das dieser Peer verbunden ist, ist: IPv4, IPv6, Onion, I2P oder CJDNS.</translation>
</message>
<message>
<source>Services</source>
@@ -2452,7 +2349,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</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>
+ <translation type="unfinished">Verstrichene Zeit, seit ein neuer Block, der initiale Validierungsprüfungen bestanden hat, von diesem Peer empfangen wurde.</translation>
</message>
<message>
<source>Last Block</source>
@@ -2461,7 +2358,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<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>
+ <translation type="unfinished">Verstrichene Zeit, seit eine neue Transaktion, die in unseren Mempool aufgenommen wurde, von diesem Peer empfangen wurde.</translation>
</message>
<message>
<source>Last Send</source>
@@ -2530,7 +2427,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<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>
+ <translation type="unfinished">Eingehend: wurde vom Peer initiiert</translation>
</message>
<message>
<source>Outbound Full Relay: default</source>
@@ -2560,7 +2457,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<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>
+ <translation type="unfinished">Erkenne: Peer könnte v1 oder v2 sein</translation>
</message>
<message>
<source>v1: unencrypted, plaintext transport protocol</source>
@@ -2574,11 +2471,11 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
</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>
+ <translation type="unfinished">Wir haben den Peer 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>
+ <translation type="unfinished">Der Peer hat uns zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
</message>
<message>
<source>no high bandwidth relay selected</source>
@@ -2643,6 +2540,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Netzwerkaktivität deaktiviert</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Keine</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Befehl wird ohne spezifizierte Wallet ausgeführt</translation>
</message>
@@ -2685,7 +2586,7 @@ 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>
+%7ACHTUNG: 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>
@@ -2694,7 +2595,7 @@ Für weitere Informationen über diese Konsole, tippe %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(Gegenstelle: %1)</translation>
+ <translation type="unfinished">(Peer: %1)</translation>
</message>
<message>
<source>via %1</source>
@@ -3042,7 +2943,7 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
</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>
+ <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>
@@ -3124,7 +3025,7 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
</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>
+ <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>
@@ -3373,8 +3274,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Du kannst Nachrichten/Vereinbarungen mit Deinen Legacy-(P2PKH)-Adressen unterzeichnen, um zu beweisen, dass Du Bitcoins empfangen kannst, die an sie gesendet werden. Achte darauf, nichts Vages oder Zufälliges zu signieren, da Phishing-Angriffe versuchen könnten, Dich dazu zu verleiten, Deine Identität zu unterschreiben. Unterschreibe nur ausführliche Erklärungen, denen Du zustimmst.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3461,8 +3362,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<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>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">Die eingegebene Adresse bezieht sich nicht auf einen Legacy-Schlüssel (P2PKH). Die Nachrichtensignierung für SegWit und andere Adresstypen, die nicht zu P2PKH gehören, wird in dieser Version von %1 nicht unterstützt. Bitte überprüfe die Adresse und versuche es erneut.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -4030,9 +3931,8 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<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>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Fee-Bump PSBT in die Zwischenablage kopiert</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4043,12 +3943,12 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<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>
+ <source>Signer error</source>
+ <translation type="unfinished">Fehler beim Signieren</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-Wallet</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Die Adresse kann nicht angezeigt werden</translation>
</message>
</context>
<context>
@@ -4107,7 +4007,7 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
</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>
+ <translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Peers 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>
@@ -4182,10 +4082,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<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>
@@ -4276,7 +4172,7 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</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>
+ <translation type="unfinished">Warnung: Wir scheinen nicht vollständig mit unseren Peers ü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>
@@ -4291,10 +4187,6 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<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>
@@ -4343,6 +4235,12 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Fehler beim Entfernen des Snapshot-Chainstate-Verzeichnisses (%s). Entferne es manuell, bevor dem Neustart.
+</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>
@@ -4351,6 +4249,14 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<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>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Fehler beim Leeren der Blockdatei auf die Festplatte. Dies ist wahrscheinlich das Ergebnis eines E/A-Fehlers.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Fehler beim Leeren der Undo-Datei auf den Datenträger. Dies ist wahrscheinlich das Ergebnis eines E/A-Fehlers.</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>
@@ -4359,6 +4265,14 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<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>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Das maximale Transaktionsgewicht ist kleiner als das Transaktionsgewicht ohne Inputs</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Das maximale Transaktionsgewicht ist zu niedrig und kann den Change-Output nicht aufnehmen</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>
@@ -4375,6 +4289,14 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Ausgehende Verbindungen sind auf i2p (-onlynet=i2p) beschränkt, aber -i2psam ist nicht angegeben</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Die Umbenennung von '%s' -&gt; '%s' ist fehlgeschlagen. Das Hintergrund-Verzeichnis chainstate leveldb kann nicht bereinigt werden.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Die Kombination aus den vorausgewählten Inputs und der automatischen Auswahl der Wallet-Inputs überschreitet das maximale Transaktionsgewicht. Bitte versuche, einen kleineren Betrag zu senden oder die UTXOs der Wallet manuell zu konsolidieren.</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>
@@ -4417,6 +4339,10 @@ Bitte mit der neuesten Softwareversion versuchen.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">Das Datum und die Uhrzeit des Computers scheinen mehr als %d Minuten nicht mit dem Netzwerk synchronisiert zu sein, was zu einem Konsensus-Fehler führen kann. Nachdem die Uhr des Computers überprüft wurde und der Node neu gestatet wurde, sollte diese Meldung nicht mehr angezeigt werden. Ohne Neustart sollte es nicht mehr automatisch angezeigt werden, nachdem eine Verbindung mit einer ausreichenden Anzahl neuer ausgehender Peers hergestellt wurde, was einige Zeit dauern kann. Das Feld 'timeoffset' der RPC-Methoden 'getpeerinfo' und 'getnetworkinfo' kann überprüft werden, um weitere Informationen zu erhalten.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4429,6 +4355,18 @@ Unable to restore backup of wallet.</source>
Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind darf nur für eingehende Verbindungen verwendet werden ("out" wurde übergeben)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Es ist ein schwerwiegender interner Fehler aufgetreten, siehe debug.log für Details:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Für den angegebenen Blockhash '%s' wurden keine Assumeutxo-Daten gefunden.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Blocküberprüfung wurde unterbrochen</translation>
</message>
@@ -4437,6 +4375,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Konfigurationseinstellungen für %s sind nur auf %s network gültig, wenn in Sektion [%s]</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Beschädigter Block gefunden, was auf einen möglichen Hardwarefehler hinweist.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Beschädigte Blockdatenbank erkannt</translation>
</message>
@@ -4465,6 +4407,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fehler bei der Plausibilitätsprüfung der Elliptischen Kurvenkryptografie. %s wird heruntergefahren.</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>
@@ -4614,10 +4560,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Verbindung zum besten Block (%s) konnte nicht hergestellt werden.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Block konnte nicht getrennt 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 read block.</source>
+ <translation type="unfinished">Block konnte nicht gelesen werden.</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>
@@ -4630,6 +4588,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Block konnte nicht geschrieben werden.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Schreiben in die Blockindex-Datenbank fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Schreiben in die Coin-Datenbank fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Das Schreiben der Undo-Daten ist fehlgeschlagen.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
</message>
@@ -4726,6 +4700,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Lade Wallet...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Das maximale Transaktionsgewicht muss zwischen %d und %d liegen.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Fehlender Betrag</translation>
</message>
@@ -4754,6 +4732,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Nicht auflösbare vorausgewählter Input %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Nur Richtung wurde festgelegt, keine Genehmigungen: '%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>
@@ -4799,6 +4781,18 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Sektion [%s] ist nicht delegiert.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Der Signierer hat die Adresse nicht wiederholt</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Unterzeichner wiederholte unerwartete Adresse %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Der Signierer hat einen Fehler zurückgegeben: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Signierung der Transaktion fehlgeschlagen</translation>
</message>
@@ -4827,6 +4821,18 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Starte Netzwerk-Threads...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Systemfehler beim Leeren: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Systemfehler beim Laden der externen Blockdatei: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Systemfehler beim Speichern des Blocks auf der Festplatte: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Der Quellcode ist auf %s verfügbar.</translation>
</message>
@@ -4843,6 +4849,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Das Wallet verhindert Zahlungen, die die Mindesttransaktionsgebühr nicht berücksichtigen.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Für diese Adresse gibt es keinen ScriptPubKeyManager</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Dies ist experimentelle Software.</translation>
</message>
@@ -4883,10 +4893,6 @@ Verifikations-Error: %s</translation>
<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>
@@ -4947,6 +4953,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Unbekannte neue Regeln aktiviert (Versionsbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Nicht erkannte Option "%s" in -test=&lt;option&gt; angegeben.</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>
diff --git a/src/qt/locale/bitcoin_de_AT.ts b/src/qt/locale/bitcoin_de_AT.ts
index 72ec23d469..1c597c6866 100644
--- a/src/qt/locale/bitcoin_de_AT.ts
+++ b/src/qt/locale/bitcoin_de_AT.ts
@@ -1,749 +1,70 @@
<TS version="2.1" language="de_AT">
<context>
- <name>AddressBookPage</name>
- <message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Rechtsklick zum Bearbeiten der Adresse oder der Beschreibung</translation>
- </message>
- <message>
- <source>Create a new address</source>
- <translation type="unfinished">Neue Adresse erstellen</translation>
- </message>
- <message>
- <source>&amp;New</source>
- <translation type="unfinished">&amp;Neu</translation>
- </message>
- <message>
- <source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Ausgewählte Adresse in die Zwischenablage kopieren</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation type="unfinished">&amp;Kopieren</translation>
- </message>
- <message>
- <source>C&amp;lose</source>
- <translation type="unfinished">&amp;Schließen</translation>
- </message>
- <message>
- <source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Ausgewählte Adresse aus der Liste entfernen</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation type="unfinished">Zu suchende Adresse oder Bezeichnung eingeben</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>&amp;Export</source>
- <translation type="unfinished">&amp;Exportieren</translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation type="unfinished">&amp;Löschen</translation>
- </message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished">Wählen Sie die Adresse aus, an die Sie Bitcoins senden möchten</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">Wählen Sie die Adresse aus, mit der Sie Bitcoins empfangen wollen</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation type="unfinished">&amp;Auswählen</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>
- <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">Dies sind Ihre Bitcoin-Adressen für den Empfang von Zahlungen. Verwenden Sie die 'Neue Empfangsadresse erstellen' Taste auf der Registerkarte "Empfangen", um neue Adressen zu erstellen.
-Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</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>&amp;Edit</source>
- <translation type="unfinished">&amp;Bearbeiten</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation type="unfinished">Adressliste 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>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">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>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation type="unfinished">Bezeichnung</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Adresse</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(keine Bezeichnung)</translation>
- </message>
-</context>
-<context>
- <name>AskPassphraseDialog</name>
- <message>
- <source>Passphrase Dialog</source>
- <translation type="unfinished">Passphrasendialog</translation>
- </message>
- <message>
- <source>Enter passphrase</source>
- <translation type="unfinished">Passphrase eingeben</translation>
- </message>
- <message>
- <source>New passphrase</source>
- <translation type="unfinished">Neue Passphrase</translation>
- </message>
- <message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">Neue Passphrase bestätigen</translation>
- </message>
- <message>
- <source>Show passphrase</source>
- <translation type="unfinished">Zeige Passphrase</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation type="unfinished">Wallet verschlüsseln</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Dieser Vorgang benötigt Ihre Passphrase, um die Wallet zu entsperren.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation type="unfinished">Wallet entsperren</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation type="unfinished">Passphrase ändern</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation type="unfinished">Wallet-Verschlüsselung bestätigen</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">Warnung: Wenn Sie Ihre Wallet verschlüsseln und Ihre Passphrase verlieren, werden Sie &lt;b&gt;ALLE IHRE BITCOINS VERLIEREN&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">Sind Sie sich sicher, dass Sie Ihre Wallet verschlüsseln möchten?</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation type="unfinished">Wallet verschlüsselt</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">Geben Sie die neue Passphrase für die Wallet ein.&lt;br/&gt;Bitte benutzen Sie eine Passphrase bestehend aus &lt;b&gt;zehn oder mehr zufälligen Zeichen&lt;/b&gt; oder &lt;b&gt;acht oder mehr Wörtern&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Geben Sie die alte und die neue Wallet-Passphrase ein.</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">Beachten Sie, dass das Verschlüsseln Ihrer Wallet nicht komplett vor Diebstahl Ihrer Bitcoins durch Malware schützt, die Ihren Computer infiziert hat.</translation>
- </message>
- <message>
- <source>Wallet to be encrypted</source>
- <translation type="unfinished">Wallet zu verschlüsseln</translation>
- </message>
- <message>
- <source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Wallet wird verschlüsselt.</translation>
- </message>
- <message>
- <source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Deine Wallet ist jetzt verschlüsselt.</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">WICHTIG: Alle vorherigen Wallet-Backups sollten durch die neu erzeugte, verschlüsselte Wallet ersetzt werden. Aus Sicherheitsgründen werden vorherige Backups der unverschlüsselten Wallet nutzlos, sobald Sie die neue, verschlüsselte Wallet verwenden.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation type="unfinished">Wallet-Verschlüsselung fehlgeschlagen</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">Die Wallet-Verschlüsselung ist aufgrund eines internen Fehlers fehlgeschlagen. Ihre Wallet wurde nicht verschlüsselt.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Die eingegebenen Passphrasen stimmen nicht überein.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation type="unfinished">Wallet-Entsperrung fehlgeschlagen.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">Die eingegebene Passphrase zur Wallet-Entschlüsselung war nicht korrekt.</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">Die für die Entschlüsselung der Wallet eingegebene Passphrase ist falsch. Sie enthält ein Null-Zeichen (d.h. ein Null-Byte). Wenn die Passphrase mit einer Version dieser Software vor 25.0 festgelegt wurde, versuchen Sie es bitte erneut mit den Zeichen bis zum ersten Null-Zeichen, aber ohne dieses. Wenn dies erfolgreich ist, setzen Sie bitte eine neue Passphrase, um dieses Problem in Zukunft zu vermeiden.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">Die Wallet-Passphrase wurde erfolgreich geändert.</translation>
- </message>
- <message>
- <source>Passphrase change failed</source>
- <translation type="unfinished">Änderung der Passphrase fehlgeschlagen</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 alte Passphrase, die für die Entschlüsselung der Wallet eingegeben wurde, ist falsch. Sie enthält ein Null-Zeichen (d.h. ein Null-Byte). Wenn die Passphrase mit einer Version dieser Software vor 25.0 festgelegt wurde, versuchen Sie es bitte erneut mit den Zeichen bis zum ersten Null-Zeichen, aber ohne dieses.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">Warnung: Die Feststelltaste ist aktiviert!</translation>
- </message>
-</context>
-<context>
- <name>BanTableModel</name>
- <message>
- <source>IP/Netmask</source>
- <translation type="unfinished">IP/Netzmaske</translation>
- </message>
- <message>
- <source>Banned Until</source>
- <translation type="unfinished">Gesperrt bis</translation>
- </message>
-</context>
-<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">Die Einstellungsdatei %1 ist möglicherweise beschädigt oder ungültig.</translation>
- </message>
- <message>
- <source>Runaway exception</source>
- <translation type="unfinished">Ausreisser Ausnahme</translation>
- </message>
- <message>
- <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Ein fataler Fehler ist aufgetreten. %1 kann nicht länger sicher fortfahren und wird beendet.</translation>
- </message>
- <message>
- <source>Internal error</source>
- <translation type="unfinished">Interner Fehler</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">Ein interner Fehler ist aufgetreten. %1 wird versuchen, sicher fortzufahren. Dies ist ein unerwarteter Fehler, der wie unten beschrieben, gemeldet werden kann.</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">Möchten Sie Einstellungen auf Standardwerte zurücksetzen oder abbrechen, ohne Änderungen vorzunehmen?</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">Ein schwerwiegender Fehler ist aufgetreten. Überprüfen Sie, ob die Einstellungsdatei beschreibbar ist, oder versuchen Sie, mit -nosettings zu starten.</translation>
- </message>
- <message>
- <source>Error: %1</source>
- <translation type="unfinished">Fehler: %1</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 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 Sekunde</numerusform>
- <numerusform>%n Sekunden</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 Minute</numerusform>
- <numerusform>%n Minuten</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>%nStunde</numerusform>
- <numerusform>%n Stunden</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>%nTag</numerusform>
- <numerusform>%n Tage</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 Woche</numerusform>
- <numerusform>%n Wochen</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</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>%nJahr</numerusform>
- <numerusform>%n Jahre</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
</context>
<context>
<name>BitcoinGUI</name>
- <message>
- <source>&amp;Overview</source>
- <translation type="unfinished">und Ãœ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">Und Überträgen </translation>
- </message>
- <message>
- <source>Create a new wallet</source>
- <translation type="unfinished">Neues Wallet erstellen</translation>
- </message>
- <message>
- <source>&amp;Options…</source>
- <translation type="unfinished">weitere Möglichkeiten/Einstellungen </translation>
- </message>
- <message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">Nachricht bestätigen </translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation type="unfinished">&amp;Hilfe</translation>
- </message>
- <message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">Verbinde mit Peers...</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> %n Block der Transaktionshistorie verarbeitet.</numerusform>
- <numerusform> %n Blöcke der Transaktionshistorie verarbeitet.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</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">Der letzte empfangene Block ist %1 alt.</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">Hinweis</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+Q</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 aktive Verbindung zum Bitcoin-Netzwerk</numerusform>
- <numerusform>%n aktive Verbindung(en) zum Bitcoin-Netzwerk</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <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">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>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>
- <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>
<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>
@@ -832,14 +153,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<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>
@@ -899,3898 +212,67 @@ 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>
- <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>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>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>Wallet Name</source>
- <translation type="unfinished">Wallet-Name</translation>
- </message>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">Brieftasche</translation>
- </message>
- <message>
- <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">Verschlüssele das Wallet. 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 Speicherplatz verfügbar</numerusform>
- <numerusform>%n GB Speicherplatz verfügbar</numerusform>
+ <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>(von %n GB benötigt)</numerusform>
- <numerusform>(von %n GB benötigt)</numerusform>
+ <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 benötigt für komplette Blockchain)</numerusform>
- <numerusform>(%n GB benötigt für komplette Blockchain)</numerusform>
+ <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">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>(für Wiederherstellung ausreichende Sicherung %n Tag alt)</numerusform>
- <numerusform>(für Wiederherstellung ausreichende Sicherung %n Tage alt)</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>%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 zu %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 bearbeiten. 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 zur hohen Last und kann Hardwareprobleme, die bisher nicht aufgetreten sind, mit ihrem Computer verursachen. Jedes Mal, wenn Sie %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 Sie bewusst den Blockchain-Speicher begrenzen (pruning), müssen die historischen Daten dennoch heruntergeladen und verarbeitet werden. Diese Daten werden aber zum 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">Abschätzung der verbleibenden 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 Blockkette.</translation>
- </message>
- <message>
- <source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Unbekannt. Synchronisiere Headers (%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-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>
- <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">RPC-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">Hinweis</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>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">Eingehend:</translation>
- </message>
- <message>
- <source>Out:</source>
- <translation type="unfinished">Ausgehend:</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>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>
<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>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Block</numerusform>
- <numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Blöcken</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">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>
<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>reift noch %n weiteren Block</numerusform>
- <numerusform>reift noch %n weitere Blöcken</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<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">beobachtet</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\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>
- <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. Kein -proxy, -onion oder -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 0, eine Gebühr ungleich 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 watchonly 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: Lesen aller Datensätze in der Datenbank nicht möglich</translation>
- </message>
- <message>
- <source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</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: 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>
- <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: Es konnte kein Port abgehört werden. 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 Abhören für eingehende Verbindungen ist fehlgeschlagen (Das Abhö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 Verzeichnis "%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 Brieftasche</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 der Transaktionsänderung 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">Für die Transaktion wird eine neue Adresse benötigt, aber wir können sie nicht generieren.</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 externe Eingabe 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">Unfähig %s 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 Änderungstyp '%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>
+ </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_de_CH.ts b/src/qt/locale/bitcoin_de_CH.ts
index 2792a1bc98..ffbc761ac1 100644
--- a/src/qt/locale/bitcoin_de_CH.ts
+++ b/src/qt/locale/bitcoin_de_CH.ts
@@ -23,7 +23,7 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">&amp;Schließen</translation>
+ <translation type="unfinished">&amp;Schliessen</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -184,6 +184,10 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Geben Sie die alte und die neue Wallet-Passphrase ein.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Weiter</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">Beachten Sie, dass das Verschlüsseln Ihrer Wallet nicht komplett vor Diebstahl Ihrer Bitcoins durch Malware schützt, die Ihren Computer infiziert hat.</translation>
</message>
@@ -427,7 +431,11 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<numerusform>%n Jahre</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard-Wallet</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -447,18 +455,110 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Neues Wallet erstellen</translation>
</message>
<message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">&amp;Minimieren</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Ändert die Passphrase, die für die Wallet-Verschlüsselung benutzt wird</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation type="unfinished">&amp;Senden</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">&amp;Empfangen</translation>
+ </message>
+ <message>
<source>&amp;Options…</source>
- <translation type="unfinished">weitere Möglichkeiten/Einstellungen </translation>
+ <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">Verschlüsselt die zu Ihrer Wallet gehörenden privaten Schlüssel</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 unterzeichnen…</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 bestätigen </translation>
+ <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">Schließe Wallet…</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Erstelle Wallet…</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 Headers (%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 Peers...</translation>
</message>
@@ -522,6 +622,50 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">STRG+Q</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">Knotenfenster</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Öffne Knotenkonsole 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>
@@ -556,10 +700,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<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>
@@ -616,7 +756,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
<numerusform>%n aktive Verbindung zum Bitcoin-Netzwerk</numerusform>
- <numerusform>%n aktive Verbindung(en) zum Bitcoin-Netzwerk</numerusform>
+ <numerusform>%n aktive Verbindungen zum Bitcoin-Netzwerk</numerusform>
</translation>
</message>
<message>
@@ -640,6 +780,10 @@ 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>
+ </message>
+ <message>
<source>Error creating wallet</source>
<translation type="unfinished">Fehler beim Erstellen der Wallet</translation>
</message>
@@ -960,10 +1104,6 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Wallet öffnen Warnung</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standard-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">Öffne Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
@@ -2087,6 +2227,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Anzahl der Verbindungen</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Lokale Adressen</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Netzwerk-Adressen, die dein Bitcoin-Node aktuell verwendet, um mit anderen Nodes zu kommunizieren.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Blockchain</translation>
</message>
@@ -2131,12 +2279,16 @@ 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>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Gegenstellen Reiter verstecken</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>
+ <source>Ctrl+X</source>
+ <translation type="unfinished">Strg+X</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Die Transportschicht-Version: %1</translation>
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
@@ -2205,6 +2357,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">User-Agent</translation>
</message>
<message>
+ <source>Node window</source>
+ <translation type="unfinished">Knotenfenster</translation>
+ </message>
+ <message>
<source>Current block height</source>
<translation type="unfinished">Aktuelle Blockhöhe</translation>
</message>
@@ -2233,6 +2389,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Richtung/Typ</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form.</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>
@@ -2445,6 +2605,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Netzwerkaktivität deaktiviert</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Keine</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Befehl wird ohne spezifizierte Wallet ausgeführt</translation>
</message>
@@ -3171,10 +3335,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<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>
@@ -3259,10 +3419,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<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>
@@ -3828,11 +3984,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<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>
@@ -3844,10 +3995,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<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>
@@ -3980,10 +4127,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<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>
@@ -4093,10 +4236,6 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<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>
@@ -4215,7 +4354,8 @@ Please try running the latest software version.
<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>
+Bitte mit der neuesten Softwareversion versuchen.
+</translation>
</message>
<message>
<source>
@@ -4230,6 +4370,10 @@ Unable to restore backup of wallet.</source>
Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind darf nur für eingehende Verbindungen verwendet werden ("out" wurde übergeben)</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Blocküberprüfung wurde unterbrochen</translation>
</message>
@@ -4555,6 +4699,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Nicht auflösbare vorausgewählter Input %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Nur Richtung festgelegt, keine Genehmigungen: '%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>
@@ -4684,10 +4832,6 @@ Verifikations-Error: %s</translation>
<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>
diff --git a/src/qt/locale/bitcoin_el.ts b/src/qt/locale/bitcoin_el.ts
index 61d6807947..a73d0a0b5c 100644
--- a/src/qt/locale/bitcoin_el.ts
+++ b/src/qt/locale/bitcoin_el.ts
@@ -2,6 +2,10 @@
<context>
<name>AddressBookPage</name>
<message>
+ <source>Create a new address</source>
+ <translation type="unfinished">ΔημιουÏγία νέας διεÏθυνσης </translation>
+ </message>
+ <message>
<source>&amp;New</source>
<translation type="unfinished">&amp;Îέo</translation>
</message>
@@ -86,6 +90,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -168,6 +176,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Εισαγάγετε τον παλιό και νέο κωδικό Ï€Ïόσβασης σας για το ποÏτοφόλι.</translation>
</message>
<message>
+ <source>Continue</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">Θυμίσου ότι το να κÏυπτογÏαφείς το ποÏτοφόλι σου δεν μποÏεί να Ï€Ïοστατέψει πλήÏως τα bitcoins σου από κλοπή από κακόβουλο λογισμικό που έχει μολÏνει τον υπολογιστή σου</translation>
</message>
@@ -283,6 +295,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">άγνωστο</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">ΠÏοεπιλεγμένη γÏαμματοσειÏά συστήματος "%1"</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Ποσό</translation>
</message>
@@ -389,7 +405,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n έτη</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">ΠÏοεπιλεγμένο ποÏτοφόλι</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -467,7 +487,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Αλλαγή της φÏάσης Ï€Ïόσβασης για την κÏυπτογÏάφηση του ποÏτοφολιοÏ</translation>
+ <translation type="unfinished">Αλλαγή του ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎºÏυπτογÏάφησης του ποÏτοφολιοÏ</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -684,11 +704,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">ΜεταφοÏά ΠοÏτοφολιοÏ</translation>
+ <translation type="unfinished">Μετεγκατάσταση ΠοÏτοφολιοÏ</translation>
</message>
<message>
<source>Migrate a wallet</source>
- <translation type="unfinished">ΜεταφοÏά ενός ποÏτοφολιοÏ</translation>
+ <translation type="unfinished">Μετεγκατάσταση ενός ποÏτοφολιοÏ</translation>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
@@ -703,10 +723,6 @@ 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>No wallets available</source>
<translation type="unfinished">Κανένα ποÏτοφόλι διαθέσιμο</translation>
</message>
@@ -758,8 +774,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>1%n ενεÏγές συνδέσεις στο δίκτυο Bitcoin.</numerusform>
- <numerusform>%n ενεÏγές συνδέσεις στο δίκτυο Bitcoin.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
<message>
@@ -1113,10 +1129,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -2235,6 +2247,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 data directory use the '%1' option.</source>
+ <translation type="unfinished">Για να καθοÏίσετε μια μη Ï€Ïοεπιλεγμένη θέση του καταλόγου δεδομένων, χÏησιμοποιήστε την επιλογή '%1'.</translation>
+ </message>
+ <message>
<source>Blocksdir</source>
<translation type="unfinished">Κατάλογος των Μπλοκς</translation>
</message>
@@ -2315,14 +2331,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ΜεταφοÏά</translation>
</message>
<message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Η συμβολοσειÏά αναγνωÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï Ï€ÎµÏιόδου σÏνδεσης BIP324 σε δεκαεξαδική μοÏφή, εάν υπάÏχει.</translation>
+ <source>Session ID</source>
+ <translation type="unfinished">ΑναγνωÏιστικό πεÏιόδου σÏνδεσης</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>
+ <message>
+ <source>Transaction Relay</source>
+ <translation type="unfinished">Αναμετάδοση Συναλλαγής</translation>
+ </message>
+ <message>
<source>Starting Block</source>
<translation type="unfinished">ΑÏχικό Μπλοκ</translation>
</message>
@@ -2347,6 +2371,36 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ΧαÏτογÏαφημένο ως</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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </message>
+ <message>
<source>User Agent</source>
<translation type="unfinished">Agent χÏήστη</translation>
</message>
@@ -2375,14 +2429,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2391,10 +2457,19 @@ If you are receiving this error you should request the merchant provide a BIP21
<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">Τελευταίο 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">Ο χÏόνος που έχει παÏέλθει από τη λήψη μιας νέας συναλλαγής που έγινε αποδεκτή στο υπόμνημά μας από αυτόν τον ομότιμο.</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">Τελευταία αποστολή</translation>
</message>
@@ -2464,10 +2539,58 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ΕισεÏχόμενo: Ξεκίνησε από 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">ΠλήÏες ΕξεÏχόμενη Αναμετάδοση: Ï€Ïοεπιλογή</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;ΑντιγÏαφή διεÏθυνσης</translation>
@@ -2502,6 +2625,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Η δÏαστηÏιότητα δικτÏου είναι απενεÏγοποιημένη</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Κανένα</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Εκτέλεση εντολής χωÏίς ποÏτοφόλι</translation>
</message>
@@ -2515,6 +2642,23 @@ If you are receiving this error you should request the merchant provide a BIP21
Εκτελέστε εντολή χÏησιμοποιώντας το ποÏτοφόλι "%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>
@@ -2647,6 +2791,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ΑντιγÏαφή &amp;ποσοÏ</translation>
</message>
<message>
+ <source>Base58 (Legacy)</source>
+ <translation type="unfinished">Base58 (Î Î±Î»Î±Î¹Î¿Ï Ï„Ïπου)</translation>
+ </message>
+ <message>
+ <source>Not recommended due to higher fees and less protection against typos.</source>
+ <translation type="unfinished">Δεν συνιστάται λόγω υψηλότεÏων χÏεώσεων και μικÏότεÏης Ï€Ïοστασίας έναντι τυπογÏαφικών σφαλμάτων.</translation>
+ </message>
+ <message>
+ <source>Generates an address compatible with older wallets.</source>
+ <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">ΔημιουÏγεί μια εγγενή διεÏθυνση 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>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">Δεν είναι δυνατό το ξεκλείδωμα του ποÏτοφολιοÏ.</translation>
</message>
@@ -2926,10 +3090,19 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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;μιουÏγία ΑνυπόγÏαφου</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">ΔημιουÏγεί μια συναλλαγή Bitcoin με μεÏική υπογÏαφή (PSBT) για χÏήση με Ï€.χ. ένα ποÏτοφόλι%1 εκτός σÏνδεσης ή ένα ποÏτοφόλι Ï…Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î¼Î²Î±Ï„ÏŒ με το PSBT.</translation>
+ </message>
+ <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 Ï€Ïος το '%2'</translation>
</message>
@@ -2951,6 +3124,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>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>
@@ -2987,6 +3165,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>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">ΠαÏακαλώ, ελέγξτε τη συναλλαγή σας. ΜποÏείτε να δημιουÏγήσετε και να στείλετε αυτήν τη συναλλαγή ή να δημιουÏγήσετε μια μεÏικώς υπογεγÏαμμένη συναλλαγή Bitcoin (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>
@@ -3005,6 +3188,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>Unsigned Transaction</source>
+ <comment>PSBT copied</comment>
+ <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
+ <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>
+ <message>
<source>Confirm send coins</source>
<translation type="unfinished"> Επιβεβαιώστε την αποστολή νομισμάτων</translation>
</message>
@@ -3043,8 +3240,8 @@ 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 />
- <numerusform />
+ <numerusform>Αναμένεται η έναÏξη επιβεβαίωσης εντός %n μπλοκ.</numerusform>
+ <numerusform>Αναμένεται η έναÏξη επιβεβαίωσης εντός %n μπλοκ.</numerusform>
</translation>
</message>
<message>
@@ -3107,6 +3304,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Το τέλος θα αφαιÏεθεί από το ποσό που αποστέλλεται. Ο παÏαλήπτης θα λάβει λιγότεÏα bitcoins από ÏŒ,τι εισάγετε στο πεδίο ποσό. Εάν επιλεγοÏν πολλοί παÏαλήπτες, το έξοδο διαιÏείται εξίσου.</translation>
</message>
<message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">Α&amp;φεÏέστε το τέλος από το ποσό</translation>
+ </message>
+ <message>
<source>Use available balance</source>
<translation type="unfinished">ΧÏησιμοποιήστε το διαθέσιμο υπόλοιπο</translation>
</message>
@@ -3145,10 +3346,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>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">ΜποÏείτε να υπογÏάψετε μηνÏματα/συμφωνίες με τις διευθÏνσεις σας για να αποδείξετε ότι μποÏείτε να λάβετε τα bitcoins που τους αποστέλλονται. ΠÏοσέξτε να μην υπογÏάψετε τίποτα ασαφές ή τυχαίο, καθώς οι επιθέσεις ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï "ψαÏέματος" ενδέχεται να σας εξαπατήσουν να υπογÏάψετε την ταυτότητά σας σε αυτοÏÏ‚. ΥπογÏάψτε μόνο πλήÏως λεπτομεÏείς δηλώσεις που συμφωνείτε.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">ΔιεÏθυνση Bitcoin που θα σταλεί το μήνυμα</translation>
</message>
@@ -3233,10 +3430,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>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>
@@ -3357,8 +3550,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>ωÏιμάζει σε %n πεÏισσότεÏα μπλοκ</numerusform>
+ <numerusform>ωÏιμάζει σε %n πεÏισσότεÏα κομμάτια</numerusform>
</translation>
</message>
<message>
@@ -3798,10 +3991,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -3890,10 +4079,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -3930,6 +4115,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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). Μειώστε τον αÏιθμό ή το μέγεθος των Ï€Ïοϊόντων.</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>
@@ -3946,12 +4135,12 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ΠÏέπει να ξαναφτιάξετε τη βάση δεδομένων χÏησιμοποιώντας το -reindex για να επιστÏέψετε στη λειτουÏγία χωÏίς εκτÏπωση. Αυτό θα ξαναφοÏτώσει ολόκληÏο το blockchain</translation>
</message>
<message>
- <source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">-maxmempool Ï€Ïέπει να είναι τουλάχιστον %d MB</translation>
+ <source>%s is set very high!</source>
+ <translation type="unfinished">%s είναι Ï€Î¿Î»Ï Ï…ÏˆÎ·Î»Î®!</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">ΠÏοέκυψε ένα κÏίσιμο εσωτεÏικό σφάλμα. ΑνατÏέξτε στο debug.log για λεπτομέÏειες</translation>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation type="unfinished">-maxmempool Ï€Ïέπει να είναι τουλάχιστον %d MB</translation>
</message>
<message>
<source>Cannot resolve -%s address: '%s'</source>
@@ -3959,7 +4148,19 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">ΑδÏνατη η εγγÏαφή στον κατάλογο δεδομένων '%s'. Ελέγξτε τα δικαιώματα.</translation>
+ <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>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>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Η αποτίμηση του τέλους απέτυχε. Το Fallbackfee είναι απενεÏγοποιημένο. ΠεÏιμένετε λίγα τετÏάγωνα ή ενεÏγοποιήστε το %s.</translation>
</message>
<message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
@@ -4106,10 +4307,18 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Μη έγκυÏη άδεια P2P: '%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>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">Η ακÏόαση για εισεÏχόμενες συνδέσεις απέτυχε (ακοÏστε επιστÏαμμένο σφάλμα %s)</translation>
+ </message>
+ <message>
<source>Loading P2P addresses…</source>
<translation type="unfinished">ΦόÏτωση διευθÏνσεων P2P...</translation>
</message>
@@ -4190,6 +4399,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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">Εκκίνηση των threads δικτÏου...</translation>
</message>
@@ -4274,6 +4487,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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">Έχει οÏιστεί άγνωστo δίκτυο στο -onlynet: '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts
index 01b428d46e..c8aacee4f3 100644
--- a/src/qt/locale/bitcoin_en.ts
+++ b/src/qt/locale/bitcoin_en.ts
@@ -55,7 +55,7 @@
</message>
<message>
<location line="-30"/>
- <location filename="../addressbookpage.cpp" line="+117"/>
+ <location filename="../addressbookpage.cpp" line="+113"/>
<source>&amp;Delete</source>
<translation>&amp;Delete</translation>
</message>
@@ -179,12 +179,12 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../askpassphrasedialog.cpp" line="+49"/>
+ <location filename="../askpassphrasedialog.cpp" line="+45"/>
<source>Encrypt wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+4"/>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
<translation type="unfinished"></translation>
</message>
@@ -199,7 +199,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+47"/>
+ <location line="+48"/>
<source>Confirm wallet encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -210,32 +210,43 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</message>
<message>
<location line="+0"/>
+ <location line="+18"/>
<source>Are you sure you wish to encrypt your wallet?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+18"/>
+ <location line="+12"/>
<location line="+58"/>
<source>Wallet encrypted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-138"/>
+ <location line="-152"/>
<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"></translation>
</message>
<message>
- <location line="+15"/>
+ <location line="+16"/>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+54"/>
+ <location line="+50"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
<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>
- <location line="+4"/>
+ <location line="+5"/>
<source>Wallet to be encrypted</source>
<translation type="unfinished"></translation>
</message>
@@ -245,7 +256,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+15"/>
<source>Your wallet is now encrypted. </source>
<translation type="unfinished"></translation>
</message>
@@ -273,7 +284,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-49"/>
+ <location line="-53"/>
<location line="+3"/>
<location line="+15"/>
<source>Wallet unlock failed</source>
@@ -281,17 +292,17 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</message>
<message>
<location line="-17"/>
- <location line="+34"/>
+ <location line="+38"/>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-31"/>
+ <location line="-35"/>
<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"></translation>
</message>
<message>
- <location line="+23"/>
+ <location line="+27"/>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished"></translation>
</message>
@@ -307,7 +318,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+45"/>
+ <location line="+46"/>
<location line="+33"/>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished"></translation>
@@ -334,7 +345,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+179"/>
+ <location line="+184"/>
<source>Runaway exception</source>
<translation type="unfinished"></translation>
</message>
@@ -357,7 +368,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<context>
<name>BitcoinGUI</name>
<message>
- <location filename="../bitcoingui.cpp" line="+250"/>
+ <location filename="../bitcoingui.cpp" line="+252"/>
<source>&amp;Overview</source>
<translation>&amp;Overview</translation>
</message>
@@ -417,7 +428,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+163"/>
+ <location line="+184"/>
<source>&amp;Minimize</source>
<translation type="unfinished"></translation>
</message>
@@ -427,7 +438,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+417"/>
+ <location line="+418"/>
<source>Network activity disabled.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished"></translation>
@@ -438,7 +449,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-1199"/>
+ <location line="-1221"/>
<source>Send coins to a Bitcoin address</source>
<translation>Send coins to a Bitcoin address</translation>
</message>
@@ -533,7 +544,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+121"/>
+ <location line="+142"/>
<source>&amp;File</source>
<translation>&amp;File</translation>
</message>
@@ -553,7 +564,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation>Tabs toolbar</translation>
</message>
<message>
- <location line="+481"/>
+ <location line="+482"/>
<source>Syncing Headers (%1%)…</source>
<translation type="unfinished"></translation>
</message>
@@ -578,7 +589,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-857"/>
+ <location line="-879"/>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished"></translation>
</message>
@@ -593,12 +604,12 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+30"/>
+ <location line="+31"/>
<source>&amp;Command-line options</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+769"/>
+ <location line="+790"/>
<source>Processed %n block(s) of transaction history.</source>
<translation>
<numerusform>Processed %n block of transaction history.</numerusform>
@@ -646,7 +657,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation>Up to date</translation>
</message>
<message>
- <location line="-842"/>
+ <location line="-864"/>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
@@ -733,7 +744,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+5"/>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished"></translation>
</message>
@@ -748,17 +759,13 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+31"/>
- <source>default wallet</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+21"/>
+ <location line="+51"/>
+ <location line="+59"/>
<source>No wallets available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="-53"/>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
<translation type="unfinished"></translation>
@@ -782,7 +789,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+69"/>
+ <location line="+90"/>
<source>&amp;Window</source>
<translation type="unfinished">&amp;Window</translation>
</message>
@@ -817,7 +824,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+117"/>
+ <location line="+118"/>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
@@ -1034,7 +1041,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished">Confirmed</translation>
</message>
<message>
- <location filename="../coincontroldialog.cpp" line="+69"/>
+ <location filename="../coincontroldialog.cpp" line="+65"/>
<source>Copy amount</source>
<translation type="unfinished"></translation>
</message>
@@ -1094,7 +1101,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+298"/>
+ <location line="+294"/>
<source>(%1 locked)</source>
<translation type="unfinished"></translation>
</message>
@@ -1123,7 +1130,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<context>
<name>CreateWalletActivity</name>
<message>
- <location filename="../walletcontroller.cpp" line="+246"/>
+ <location filename="../walletcontroller.cpp" line="+248"/>
<source>Create Wallet</source>
<extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
<translation type="unfinished"></translation>
@@ -1228,7 +1235,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../createwalletdialog.cpp" line="+22"/>
+ <location filename="../createwalletdialog.cpp" line="+20"/>
<source>Create</source>
<translation type="unfinished"></translation>
</message>
@@ -1310,7 +1317,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<context>
<name>FreespaceChecker</name>
<message>
- <location filename="../intro.cpp" line="+75"/>
+ <location filename="../intro.cpp" line="+73"/>
<source>A new data directory will be created.</source>
<translation>A new data directory will be created.</translation>
</message>
@@ -1338,7 +1345,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<context>
<name>HelpMessageDialog</name>
<message>
- <location filename="../utilitydialog.cpp" line="+38"/>
+ <location filename="../utilitydialog.cpp" line="+36"/>
<source>version</source>
<translation type="unfinished">version</translation>
</message>
@@ -1521,7 +1528,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+23"/>
+ <location line="+17"/>
<source>Migrate Wallet</source>
<translation type="unfinished"></translation>
</message>
@@ -1581,7 +1588,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<location line="+7"/>
<location line="+26"/>
- <location filename="../modaloverlay.cpp" line="+152"/>
+ <location filename="../modaloverlay.cpp" line="+160"/>
<source>Unknown…</source>
<translation type="unfinished"></translation>
</message>
@@ -1622,12 +1629,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../modaloverlay.cpp" line="-121"/>
+ <location filename="../modaloverlay.cpp" line="-126"/>
<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"></translation>
</message>
<message>
- <location line="+127"/>
+ <location line="+132"/>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
<translation type="unfinished"></translation>
</message>
@@ -1659,7 +1666,7 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>OpenWalletActivity</name>
<message>
- <location filename="../walletcontroller.cpp" line="-161"/>
+ <location filename="../walletcontroller.cpp" line="-155"/>
<source>Open wallet failed</source>
<translation type="unfinished"></translation>
</message>
@@ -1669,12 +1676,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+10"/>
- <source>default wallet</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+4"/>
+ <location line="+14"/>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished"></translation>
@@ -2059,7 +2061,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="+152"/>
+ <location filename="../optionsdialog.cpp" line="+153"/>
<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>
@@ -2145,7 +2147,7 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>OptionsModel</name>
<message>
- <location filename="../optionsmodel.cpp" line="+230"/>
+ <location filename="../optionsmodel.cpp" line="+228"/>
<source>Could not read setting &quot;%1&quot;, %2.</source>
<translation type="unfinished"></translation>
</message>
@@ -2282,7 +2284,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../psbtoperationsdialog.cpp" line="+60"/>
+ <location filename="../psbtoperationsdialog.cpp" line="+64"/>
<source>Failed to load transaction: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -2421,7 +2423,7 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>PaymentServer</name>
<message>
- <location filename="../paymentserver.cpp" line="+149"/>
+ <location filename="../paymentserver.cpp" line="+145"/>
<source>Payment request error</source>
<translation type="unfinished"></translation>
</message>
@@ -2545,12 +2547,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Amount</translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="+133"/>
+ <location filename="../guiutil.cpp" line="+138"/>
<source>Enter a Bitcoin address (e.g. %1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+288"/>
+ <location line="+295"/>
<source>Ctrl+W</source>
<translation type="unfinished"></translation>
</message>
@@ -2737,13 +2739,14 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<location line="+2"/>
- <location filename="../rpcconsole.cpp" line="+1006"/>
+ <location filename="../rpcconsole.cpp" line="+1021"/>
<source>%1 kB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
- <location filename="../rpcconsole.cpp" line="+2"/>
+ <location filename="../rpcconsole.cpp" line="+1"/>
+ <location line="+1"/>
<source>%1 MB</source>
<translation type="unfinished"></translation>
</message>
@@ -2753,7 +2756,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../bitcoin.cpp" line="-282"/>
+ <location line="+180"/>
+ <source>default wallet</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../bitcoin.cpp" line="-287"/>
<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>
@@ -2765,7 +2773,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+423"/>
+ <location line="+428"/>
<source>Error: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -2780,7 +2788,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="-389"/>
+ <location filename="../optionsdialog.cpp" line="-391"/>
<source>Embedded &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
@@ -2798,7 +2806,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<context>
<name>QRImageWidget</name>
<message>
- <location filename="../qrimagewidget.cpp" line="+30"/>
+ <location filename="../qrimagewidget.cpp" line="+28"/>
<source>&amp;Save Image…</source>
<translation type="unfinished"></translation>
</message>
@@ -2844,11 +2852,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<location line="+26"/>
<location line="+36"/>
<location line="+23"/>
- <location line="+36"/>
+ <location line="+71"/>
<location line="+23"/>
<location line="+36"/>
<location line="+23"/>
- <location line="+692"/>
+ <location line="+767"/>
<location line="+26"/>
<location line="+26"/>
<location line="+26"/>
@@ -2876,12 +2884,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<location line="+26"/>
<location line="+26"/>
<location line="+26"/>
- <location filename="../rpcconsole.h" line="+147"/>
+ <location filename="../rpcconsole.h" line="+145"/>
<source>N/A</source>
<translation>N/A</translation>
</message>
<message>
- <location line="-1649"/>
+ <location line="-1759"/>
<source>Client version</source>
<translation>Client version</translation>
</message>
@@ -2922,12 +2930,12 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<location line="+29"/>
- <location line="+944"/>
+ <location line="+1054"/>
<source>Network</source>
<translation>Network</translation>
</message>
<message>
- <location line="-937"/>
+ <location line="-1047"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
@@ -2937,7 +2945,17 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation>Number of connections</translation>
</message>
<message>
- <location line="+29"/>
+ <location line="+23"/>
+ <source>Local Addresses</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+13"/>
<source>Block chain</source>
<translation>Block chain</translation>
</message>
@@ -2973,18 +2991,18 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<location line="+80"/>
- <location line="+760"/>
+ <location line="+835"/>
<source>Received</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-680"/>
- <location line="+657"/>
+ <location line="-755"/>
+ <location line="+732"/>
<source>Sent</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-616"/>
+ <location line="-691"/>
<source>&amp;Peers</source>
<translation type="unfinished"></translation>
</message>
@@ -2994,28 +3012,33 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+68"/>
- <location filename="../rpcconsole.cpp" line="+165"/>
+ <location line="+76"/>
+ <location filename="../rpcconsole.cpp" line="+166"/>
<source>Select a peer to view detailed information.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+80"/>
- <source>The transport layer version: %1</source>
+ <location line="+52"/>
+ <source>Hide Peers Detail</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
- <source>Transport</source>
+ <location line="+21"/>
+ <source>Ctrl+X</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+23"/>
- <source>The BIP324 session ID string in hex, if any.</source>
+ <location line="+74"/>
+ <source>The transport layer version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
+ <source>Transport</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
<source>Session ID</source>
<translation type="unfinished"></translation>
</message>
@@ -3101,18 +3124,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-1616"/>
- <location line="+1103"/>
+ <location line="-1726"/>
+ <location line="+1213"/>
<source>User Agent</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-1177"/>
+ <location line="-1287"/>
<source>Node window</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+253"/>
+ <location line="+288"/>
<source>Current block height</source>
<translation type="unfinished"></translation>
</message>
@@ -3132,7 +3155,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+546"/>
+ <location line="+621"/>
<source>Permissions</source>
<translation type="unfinished"></translation>
</message>
@@ -3147,7 +3170,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+75"/>
+ <location line="+49"/>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished"></translation>
</message>
@@ -3223,7 +3251,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-1310"/>
+ <location line="-1385"/>
<source>Last block time</source>
<translation>Last block time</translation>
</message>
@@ -3248,7 +3276,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="-203"/>
+ <location filename="../rpcconsole.cpp" line="-216"/>
<source>In:</source>
<translation type="unfinished"></translation>
</message>
@@ -3298,7 +3326,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="-475"/>
+ <location filename="../rpcconsole.cpp" line="-477"/>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
<translation type="unfinished"></translation>
@@ -3391,7 +3419,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+153"/>
+ <location line="+154"/>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished"></translation>
@@ -3433,17 +3461,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+230"/>
+ <location line="+231"/>
<source>Network activity disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+13"/>
+ <source>None</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location line="+79"/>
<source>Executing command without any wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+325"/>
+ <location line="+326"/>
<source>Ctrl+I</source>
<translation type="unfinished"></translation>
</message>
@@ -3468,12 +3501,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-348"/>
+ <location line="-349"/>
<source>Executing command using &quot;%1&quot; wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-147"/>
+ <location line="-161"/>
<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.
@@ -3485,7 +3518,7 @@ For more information on using this console, type %6.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+157"/>
+ <location line="+171"/>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished"></translation>
@@ -3728,7 +3761,7 @@ For more information on using this console, type %6.
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../receiverequestdialog.cpp" line="+48"/>
+ <location filename="../receiverequestdialog.cpp" line="+46"/>
<source>Request payment to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -3741,7 +3774,7 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
- <location filename="../recentrequeststablemodel.cpp" line="+32"/>
+ <location filename="../recentrequeststablemodel.cpp" line="+34"/>
<source>Date</source>
<translation type="unfinished">Date</translation>
</message>
@@ -3813,7 +3846,7 @@ For more information on using this console, type %6.
<name>SendCoinsDialog</name>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="+14"/>
- <location filename="../sendcoinsdialog.cpp" line="+762"/>
+ <location filename="../sendcoinsdialog.cpp" line="+763"/>
<source>Send Coins</source>
<translation>Send Coins</translation>
</message>
@@ -3995,7 +4028,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<translation>S&amp;end</translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="-667"/>
+ <location filename="../sendcoinsdialog.cpp" line="-668"/>
<source>Copy quantity</source>
<translation type="unfinished"></translation>
</message>
@@ -4072,7 +4105,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="+62"/>
+ <location line="+63"/>
<source>Sign failed</source>
<translation type="unfinished"></translation>
</message>
@@ -4111,7 +4144,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="-324"/>
+ <location line="-325"/>
<source>or</source>
<translation type="unfinished"></translation>
</message>
@@ -4184,7 +4217,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="+29"/>
+ <location line="+30"/>
<source>PSBT saved to disk</source>
<translation type="unfinished"></translation>
</message>
@@ -4397,7 +4430,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</message>
<message>
<location line="+6"/>
- <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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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>
@@ -4512,27 +4545,25 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../signverifymessagedialog.cpp" line="+119"/>
+ <location filename="../signverifymessagedialog.cpp" line="+120"/>
<location line="+99"/>
<source>The entered address is invalid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-99"/>
- <location line="+7"/>
- <location line="+93"/>
- <location line="+7"/>
+ <location line="+100"/>
<source>Please check the address and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-100"/>
- <location line="+99"/>
- <source>The entered address does not refer to a key.</source>
+ <location line="-93"/>
+ <location line="+98"/>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-91"/>
+ <location line="-90"/>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4557,7 +4588,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="+69"/>
+ <location line="+66"/>
<source>The signature could not be decoded.</source>
<translation type="unfinished"></translation>
</message>
@@ -4578,7 +4609,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="-32"/>
+ <location line="-29"/>
<source>Message verified.</source>
<translation type="unfinished"></translation>
</message>
@@ -4586,7 +4617,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<context>
<name>SplashScreen</name>
<message>
- <location filename="../splashscreen.cpp" line="+177"/>
+ <location filename="../splashscreen.cpp" line="+175"/>
<source>(press q to shutdown and continue later)</source>
<translation type="unfinished"></translation>
</message>
@@ -4607,7 +4638,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<context>
<name>TransactionDesc</name>
<message>
- <location filename="../transactiondesc.cpp" line="+44"/>
+ <location filename="../transactiondesc.cpp" line="+40"/>
<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"></translation>
@@ -5170,7 +5201,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<context>
<name>WalletController</name>
<message>
- <location filename="../walletcontroller.cpp" line="-346"/>
+ <location filename="../walletcontroller.cpp" line="-347"/>
<source>Close wallet</source>
<translation type="unfinished"></translation>
</message>
@@ -5245,21 +5276,21 @@ Go to File &gt; Open Wallet to load a wallet.
<context>
<name>WalletModel</name>
<message>
- <location filename="../walletmodel.cpp" line="+227"/>
+ <location filename="../walletmodel.cpp" line="+224"/>
<location line="+13"/>
<source>Send Coins</source>
<translation type="unfinished">Send Coins</translation>
</message>
<message>
<location line="+254"/>
- <location line="+55"/>
- <location line="+15"/>
+ <location line="+49"/>
+ <location line="+20"/>
<location line="+5"/>
<source>Fee bump error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-75"/>
+ <location line="-74"/>
<source>Increasing transaction fee failed</source>
<translation type="unfinished"></translation>
</message>
@@ -5295,7 +5326,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+23"/>
+ <location line="+17"/>
<source>Can&apos;t draft transaction.</source>
<translation type="unfinished"></translation>
</message>
@@ -5306,12 +5337,11 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<location line="+0"/>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
+ <source>Fee-bump PSBT copied to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+13"/>
<source>Can&apos;t sign transaction.</source>
<translation type="unfinished"></translation>
</message>
@@ -5321,13 +5351,13 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+14"/>
- <source>Can&apos;t display address</source>
+ <location line="+13"/>
+ <source>Signer error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+18"/>
- <source>default wallet</source>
+ <location line="+3"/>
+ <source>Can&apos;t display address</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5463,17 +5493,17 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+12"/>
+ <location line="+15"/>
<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"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+14"/>
<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"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+8"/>
<source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
<translation type="unfinished"></translation>
</message>
@@ -5494,11 +5524,6 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<location line="+16"/>
- <source>Please check that your computer&apos;s date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished"></translation>
</message>
@@ -5518,7 +5543,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+6"/>
<source>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>
<translation type="unfinished"></translation>
</message>
@@ -5533,7 +5558,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+12"/>
+ <location line="+16"/>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished"></translation>
</message>
@@ -5623,7 +5648,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+19"/>
<source>%s is set very high!</source>
<translation type="unfinished"></translation>
</message>
@@ -5633,12 +5658,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+2"/>
+ <location line="+4"/>
<source>Cannot resolve -%s address: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
@@ -5658,7 +5678,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-225"/>
+ <location line="-252"/>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished"></translation>
</message>
@@ -5699,6 +5719,12 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<location line="+3"/>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -5709,6 +5735,16 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<location line="+6"/>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished"></translation>
</message>
@@ -5718,7 +5754,17 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+18"/>
+ <location line="+7"/>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+13"/>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished"></translation>
</message>
@@ -5738,7 +5784,17 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+29"/>
+ <location line="+14"/>
+ <source>Rename of &apos;%s&apos; -&gt; &apos;%s&apos; failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet&apos;s UTXOs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet&apos;s UTXOs</source>
<translation type="unfinished"></translation>
</message>
@@ -5781,6 +5837,11 @@ Please try running the latest software version.
</message>
<message>
<location line="+34"/>
+ <source>Your computer&apos;s date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you&apos;ve confirmed your computer&apos;s clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you&apos;ve connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished"></translation>
@@ -5792,7 +5853,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+3"/>
+ <source>whitebind may only be used for incoming connections (&quot;out&quot; was passed)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Assumeutxo data not found for the given blockhash &apos;%s&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Block verification was interrupted</source>
<translation type="unfinished"></translation>
</message>
@@ -5808,6 +5884,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Corrupted block database detected</source>
<translation type="unfinished"></translation>
</message>
@@ -5843,6 +5924,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Error committing db txn for wallet transactions removal</source>
<translation type="unfinished"></translation>
</message>
@@ -6028,11 +6114,26 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Failed to disconnect block.</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>
<message>
<location line="+1"/>
+ <source>Failed to read block.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished"></translation>
</message>
@@ -6048,6 +6149,26 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Failed to write block.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Failure removing transaction: %s</source>
<translation type="unfinished"></translation>
</message>
@@ -6168,6 +6289,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Missing amount</source>
<translation type="unfinished"></translation>
</message>
@@ -6203,6 +6329,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Only direction was set, no permissions: &apos;%s&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished"></translation>
</message>
@@ -6258,6 +6389,21 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+3"/>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Signing transaction failed</source>
<translation type="unfinished"></translation>
</message>
@@ -6293,6 +6439,21 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>The source code is available from %s.</source>
<translation type="unfinished"></translation>
</message>
@@ -6313,6 +6474,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>This is experimental software.</source>
<translation type="unfinished"></translation>
</message>
@@ -6363,11 +6529,6 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
- <source>Unable to allocate memory for -maxsigcachesize: &apos;%s&apos; MiB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished"></translation>
</message>
@@ -6443,6 +6604,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Unrecognised option &quot;%s&quot; provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished"></translation>
</message>
@@ -6462,7 +6628,7 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-110"/>
+ <location line="-126"/>
<source>Error: Could not add watchonly tx %s to watchonly wallet</source>
<translation type="unfinished"></translation>
</message>
@@ -6472,7 +6638,7 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+110"/>
+ <location line="+126"/>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished"></translation>
</message>
@@ -6492,7 +6658,7 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-45"/>
+ <location line="-52"/>
<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 2bab80e3dd..eef3fd3cfe 100644
--- a/src/qt/locale/bitcoin_en.xlf
+++ b/src/qt/locale/bitcoin_en.xlf
@@ -45,7 +45,7 @@
<trans-unit id="_msg11">
<source xml:space="preserve">&amp;Delete</source>
<context-group purpose="location"><context context-type="linenumber">101</context></context-group>
- <context-group purpose="location"><context context-type="sourcefile">../addressbookpage.cpp</context><context context-type="linenumber">117</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../addressbookpage.cpp</context><context context-type="linenumber">113</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -53,62 +53,62 @@
<group restype="x-trolltech-linguist-context" resname="AddressBookPage">
<trans-unit id="_msg12">
<source xml:space="preserve">Choose the address to send coins to</source>
- <context-group purpose="location"><context context-type="linenumber">87</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">83</context></context-group>
</trans-unit>
<trans-unit id="_msg13">
<source xml:space="preserve">Choose the address to receive coins with</source>
- <context-group purpose="location"><context context-type="linenumber">88</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">84</context></context-group>
</trans-unit>
<trans-unit id="_msg14">
<source xml:space="preserve">C&amp;hoose</source>
- <context-group purpose="location"><context context-type="linenumber">93</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">89</context></context-group>
</trans-unit>
<trans-unit id="_msg15">
<source xml:space="preserve">These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <context-group purpose="location"><context context-type="linenumber">99</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
<trans-unit id="_msg16">
<source xml:space="preserve">These are your Bitcoin addresses for receiving payments. Use the &apos;Create new receiving address&apos; button in the receive tab to create new addresses.
Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
- <context-group purpose="location"><context context-type="linenumber">104</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
<trans-unit id="_msg17">
<source xml:space="preserve">&amp;Copy Address</source>
- <context-group purpose="location"><context context-type="linenumber">112</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">108</context></context-group>
</trans-unit>
<trans-unit id="_msg18">
<source xml:space="preserve">Copy &amp;Label</source>
- <context-group purpose="location"><context context-type="linenumber">113</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">109</context></context-group>
</trans-unit>
<trans-unit id="_msg19">
<source xml:space="preserve">&amp;Edit</source>
- <context-group purpose="location"><context context-type="linenumber">114</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">110</context></context-group>
</trans-unit>
<trans-unit id="_msg20">
<source xml:space="preserve">Export Address List</source>
- <context-group purpose="location"><context context-type="linenumber">279</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">275</context></context-group>
</trans-unit>
<trans-unit id="_msg21">
<source xml:space="preserve">Comma separated file</source>
- <context-group purpose="location"><context context-type="linenumber">282</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">278</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="_msg22">
<source xml:space="preserve">There was an error trying to save the address list to %1. Please try again.</source>
- <context-group purpose="location"><context context-type="linenumber">298</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">294</context></context-group>
<note annotates="source" from="developer">An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</note>
</trans-unit>
<trans-unit id="_msg23">
<source xml:space="preserve">Sending addresses - %1</source>
- <context-group purpose="location"><context context-type="linenumber">330</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
<trans-unit id="_msg24">
<source xml:space="preserve">Receiving addresses - %1</source>
- <context-group purpose="location"><context context-type="linenumber">331</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">327</context></context-group>
</trans-unit>
<trans-unit id="_msg25">
<source xml:space="preserve">Exporting Failed</source>
- <context-group purpose="location"><context context-type="linenumber">295</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">291</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -156,122 +156,131 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<group restype="x-trolltech-linguist-context" resname="AskPassphraseDialog">
<trans-unit id="_msg34">
<source xml:space="preserve">Encrypt wallet</source>
- <context-group purpose="location"><context context-type="linenumber">49</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">45</context></context-group>
</trans-unit>
<trans-unit id="_msg35">
<source xml:space="preserve">This operation needs your wallet passphrase to unlock the wallet.</source>
- <context-group purpose="location"><context context-type="linenumber">52</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">49</context></context-group>
</trans-unit>
<trans-unit id="_msg36">
<source xml:space="preserve">Unlock wallet</source>
- <context-group purpose="location"><context context-type="linenumber">57</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">54</context></context-group>
</trans-unit>
<trans-unit id="_msg37">
<source xml:space="preserve">Change passphrase</source>
- <context-group purpose="location"><context context-type="linenumber">60</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">57</context></context-group>
</trans-unit>
<trans-unit id="_msg38">
<source xml:space="preserve">Confirm wallet encryption</source>
- <context-group purpose="location"><context context-type="linenumber">107</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">105</context></context-group>
</trans-unit>
<trans-unit id="_msg39">
<source xml:space="preserve">Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <context-group purpose="location"><context context-type="linenumber">108</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">106</context></context-group>
</trans-unit>
<trans-unit id="_msg40">
<source xml:space="preserve">Are you sure you wish to encrypt your wallet?</source>
- <context-group purpose="location"><context context-type="linenumber">108</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">106</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">124</context></context-group>
</trans-unit>
<trans-unit id="_msg41">
<source xml:space="preserve">Wallet encrypted</source>
- <context-group purpose="location"><context context-type="linenumber">126</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">184</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">136</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">194</context></context-group>
</trans-unit>
<trans-unit id="_msg42">
<source xml:space="preserve">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>
- <context-group purpose="location"><context context-type="linenumber">46</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">42</context></context-group>
</trans-unit>
<trans-unit id="_msg43">
<source xml:space="preserve">Enter the old passphrase and new passphrase for the wallet.</source>
- <context-group purpose="location"><context context-type="linenumber">61</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">58</context></context-group>
</trans-unit>
<trans-unit id="_msg44">
- <source xml:space="preserve">Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <context-group purpose="location"><context context-type="linenumber">115</context></context-group>
+ <source xml:space="preserve">Continue</source>
+ <context-group purpose="location"><context context-type="linenumber">108</context></context-group>
</trans-unit>
<trans-unit id="_msg45">
- <source xml:space="preserve">Wallet to be encrypted</source>
- <context-group purpose="location"><context context-type="linenumber">119</context></context-group>
+ <source xml:space="preserve">Back</source>
+ <context-group purpose="location"><context context-type="linenumber">109</context></context-group>
</trans-unit>
<trans-unit id="_msg46">
- <source xml:space="preserve">Your wallet is about to be encrypted. </source>
- <context-group purpose="location"><context context-type="linenumber">121</context></context-group>
+ <source xml:space="preserve">Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <context-group purpose="location"><context context-type="linenumber">116</context></context-group>
</trans-unit>
<trans-unit id="_msg47">
- <source xml:space="preserve">Your wallet is now encrypted. </source>
- <context-group purpose="location"><context context-type="linenumber">128</context></context-group>
+ <source xml:space="preserve">Wallet to be encrypted</source>
+ <context-group purpose="location"><context context-type="linenumber">121</context></context-group>
</trans-unit>
<trans-unit id="_msg48">
- <source xml:space="preserve">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>
- <context-group purpose="location"><context context-type="linenumber">130</context></context-group>
+ <source xml:space="preserve">Your wallet is about to be encrypted. </source>
+ <context-group purpose="location"><context context-type="linenumber">123</context></context-group>
</trans-unit>
<trans-unit id="_msg49">
- <source xml:space="preserve">Wallet encryption failed</source>
- <context-group purpose="location"><context context-type="linenumber">136</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">144</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">206</context></context-group>
+ <source xml:space="preserve">Your wallet is now encrypted. </source>
+ <context-group purpose="location"><context context-type="linenumber">138</context></context-group>
</trans-unit>
<trans-unit id="_msg50">
- <source xml:space="preserve">Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <context-group purpose="location"><context context-type="linenumber">137</context></context-group>
+ <source xml:space="preserve">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>
+ <context-group purpose="location"><context context-type="linenumber">140</context></context-group>
</trans-unit>
<trans-unit id="_msg51">
- <source xml:space="preserve">The supplied passphrases do not match.</source>
- <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">207</context></context-group>
+ <source xml:space="preserve">Wallet encryption failed</source>
+ <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">154</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">216</context></context-group>
</trans-unit>
<trans-unit id="_msg52">
- <source xml:space="preserve">Wallet unlock failed</source>
- <context-group purpose="location"><context context-type="linenumber">158</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">161</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">176</context></context-group>
+ <source xml:space="preserve">Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
<trans-unit id="_msg53">
- <source xml:space="preserve">The passphrase entered for the wallet decryption was incorrect.</source>
- <context-group purpose="location"><context context-type="linenumber">159</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">193</context></context-group>
+ <source xml:space="preserve">The supplied passphrases do not match.</source>
+ <context-group purpose="location"><context context-type="linenumber">155</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">217</context></context-group>
</trans-unit>
<trans-unit id="_msg54">
- <source xml:space="preserve">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>
- <context-group purpose="location"><context context-type="linenumber">162</context></context-group>
+ <source xml:space="preserve">Wallet unlock failed</source>
+ <context-group purpose="location"><context context-type="linenumber">164</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">167</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">182</context></context-group>
</trans-unit>
<trans-unit id="_msg55">
- <source xml:space="preserve">Wallet passphrase was successfully changed.</source>
- <context-group purpose="location"><context context-type="linenumber">185</context></context-group>
+ <source xml:space="preserve">The passphrase entered for the wallet decryption was incorrect.</source>
+ <context-group purpose="location"><context context-type="linenumber">165</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">203</context></context-group>
</trans-unit>
<trans-unit id="_msg56">
- <source xml:space="preserve">Passphrase change failed</source>
- <context-group purpose="location"><context context-type="linenumber">192</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">195</context></context-group>
+ <source xml:space="preserve">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>
+ <context-group purpose="location"><context context-type="linenumber">168</context></context-group>
</trans-unit>
<trans-unit id="_msg57">
- <source xml:space="preserve">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>
- <context-group purpose="location"><context context-type="linenumber">196</context></context-group>
+ <source xml:space="preserve">Wallet passphrase was successfully changed.</source>
+ <context-group purpose="location"><context context-type="linenumber">195</context></context-group>
</trans-unit>
<trans-unit id="_msg58">
+ <source xml:space="preserve">Passphrase change failed</source>
+ <context-group purpose="location"><context context-type="linenumber">202</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">205</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg59">
+ <source xml:space="preserve">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>
+ <context-group purpose="location"><context context-type="linenumber">206</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg60">
<source xml:space="preserve">Warning: The Caps Lock key is on!</source>
- <context-group purpose="location"><context context-type="linenumber">241</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">252</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">285</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../bantablemodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="BanTableModel">
- <trans-unit id="_msg59">
+ <trans-unit id="_msg61">
<source xml:space="preserve">IP/Netmask</source>
<context-group purpose="location"><context context-type="linenumber">85</context></context-group>
</trans-unit>
- <trans-unit id="_msg60">
+ <trans-unit id="_msg62">
<source xml:space="preserve">Banned Until</source>
<context-group purpose="location"><context context-type="linenumber">85</context></context-group>
</trans-unit>
@@ -279,605 +288,602 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</body></file>
<file original="../bitcoin.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="BitcoinApplication">
- <trans-unit id="_msg61">
+ <trans-unit id="_msg63">
<source xml:space="preserve">Settings file %1 might be corrupt or invalid.</source>
<context-group purpose="location"><context context-type="linenumber">275</context></context-group>
</trans-unit>
- <trans-unit id="_msg62">
+ <trans-unit id="_msg64">
<source xml:space="preserve">Runaway exception</source>
- <context-group purpose="location"><context context-type="linenumber">454</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">459</context></context-group>
</trans-unit>
- <trans-unit id="_msg63">
+ <trans-unit id="_msg65">
<source xml:space="preserve">A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <context-group purpose="location"><context context-type="linenumber">455</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">460</context></context-group>
</trans-unit>
- <trans-unit id="_msg64">
+ <trans-unit id="_msg66">
<source xml:space="preserve">Internal error</source>
- <context-group purpose="location"><context context-type="linenumber">464</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">469</context></context-group>
</trans-unit>
- <trans-unit id="_msg65">
+ <trans-unit id="_msg67">
<source xml:space="preserve">An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <context-group purpose="location"><context context-type="linenumber">465</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">470</context></context-group>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="QObject">
- <trans-unit id="_msg66">
+ <trans-unit id="_msg68">
<source xml:space="preserve">Do you want to reset settings to default values, or to abort without making changes?</source>
<context-group purpose="location"><context context-type="linenumber">183</context></context-group>
<note annotates="source" from="developer">Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</note>
</trans-unit>
- <trans-unit id="_msg67">
+ <trans-unit id="_msg69">
<source xml:space="preserve">A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
<context-group purpose="location"><context context-type="linenumber">203</context></context-group>
<note annotates="source" from="developer">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.</note>
</trans-unit>
- <trans-unit id="_msg68">
+ <trans-unit id="_msg70">
<source xml:space="preserve">Error: %1</source>
- <context-group purpose="location"><context context-type="linenumber">626</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">631</context></context-group>
</trans-unit>
- <trans-unit id="_msg69">
+ <trans-unit id="_msg71">
<source xml:space="preserve">%1 didn&apos;t yet exit safely…</source>
- <context-group purpose="location"><context context-type="linenumber">699</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">704</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../bitcoingui.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="BitcoinGUI">
- <trans-unit id="_msg70">
+ <trans-unit id="_msg72">
<source xml:space="preserve">&amp;Overview</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="_msg71">
+ <trans-unit id="_msg73">
<source xml:space="preserve">Show general overview of wallet</source>
- <context-group purpose="location"><context context-type="linenumber">251</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">253</context></context-group>
</trans-unit>
- <trans-unit id="_msg72">
+ <trans-unit id="_msg74">
<source xml:space="preserve">&amp;Transactions</source>
- <context-group purpose="location"><context context-type="linenumber">271</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">273</context></context-group>
</trans-unit>
- <trans-unit id="_msg73">
+ <trans-unit id="_msg75">
<source xml:space="preserve">Browse transaction history</source>
- <context-group purpose="location"><context context-type="linenumber">272</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
</trans-unit>
- <trans-unit id="_msg74">
+ <trans-unit id="_msg76">
<source xml:space="preserve">E&amp;xit</source>
- <context-group purpose="location"><context context-type="linenumber">291</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">293</context></context-group>
</trans-unit>
- <trans-unit id="_msg75">
+ <trans-unit id="_msg77">
<source xml:space="preserve">Quit application</source>
- <context-group purpose="location"><context context-type="linenumber">292</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">294</context></context-group>
</trans-unit>
- <trans-unit id="_msg76">
+ <trans-unit id="_msg78">
<source xml:space="preserve">&amp;About %1</source>
- <context-group purpose="location"><context context-type="linenumber">295</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">297</context></context-group>
</trans-unit>
- <trans-unit id="_msg77">
+ <trans-unit id="_msg79">
<source xml:space="preserve">Show information about %1</source>
- <context-group purpose="location"><context context-type="linenumber">296</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">298</context></context-group>
</trans-unit>
- <trans-unit id="_msg78">
+ <trans-unit id="_msg80">
<source xml:space="preserve">About &amp;Qt</source>
- <context-group purpose="location"><context context-type="linenumber">299</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
</trans-unit>
- <trans-unit id="_msg79">
+ <trans-unit id="_msg81">
<source xml:space="preserve">Show information about Qt</source>
- <context-group purpose="location"><context context-type="linenumber">300</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">302</context></context-group>
</trans-unit>
- <trans-unit id="_msg80">
+ <trans-unit id="_msg82">
<source xml:space="preserve">Modify configuration options for %1</source>
- <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>
- <trans-unit id="_msg81">
+ <trans-unit id="_msg83">
<source xml:space="preserve">Create a new wallet</source>
- <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">349</context></context-group>
</trans-unit>
- <trans-unit id="_msg82">
+ <trans-unit id="_msg84">
<source xml:space="preserve">&amp;Minimize</source>
- <context-group purpose="location"><context context-type="linenumber">510</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">533</context></context-group>
</trans-unit>
- <trans-unit id="_msg83">
+ <trans-unit id="_msg85">
<source xml:space="preserve">Wallet:</source>
- <context-group purpose="location"><context context-type="linenumber">589</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">612</context></context-group>
</trans-unit>
- <trans-unit id="_msg84">
+ <trans-unit id="_msg86">
<source xml:space="preserve">Network activity disabled.</source>
- <context-group purpose="location"><context context-type="linenumber">1006</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1030</context></context-group>
<note annotates="source" from="developer">A substring of the tooltip.</note>
</trans-unit>
- <trans-unit id="_msg85">
+ <trans-unit id="_msg87">
<source xml:space="preserve">Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1457</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1481</context></context-group>
</trans-unit>
- <trans-unit id="_msg86">
+ <trans-unit id="_msg88">
<source xml:space="preserve">Send coins to a Bitcoin address</source>
- <context-group purpose="location"><context context-type="linenumber">258</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
- <trans-unit id="_msg87">
+ <trans-unit id="_msg89">
<source xml:space="preserve">Backup wallet to another location</source>
- <context-group purpose="location"><context context-type="linenumber">311</context></context-group>
- </trans-unit>
- <trans-unit id="_msg88">
- <source xml:space="preserve">Change the passphrase used for wallet encryption</source>
<context-group purpose="location"><context context-type="linenumber">313</context></context-group>
</trans-unit>
- <trans-unit id="_msg89">
- <source xml:space="preserve">&amp;Send</source>
- <context-group purpose="location"><context context-type="linenumber">257</context></context-group>
- </trans-unit>
<trans-unit id="_msg90">
- <source xml:space="preserve">&amp;Receive</source>
- <context-group purpose="location"><context context-type="linenumber">264</context></context-group>
+ <source xml:space="preserve">Change the passphrase used for wallet encryption</source>
+ <context-group purpose="location"><context context-type="linenumber">315</context></context-group>
</trans-unit>
<trans-unit id="_msg91">
- <source xml:space="preserve">&amp;Options…</source>
- <context-group purpose="location"><context context-type="linenumber">302</context></context-group>
+ <source xml:space="preserve">&amp;Send</source>
+ <context-group purpose="location"><context context-type="linenumber">259</context></context-group>
</trans-unit>
<trans-unit id="_msg92">
- <source xml:space="preserve">&amp;Encrypt Wallet…</source>
- <context-group purpose="location"><context context-type="linenumber">307</context></context-group>
+ <source xml:space="preserve">&amp;Receive</source>
+ <context-group purpose="location"><context context-type="linenumber">266</context></context-group>
</trans-unit>
<trans-unit id="_msg93">
- <source xml:space="preserve">Encrypt the private keys that belong to your wallet</source>
- <context-group purpose="location"><context context-type="linenumber">308</context></context-group>
+ <source xml:space="preserve">&amp;Options…</source>
+ <context-group purpose="location"><context context-type="linenumber">304</context></context-group>
</trans-unit>
<trans-unit id="_msg94">
- <source xml:space="preserve">&amp;Backup Wallet…</source>
- <context-group purpose="location"><context context-type="linenumber">310</context></context-group>
+ <source xml:space="preserve">&amp;Encrypt Wallet…</source>
+ <context-group purpose="location"><context context-type="linenumber">309</context></context-group>
</trans-unit>
<trans-unit id="_msg95">
- <source xml:space="preserve">&amp;Change Passphrase…</source>
- <context-group purpose="location"><context context-type="linenumber">312</context></context-group>
+ <source xml:space="preserve">Encrypt the private keys that belong to your wallet</source>
+ <context-group purpose="location"><context context-type="linenumber">310</context></context-group>
</trans-unit>
<trans-unit id="_msg96">
- <source xml:space="preserve">Sign &amp;message…</source>
- <context-group purpose="location"><context context-type="linenumber">314</context></context-group>
+ <source xml:space="preserve">&amp;Backup Wallet…</source>
+ <context-group purpose="location"><context context-type="linenumber">312</context></context-group>
</trans-unit>
<trans-unit id="_msg97">
- <source xml:space="preserve">Sign messages with your Bitcoin addresses to prove you own them</source>
- <context-group purpose="location"><context context-type="linenumber">315</context></context-group>
+ <source xml:space="preserve">&amp;Change Passphrase…</source>
+ <context-group purpose="location"><context context-type="linenumber">314</context></context-group>
</trans-unit>
<trans-unit id="_msg98">
- <source xml:space="preserve">&amp;Verify message…</source>
+ <source xml:space="preserve">Sign &amp;message…</source>
<context-group purpose="location"><context context-type="linenumber">316</context></context-group>
</trans-unit>
<trans-unit id="_msg99">
- <source xml:space="preserve">Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <source xml:space="preserve">Sign messages with your Bitcoin addresses to prove you own them</source>
<context-group purpose="location"><context context-type="linenumber">317</context></context-group>
</trans-unit>
<trans-unit id="_msg100">
- <source xml:space="preserve">&amp;Load PSBT from file…</source>
+ <source xml:space="preserve">&amp;Verify message…</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
<trans-unit id="_msg101">
- <source xml:space="preserve">Open &amp;URI…</source>
- <context-group purpose="location"><context context-type="linenumber">334</context></context-group>
+ <source xml:space="preserve">Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <context-group purpose="location"><context context-type="linenumber">319</context></context-group>
</trans-unit>
<trans-unit id="_msg102">
- <source xml:space="preserve">Close Wallet…</source>
- <context-group purpose="location"><context context-type="linenumber">342</context></context-group>
+ <source xml:space="preserve">&amp;Load PSBT from file…</source>
+ <context-group purpose="location"><context context-type="linenumber">320</context></context-group>
</trans-unit>
<trans-unit id="_msg103">
- <source xml:space="preserve">Create Wallet…</source>
- <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
+ <source xml:space="preserve">Open &amp;URI…</source>
+ <context-group purpose="location"><context context-type="linenumber">336</context></context-group>
</trans-unit>
<trans-unit id="_msg104">
- <source xml:space="preserve">Close All Wallets…</source>
- <context-group purpose="location"><context context-type="linenumber">355</context></context-group>
+ <source xml:space="preserve">Close Wallet…</source>
+ <context-group purpose="location"><context context-type="linenumber">344</context></context-group>
</trans-unit>
<trans-unit id="_msg105">
- <source xml:space="preserve">&amp;File</source>
- <context-group purpose="location"><context context-type="linenumber">476</context></context-group>
+ <source xml:space="preserve">Create Wallet…</source>
+ <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
</trans-unit>
<trans-unit id="_msg106">
- <source xml:space="preserve">&amp;Settings</source>
- <context-group purpose="location"><context context-type="linenumber">497</context></context-group>
+ <source xml:space="preserve">Close All Wallets…</source>
+ <context-group purpose="location"><context context-type="linenumber">357</context></context-group>
</trans-unit>
<trans-unit id="_msg107">
- <source xml:space="preserve">&amp;Help</source>
- <context-group purpose="location"><context context-type="linenumber">558</context></context-group>
+ <source xml:space="preserve">&amp;File</source>
+ <context-group purpose="location"><context context-type="linenumber">499</context></context-group>
</trans-unit>
<trans-unit id="_msg108">
- <source xml:space="preserve">Tabs toolbar</source>
- <context-group purpose="location"><context context-type="linenumber">569</context></context-group>
+ <source xml:space="preserve">&amp;Settings</source>
+ <context-group purpose="location"><context context-type="linenumber">520</context></context-group>
</trans-unit>
<trans-unit id="_msg109">
- <source xml:space="preserve">Syncing Headers (%1%)…</source>
- <context-group purpose="location"><context context-type="linenumber">1050</context></context-group>
+ <source xml:space="preserve">&amp;Help</source>
+ <context-group purpose="location"><context context-type="linenumber">581</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">1108</context></context-group>
+ <source xml:space="preserve">Tabs toolbar</source>
+ <context-group purpose="location"><context context-type="linenumber">592</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">1113</context></context-group>
+ <source xml:space="preserve">Syncing Headers (%1%)…</source>
+ <context-group purpose="location"><context context-type="linenumber">1074</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">1115</context></context-group>
+ <source xml:space="preserve">Synchronizing with network…</source>
+ <context-group purpose="location"><context context-type="linenumber">1132</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">1122</context></context-group>
+ <source xml:space="preserve">Indexing blocks on disk…</source>
+ <context-group purpose="location"><context context-type="linenumber">1137</context></context-group>
</trans-unit>
<trans-unit id="_msg114">
- <source xml:space="preserve">Request payments (generates QR codes and bitcoin: URIs)</source>
- <context-group purpose="location"><context context-type="linenumber">265</context></context-group>
+ <source xml:space="preserve">Processing blocks on disk…</source>
+ <context-group purpose="location"><context context-type="linenumber">1139</context></context-group>
</trans-unit>
<trans-unit id="_msg115">
- <source xml:space="preserve">Show the list of used sending addresses and labels</source>
- <context-group purpose="location"><context context-type="linenumber">330</context></context-group>
+ <source xml:space="preserve">Connecting to peers…</source>
+ <context-group purpose="location"><context context-type="linenumber">1146</context></context-group>
</trans-unit>
<trans-unit id="_msg116">
- <source xml:space="preserve">Show the list of used receiving addresses and labels</source>
- <context-group purpose="location"><context context-type="linenumber">332</context></context-group>
+ <source xml:space="preserve">Request payments (generates QR codes and bitcoin: URIs)</source>
+ <context-group purpose="location"><context context-type="linenumber">267</context></context-group>
</trans-unit>
<trans-unit id="_msg117">
+ <source xml:space="preserve">Show the list of used sending addresses and labels</source>
+ <context-group purpose="location"><context context-type="linenumber">332</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg118">
+ <source xml:space="preserve">Show the list of used receiving addresses and labels</source>
+ <context-group purpose="location"><context context-type="linenumber">334</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg119">
<source xml:space="preserve">&amp;Command-line options</source>
- <context-group purpose="location"><context context-type="linenumber">362</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">365</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">1131</context></context-group>
- <trans-unit id="_msg118[0]">
+ <context-group purpose="location"><context context-type="linenumber">1155</context></context-group>
+ <trans-unit id="_msg120[0]">
<source xml:space="preserve">Processed %n block(s) of transaction history.</source>
</trans-unit>
- <trans-unit id="_msg118[1]">
+ <trans-unit id="_msg120[1]">
<source xml:space="preserve">Processed %n block(s) of transaction history.</source>
</trans-unit>
</group>
- <trans-unit id="_msg119">
+ <trans-unit id="_msg121">
<source xml:space="preserve">%1 behind</source>
- <context-group purpose="location"><context context-type="linenumber">1154</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
</trans-unit>
- <trans-unit id="_msg120">
+ <trans-unit id="_msg122">
<source xml:space="preserve">Catching up…</source>
- <context-group purpose="location"><context context-type="linenumber">1159</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1183</context></context-group>
</trans-unit>
- <trans-unit id="_msg121">
+ <trans-unit id="_msg123">
<source xml:space="preserve">Last received block was generated %1 ago.</source>
- <context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1202</context></context-group>
</trans-unit>
- <trans-unit id="_msg122">
+ <trans-unit id="_msg124">
<source xml:space="preserve">Transactions after this will not yet be visible.</source>
- <context-group purpose="location"><context context-type="linenumber">1180</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1204</context></context-group>
</trans-unit>
- <trans-unit id="_msg123">
+ <trans-unit id="_msg125">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">1220</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1244</context></context-group>
</trans-unit>
- <trans-unit id="_msg124">
+ <trans-unit id="_msg126">
<source xml:space="preserve">Warning</source>
- <context-group purpose="location"><context context-type="linenumber">1224</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1248</context></context-group>
</trans-unit>
- <trans-unit id="_msg125">
+ <trans-unit id="_msg127">
<source xml:space="preserve">Information</source>
- <context-group purpose="location"><context context-type="linenumber">1228</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1252</context></context-group>
</trans-unit>
- <trans-unit id="_msg126">
+ <trans-unit id="_msg128">
<source xml:space="preserve">Up to date</source>
- <context-group purpose="location"><context context-type="linenumber">1135</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1159</context></context-group>
</trans-unit>
- <trans-unit id="_msg127">
+ <trans-unit id="_msg129">
<source xml:space="preserve">Ctrl+Q</source>
- <context-group purpose="location"><context context-type="linenumber">293</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">295</context></context-group>
</trans-unit>
- <trans-unit id="_msg128">
+ <trans-unit id="_msg130">
<source xml:space="preserve">Load Partially Signed Bitcoin Transaction</source>
- <context-group purpose="location"><context context-type="linenumber">319</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg129">
+ <trans-unit id="_msg131">
<source xml:space="preserve">Load PSBT from &amp;clipboard…</source>
- <context-group purpose="location"><context context-type="linenumber">320</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">322</context></context-group>
</trans-unit>
- <trans-unit id="_msg130">
+ <trans-unit id="_msg132">
<source xml:space="preserve">Load Partially Signed Bitcoin Transaction from clipboard</source>
- <context-group purpose="location"><context context-type="linenumber">321</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">323</context></context-group>
</trans-unit>
- <trans-unit id="_msg131">
+ <trans-unit id="_msg133">
<source xml:space="preserve">Node window</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="_msg132">
+ <trans-unit id="_msg134">
<source xml:space="preserve">Open node debugging and diagnostic console</source>
- <context-group purpose="location"><context context-type="linenumber">324</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
- <trans-unit id="_msg133">
+ <trans-unit id="_msg135">
<source xml:space="preserve">&amp;Sending addresses</source>
- <context-group purpose="location"><context context-type="linenumber">329</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">331</context></context-group>
</trans-unit>
- <trans-unit id="_msg134">
+ <trans-unit id="_msg136">
<source xml:space="preserve">&amp;Receiving addresses</source>
- <context-group purpose="location"><context context-type="linenumber">331</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">333</context></context-group>
</trans-unit>
- <trans-unit id="_msg135">
+ <trans-unit id="_msg137">
<source xml:space="preserve">Open a bitcoin: URI</source>
- <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">337</context></context-group>
</trans-unit>
- <trans-unit id="_msg136">
+ <trans-unit id="_msg138">
<source xml:space="preserve">Open Wallet</source>
- <context-group purpose="location"><context context-type="linenumber">337</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
</trans-unit>
- <trans-unit id="_msg137">
+ <trans-unit id="_msg139">
<source xml:space="preserve">Open a wallet</source>
- <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">341</context></context-group>
</trans-unit>
- <trans-unit id="_msg138">
+ <trans-unit id="_msg140">
<source xml:space="preserve">Close wallet</source>
- <context-group purpose="location"><context context-type="linenumber">343</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
</trans-unit>
- <trans-unit id="_msg139">
+ <trans-unit id="_msg141">
<source xml:space="preserve">Restore Wallet…</source>
- <context-group purpose="location"><context context-type="linenumber">350</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">352</context></context-group>
<note annotates="source" from="developer">Name of the menu item that restores wallet from a backup file.</note>
</trans-unit>
- <trans-unit id="_msg140">
+ <trans-unit id="_msg142">
<source xml:space="preserve">Restore a wallet from a backup file</source>
- <context-group purpose="location"><context context-type="linenumber">353</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">355</context></context-group>
<note annotates="source" from="developer">Status tip for Restore Wallet menu item</note>
</trans-unit>
- <trans-unit id="_msg141">
+ <trans-unit id="_msg143">
<source xml:space="preserve">Close all wallets</source>
- <context-group purpose="location"><context context-type="linenumber">356</context></context-group>
- </trans-unit>
- <trans-unit id="_msg142">
- <source xml:space="preserve">Migrate Wallet</source>
<context-group purpose="location"><context context-type="linenumber">358</context></context-group>
</trans-unit>
- <trans-unit id="_msg143">
- <source xml:space="preserve">Migrate a wallet</source>
- <context-group purpose="location"><context context-type="linenumber">360</context></context-group>
- </trans-unit>
<trans-unit id="_msg144">
- <source xml:space="preserve">Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <context-group purpose="location"><context context-type="linenumber">364</context></context-group>
+ <source xml:space="preserve">Migrate Wallet</source>
+ <context-group purpose="location"><context context-type="linenumber">360</context></context-group>
</trans-unit>
<trans-unit id="_msg145">
- <source xml:space="preserve">&amp;Mask values</source>
- <context-group purpose="location"><context context-type="linenumber">366</context></context-group>
+ <source xml:space="preserve">Migrate a wallet</source>
+ <context-group purpose="location"><context context-type="linenumber">362</context></context-group>
</trans-unit>
<trans-unit id="_msg146">
- <source xml:space="preserve">Mask the values in the Overview tab</source>
- <context-group purpose="location"><context context-type="linenumber">368</context></context-group>
+ <source xml:space="preserve">Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <context-group purpose="location"><context context-type="linenumber">367</context></context-group>
</trans-unit>
<trans-unit id="_msg147">
- <source xml:space="preserve">default wallet</source>
- <context-group purpose="location"><context context-type="linenumber">399</context></context-group>
+ <source xml:space="preserve">&amp;Mask values</source>
+ <context-group purpose="location"><context context-type="linenumber">369</context></context-group>
</trans-unit>
<trans-unit id="_msg148">
- <source xml:space="preserve">No wallets available</source>
- <context-group purpose="location"><context context-type="linenumber">420</context></context-group>
+ <source xml:space="preserve">Mask the values in the Overview tab</source>
+ <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
</trans-unit>
<trans-unit id="_msg149">
+ <source xml:space="preserve">No wallets available</source>
+ <context-group purpose="location"><context context-type="linenumber">422</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">481</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg150">
<source xml:space="preserve">Wallet Data</source>
- <context-group purpose="location"><context context-type="linenumber">426</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">428</context></context-group>
<note annotates="source" from="developer">Name of the wallet data file format.</note>
</trans-unit>
- <trans-unit id="_msg150">
+ <trans-unit id="_msg151">
<source xml:space="preserve">Load Wallet Backup</source>
- <context-group purpose="location"><context context-type="linenumber">429</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">431</context></context-group>
<note annotates="source" from="developer">The title for Restore Wallet File Windows</note>
</trans-unit>
- <trans-unit id="_msg151">
+ <trans-unit id="_msg152">
<source xml:space="preserve">Restore Wallet</source>
- <context-group purpose="location"><context context-type="linenumber">437</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">439</context></context-group>
<note annotates="source" from="developer">Title of pop-up window shown when the user is attempting to restore a wallet.</note>
</trans-unit>
- <trans-unit id="_msg152">
+ <trans-unit id="_msg153">
<source xml:space="preserve">Wallet Name</source>
- <context-group purpose="location"><context context-type="linenumber">439</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">441</context></context-group>
<note annotates="source" from="developer">Label of the input field where the name of the wallet is entered.</note>
</trans-unit>
- <trans-unit id="_msg153">
+ <trans-unit id="_msg154">
<source xml:space="preserve">&amp;Window</source>
- <context-group purpose="location"><context context-type="linenumber">508</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">531</context></context-group>
</trans-unit>
- <trans-unit id="_msg154">
+ <trans-unit id="_msg155">
<source xml:space="preserve">Ctrl+M</source>
- <context-group purpose="location"><context context-type="linenumber">511</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">534</context></context-group>
</trans-unit>
- <trans-unit id="_msg155">
+ <trans-unit id="_msg156">
<source xml:space="preserve">Zoom</source>
- <context-group purpose="location"><context context-type="linenumber">520</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">543</context></context-group>
</trans-unit>
- <trans-unit id="_msg156">
+ <trans-unit id="_msg157">
<source xml:space="preserve">Main Window</source>
- <context-group purpose="location"><context context-type="linenumber">538</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">561</context></context-group>
</trans-unit>
- <trans-unit id="_msg157">
+ <trans-unit id="_msg158">
<source xml:space="preserve">%1 client</source>
- <context-group purpose="location"><context context-type="linenumber">817</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">840</context></context-group>
</trans-unit>
- <trans-unit id="_msg158">
+ <trans-unit id="_msg159">
<source xml:space="preserve">&amp;Hide</source>
- <context-group purpose="location"><context context-type="linenumber">885</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">908</context></context-group>
</trans-unit>
- <trans-unit id="_msg159">
+ <trans-unit id="_msg160">
<source xml:space="preserve">S&amp;how</source>
- <context-group purpose="location"><context context-type="linenumber">886</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">909</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">1003</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1027</context></context-group>
<note annotates="source" from="developer">A substring of the tooltip.</note>
- <trans-unit id="_msg160[0]">
+ <trans-unit id="_msg161[0]">
<source xml:space="preserve">%n active connection(s) to Bitcoin network.</source>
</trans-unit>
- <trans-unit id="_msg160[1]">
+ <trans-unit id="_msg161[1]">
<source xml:space="preserve">%n active connection(s) to Bitcoin network.</source>
</trans-unit>
</group>
- <trans-unit id="_msg161">
+ <trans-unit id="_msg162">
<source xml:space="preserve">Click for more actions.</source>
- <context-group purpose="location"><context context-type="linenumber">1013</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1037</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">
+ <trans-unit id="_msg163">
<source xml:space="preserve">Show Peers tab</source>
- <context-group purpose="location"><context context-type="linenumber">1030</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1054</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">
+ <trans-unit id="_msg164">
<source xml:space="preserve">Disable network activity</source>
- <context-group purpose="location"><context context-type="linenumber">1038</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1062</context></context-group>
<note annotates="source" from="developer">A context menu item.</note>
</trans-unit>
- <trans-unit id="_msg164">
+ <trans-unit id="_msg165">
<source xml:space="preserve">Enable network activity</source>
- <context-group purpose="location"><context context-type="linenumber">1040</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1064</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">
+ <trans-unit id="_msg166">
<source xml:space="preserve">Pre-syncing Headers (%1%)…</source>
- <context-group purpose="location"><context context-type="linenumber">1057</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1081</context></context-group>
</trans-unit>
- <trans-unit id="_msg166">
+ <trans-unit id="_msg167">
<source xml:space="preserve">Error creating wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1196</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1220</context></context-group>
</trans-unit>
- <trans-unit id="_msg167">
+ <trans-unit id="_msg168">
<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">1196</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1220</context></context-group>
</trans-unit>
- <trans-unit id="_msg168">
+ <trans-unit id="_msg169">
<source xml:space="preserve">Error: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1221</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1245</context></context-group>
</trans-unit>
- <trans-unit id="_msg169">
+ <trans-unit id="_msg170">
<source xml:space="preserve">Warning: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1225</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1249</context></context-group>
</trans-unit>
- <trans-unit id="_msg170">
+ <trans-unit id="_msg171">
<source xml:space="preserve">Date: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1333</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1357</context></context-group>
</trans-unit>
- <trans-unit id="_msg171">
+ <trans-unit id="_msg172">
<source xml:space="preserve">Amount: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1334</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1358</context></context-group>
</trans-unit>
- <trans-unit id="_msg172">
+ <trans-unit id="_msg173">
<source xml:space="preserve">Wallet: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1336</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1360</context></context-group>
</trans-unit>
- <trans-unit id="_msg173">
+ <trans-unit id="_msg174">
<source xml:space="preserve">Type: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1362</context></context-group>
</trans-unit>
- <trans-unit id="_msg174">
+ <trans-unit id="_msg175">
<source xml:space="preserve">Label: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1340</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1364</context></context-group>
</trans-unit>
- <trans-unit id="_msg175">
+ <trans-unit id="_msg176">
<source xml:space="preserve">Address: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1342</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1366</context></context-group>
</trans-unit>
- <trans-unit id="_msg176">
+ <trans-unit id="_msg177">
<source xml:space="preserve">Sent transaction</source>
- <context-group purpose="location"><context context-type="linenumber">1343</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1367</context></context-group>
</trans-unit>
- <trans-unit id="_msg177">
+ <trans-unit id="_msg178">
<source xml:space="preserve">Incoming transaction</source>
- <context-group purpose="location"><context context-type="linenumber">1343</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1367</context></context-group>
</trans-unit>
- <trans-unit id="_msg178">
+ <trans-unit id="_msg179">
<source xml:space="preserve">HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1419</context></context-group>
</trans-unit>
- <trans-unit id="_msg179">
+ <trans-unit id="_msg180">
<source xml:space="preserve">HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1419</context></context-group>
</trans-unit>
- <trans-unit id="_msg180">
+ <trans-unit id="_msg181">
<source xml:space="preserve">Private key &lt;b&gt;disabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1419</context></context-group>
</trans-unit>
- <trans-unit id="_msg181">
+ <trans-unit id="_msg182">
<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">1418</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1442</context></context-group>
</trans-unit>
- <trans-unit id="_msg182">
+ <trans-unit id="_msg183">
<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">1426</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1450</context></context-group>
</trans-unit>
- <trans-unit id="_msg183">
+ <trans-unit id="_msg184">
<source xml:space="preserve">Original message:</source>
- <context-group purpose="location"><context context-type="linenumber">1545</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1569</context></context-group>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="UnitDisplayStatusBarControl">
- <trans-unit id="_msg184">
+ <trans-unit id="_msg185">
<source xml:space="preserve">Unit to show amounts in. Click to select another unit.</source>
- <context-group purpose="location"><context context-type="linenumber">1584</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1608</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../forms/coincontroldialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="CoinControlDialog">
- <trans-unit id="_msg185">
+ <trans-unit id="_msg186">
<source xml:space="preserve">Coin Selection</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg186">
+ <trans-unit id="_msg187">
<source xml:space="preserve">Quantity:</source>
<context-group purpose="location"><context context-type="linenumber">51</context></context-group>
</trans-unit>
- <trans-unit id="_msg187">
+ <trans-unit id="_msg188">
<source xml:space="preserve">Bytes:</source>
<context-group purpose="location"><context context-type="linenumber">80</context></context-group>
</trans-unit>
- <trans-unit id="_msg188">
+ <trans-unit id="_msg189">
<source xml:space="preserve">Amount:</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
- <trans-unit id="_msg189">
+ <trans-unit id="_msg190">
<source xml:space="preserve">Fee:</source>
<context-group purpose="location"><context context-type="linenumber">170</context></context-group>
</trans-unit>
- <trans-unit id="_msg190">
+ <trans-unit id="_msg191">
<source xml:space="preserve">After Fee:</source>
<context-group purpose="location"><context context-type="linenumber">218</context></context-group>
</trans-unit>
- <trans-unit id="_msg191">
+ <trans-unit id="_msg192">
<source xml:space="preserve">Change:</source>
<context-group purpose="location"><context context-type="linenumber">250</context></context-group>
</trans-unit>
- <trans-unit id="_msg192">
+ <trans-unit id="_msg193">
<source xml:space="preserve">(un)select all</source>
<context-group purpose="location"><context context-type="linenumber">306</context></context-group>
</trans-unit>
- <trans-unit id="_msg193">
+ <trans-unit id="_msg194">
<source xml:space="preserve">Tree mode</source>
<context-group purpose="location"><context context-type="linenumber">322</context></context-group>
</trans-unit>
- <trans-unit id="_msg194">
+ <trans-unit id="_msg195">
<source xml:space="preserve">List mode</source>
<context-group purpose="location"><context context-type="linenumber">335</context></context-group>
</trans-unit>
- <trans-unit id="_msg195">
+ <trans-unit id="_msg196">
<source xml:space="preserve">Amount</source>
<context-group purpose="location"><context context-type="linenumber">391</context></context-group>
</trans-unit>
- <trans-unit id="_msg196">
+ <trans-unit id="_msg197">
<source xml:space="preserve">Received with label</source>
<context-group purpose="location"><context context-type="linenumber">396</context></context-group>
</trans-unit>
- <trans-unit id="_msg197">
+ <trans-unit id="_msg198">
<source xml:space="preserve">Received with address</source>
<context-group purpose="location"><context context-type="linenumber">401</context></context-group>
</trans-unit>
- <trans-unit id="_msg198">
+ <trans-unit id="_msg199">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">406</context></context-group>
</trans-unit>
- <trans-unit id="_msg199">
+ <trans-unit id="_msg200">
<source xml:space="preserve">Confirmations</source>
<context-group purpose="location"><context context-type="linenumber">411</context></context-group>
</trans-unit>
- <trans-unit id="_msg200">
+ <trans-unit id="_msg201">
<source xml:space="preserve">Confirmed</source>
<context-group purpose="location"><context context-type="linenumber">414</context></context-group>
</trans-unit>
@@ -885,235 +891,231 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</body></file>
<file original="../coincontroldialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="CoinControlDialog">
- <trans-unit id="_msg201">
+ <trans-unit id="_msg202">
<source xml:space="preserve">Copy amount</source>
- <context-group purpose="location"><context context-type="linenumber">69</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">65</context></context-group>
</trans-unit>
- <trans-unit id="_msg202">
+ <trans-unit id="_msg203">
<source xml:space="preserve">&amp;Copy address</source>
- <context-group purpose="location"><context context-type="linenumber">58</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">54</context></context-group>
</trans-unit>
- <trans-unit id="_msg203">
+ <trans-unit id="_msg204">
<source xml:space="preserve">Copy &amp;label</source>
- <context-group purpose="location"><context context-type="linenumber">59</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">55</context></context-group>
</trans-unit>
- <trans-unit id="_msg204">
+ <trans-unit id="_msg205">
<source xml:space="preserve">Copy &amp;amount</source>
- <context-group purpose="location"><context context-type="linenumber">60</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">56</context></context-group>
</trans-unit>
- <trans-unit id="_msg205">
+ <trans-unit id="_msg206">
<source xml:space="preserve">Copy transaction &amp;ID and output index</source>
- <context-group purpose="location"><context context-type="linenumber">61</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">57</context></context-group>
</trans-unit>
- <trans-unit id="_msg206">
+ <trans-unit id="_msg207">
<source xml:space="preserve">L&amp;ock unspent</source>
- <context-group purpose="location"><context context-type="linenumber">63</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">59</context></context-group>
</trans-unit>
- <trans-unit id="_msg207">
+ <trans-unit id="_msg208">
<source xml:space="preserve">&amp;Unlock unspent</source>
- <context-group purpose="location"><context context-type="linenumber">64</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">60</context></context-group>
</trans-unit>
- <trans-unit id="_msg208">
+ <trans-unit id="_msg209">
<source xml:space="preserve">Copy quantity</source>
- <context-group purpose="location"><context context-type="linenumber">68</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">64</context></context-group>
</trans-unit>
- <trans-unit id="_msg209">
+ <trans-unit id="_msg210">
<source xml:space="preserve">Copy fee</source>
- <context-group purpose="location"><context context-type="linenumber">70</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">66</context></context-group>
</trans-unit>
- <trans-unit id="_msg210">
+ <trans-unit id="_msg211">
<source xml:space="preserve">Copy after fee</source>
- <context-group purpose="location"><context context-type="linenumber">71</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">67</context></context-group>
</trans-unit>
- <trans-unit id="_msg211">
+ <trans-unit id="_msg212">
<source xml:space="preserve">Copy bytes</source>
- <context-group purpose="location"><context context-type="linenumber">72</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">68</context></context-group>
</trans-unit>
- <trans-unit id="_msg212">
+ <trans-unit id="_msg213">
<source xml:space="preserve">Copy change</source>
- <context-group purpose="location"><context context-type="linenumber">73</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">69</context></context-group>
</trans-unit>
- <trans-unit id="_msg213">
+ <trans-unit id="_msg214">
<source xml:space="preserve">(%1 locked)</source>
- <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">363</context></context-group>
</trans-unit>
- <trans-unit id="_msg214">
+ <trans-unit id="_msg215">
<source xml:space="preserve">Can vary +/- %1 satoshi(s) per input.</source>
- <context-group purpose="location"><context context-type="linenumber">536</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">528</context></context-group>
</trans-unit>
- <trans-unit id="_msg215">
+ <trans-unit id="_msg216">
<source xml:space="preserve">(no label)</source>
- <context-group purpose="location"><context context-type="linenumber">581</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">635</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">573</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">627</context></context-group>
</trans-unit>
- <trans-unit id="_msg216">
+ <trans-unit id="_msg217">
<source xml:space="preserve">change from %1 (%2)</source>
- <context-group purpose="location"><context context-type="linenumber">628</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">620</context></context-group>
</trans-unit>
- <trans-unit id="_msg217">
+ <trans-unit id="_msg218">
<source xml:space="preserve">(change)</source>
- <context-group purpose="location"><context context-type="linenumber">629</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">621</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../walletcontroller.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="CreateWalletActivity">
- <trans-unit id="_msg218">
+ <trans-unit id="_msg219">
<source xml:space="preserve">Create Wallet</source>
- <context-group purpose="location"><context context-type="linenumber">246</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">248</context></context-group>
<note annotates="source" from="developer">Title of window indicating the progress of creation of a new wallet.</note>
</trans-unit>
- <trans-unit id="_msg219">
+ <trans-unit id="_msg220">
<source xml:space="preserve">Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <context-group purpose="location"><context context-type="linenumber">249</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">251</context></context-group>
<note annotates="source" from="developer">Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</note>
</trans-unit>
- <trans-unit id="_msg220">
- <source xml:space="preserve">Create wallet failed</source>
- <context-group purpose="location"><context context-type="linenumber">281</context></context-group>
- </trans-unit>
<trans-unit id="_msg221">
- <source xml:space="preserve">Create wallet warning</source>
+ <source xml:space="preserve">Create wallet failed</source>
<context-group purpose="location"><context context-type="linenumber">283</context></context-group>
</trans-unit>
<trans-unit id="_msg222">
- <source xml:space="preserve">Can&apos;t list signers</source>
- <context-group purpose="location"><context context-type="linenumber">299</context></context-group>
+ <source xml:space="preserve">Create wallet warning</source>
+ <context-group purpose="location"><context context-type="linenumber">285</context></context-group>
</trans-unit>
<trans-unit id="_msg223">
+ <source xml:space="preserve">Can&apos;t list signers</source>
+ <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg224">
<source xml:space="preserve">Too many external signers found</source>
- <context-group purpose="location"><context context-type="linenumber">302</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">304</context></context-group>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="LoadWalletsActivity">
- <trans-unit id="_msg224">
+ <trans-unit id="_msg225">
<source xml:space="preserve">Load Wallets</source>
- <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">378</context></context-group>
<note annotates="source" from="developer">Title of progress window which is displayed when wallets are being loaded.</note>
</trans-unit>
- <trans-unit id="_msg225">
+ <trans-unit id="_msg226">
<source xml:space="preserve">Loading wallets…</source>
- <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
<note annotates="source" from="developer">Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</note>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="MigrateWalletActivity">
- <trans-unit id="_msg226">
+ <trans-unit id="_msg227">
<source xml:space="preserve">Migrate wallet</source>
- <context-group purpose="location"><context context-type="linenumber">442</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">444</context></context-group>
</trans-unit>
- <trans-unit id="_msg227">
+ <trans-unit id="_msg228">
<source xml:space="preserve">Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <context-group purpose="location"><context context-type="linenumber">443</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">445</context></context-group>
</trans-unit>
- <trans-unit id="_msg228">
+ <trans-unit id="_msg229">
<source xml:space="preserve">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 &quot;Restore Wallet&quot; functionality.</source>
- <context-group purpose="location"><context context-type="linenumber">444</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">446</context></context-group>
</trans-unit>
- <trans-unit id="_msg229">
+ <trans-unit id="_msg230">
<source xml:space="preserve">Migrate Wallet</source>
- <context-group purpose="location"><context context-type="linenumber">467</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">463</context></context-group>
</trans-unit>
- <trans-unit id="_msg230">
+ <trans-unit id="_msg231">
<source xml:space="preserve">Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <context-group purpose="location"><context context-type="linenumber">467</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">463</context></context-group>
</trans-unit>
- <trans-unit id="_msg231">
+ <trans-unit id="_msg232">
<source xml:space="preserve">The wallet &apos;%1&apos; was migrated successfully.</source>
- <context-group purpose="location"><context context-type="linenumber">473</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">469</context></context-group>
</trans-unit>
- <trans-unit id="_msg232">
+ <trans-unit id="_msg233">
<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>
+ <context-group purpose="location"><context context-type="linenumber">471</context></context-group>
</trans-unit>
- <trans-unit id="_msg233">
+ <trans-unit id="_msg234">
<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>
+ <context-group purpose="location"><context context-type="linenumber">474</context></context-group>
</trans-unit>
- <trans-unit id="_msg234">
+ <trans-unit id="_msg235">
<source xml:space="preserve">Migration failed</source>
- <context-group purpose="location"><context context-type="linenumber">492</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">488</context></context-group>
</trans-unit>
- <trans-unit id="_msg235">
+ <trans-unit id="_msg236">
<source xml:space="preserve">Migration Successful</source>
- <context-group purpose="location"><context context-type="linenumber">494</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">490</context></context-group>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="OpenWalletActivity">
- <trans-unit id="_msg236">
- <source xml:space="preserve">Open wallet failed</source>
- <context-group purpose="location"><context context-type="linenumber">333</context></context-group>
- </trans-unit>
<trans-unit id="_msg237">
- <source xml:space="preserve">Open wallet warning</source>
+ <source xml:space="preserve">Open wallet failed</source>
<context-group purpose="location"><context context-type="linenumber">335</context></context-group>
</trans-unit>
<trans-unit id="_msg238">
- <source xml:space="preserve">default wallet</source>
- <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
+ <source xml:space="preserve">Open wallet warning</source>
+ <context-group purpose="location"><context context-type="linenumber">337</context></context-group>
</trans-unit>
<trans-unit id="_msg239">
<source xml:space="preserve">Open Wallet</source>
- <context-group purpose="location"><context context-type="linenumber">349</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">351</context></context-group>
<note annotates="source" from="developer">Title of window indicating the progress of opening of a wallet.</note>
</trans-unit>
<trans-unit id="_msg240">
<source xml:space="preserve">Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <context-group purpose="location"><context context-type="linenumber">352</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">354</context></context-group>
<note annotates="source" from="developer">Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</note>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="RestoreWalletActivity">
<trans-unit id="_msg241">
<source xml:space="preserve">Restore Wallet</source>
- <context-group purpose="location"><context context-type="linenumber">402</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">404</context></context-group>
<note annotates="source" from="developer">Title of progress window which is displayed when wallets are being restored.</note>
</trans-unit>
<trans-unit id="_msg242">
<source xml:space="preserve">Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <context-group purpose="location"><context context-type="linenumber">405</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">407</context></context-group>
<note annotates="source" from="developer">Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</note>
</trans-unit>
<trans-unit id="_msg243">
<source xml:space="preserve">Restore wallet failed</source>
- <context-group purpose="location"><context context-type="linenumber">424</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">426</context></context-group>
<note annotates="source" from="developer">Title of message box which is displayed when the wallet could not be restored.</note>
</trans-unit>
<trans-unit id="_msg244">
<source xml:space="preserve">Restore wallet warning</source>
- <context-group purpose="location"><context context-type="linenumber">427</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">429</context></context-group>
<note annotates="source" from="developer">Title of message box which is displayed when the wallet is restored with some warning.</note>
</trans-unit>
<trans-unit id="_msg245">
<source xml:space="preserve">Restore wallet message</source>
- <context-group purpose="location"><context context-type="linenumber">430</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">432</context></context-group>
<note annotates="source" from="developer">Title of message box which is displayed when the wallet is successfully restored.</note>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="WalletController">
<trans-unit id="_msg246">
<source xml:space="preserve">Close wallet</source>
- <context-group purpose="location"><context context-type="linenumber">84</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">85</context></context-group>
</trans-unit>
<trans-unit id="_msg247">
<source xml:space="preserve">Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <context-group purpose="location"><context context-type="linenumber">85</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">86</context></context-group>
</trans-unit>
<trans-unit id="_msg248">
<source xml:space="preserve">Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <context-group purpose="location"><context context-type="linenumber">86</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">87</context></context-group>
</trans-unit>
<trans-unit id="_msg249">
<source xml:space="preserve">Close all wallets</source>
- <context-group purpose="location"><context context-type="linenumber">99</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
<trans-unit id="_msg250">
<source xml:space="preserve">Are you sure you wish to close all wallets?</source>
- <context-group purpose="location"><context context-type="linenumber">100</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">101</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1181,11 +1183,11 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="CreateWalletDialog">
<trans-unit id="_msg265">
<source xml:space="preserve">Create</source>
- <context-group purpose="location"><context context-type="linenumber">22</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">20</context></context-group>
</trans-unit>
<trans-unit id="_msg266">
<source xml:space="preserve">Compiled without external signing support (required for external signing)</source>
- <context-group purpose="location"><context context-type="linenumber">90</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">88</context></context-group>
<note annotates="source" from="developer">&quot;External signing&quot; means using devices such as hardware wallets.</note>
</trans-unit>
</group>
@@ -1254,32 +1256,32 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="FreespaceChecker">
<trans-unit id="_msg280">
<source xml:space="preserve">A new data directory will be created.</source>
- <context-group purpose="location"><context context-type="linenumber">75</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">73</context></context-group>
</trans-unit>
<trans-unit id="_msg281">
<source xml:space="preserve">name</source>
- <context-group purpose="location"><context context-type="linenumber">97</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
<trans-unit id="_msg282">
<source xml:space="preserve">Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <context-group purpose="location"><context context-type="linenumber">99</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
<trans-unit id="_msg283">
<source xml:space="preserve">Path already exists, and is not a directory.</source>
- <context-group purpose="location"><context context-type="linenumber">102</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
<trans-unit id="_msg284">
<source xml:space="preserve">Cannot create data directory here.</source>
- <context-group purpose="location"><context context-type="linenumber">109</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">107</context></context-group>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="Intro">
<trans-unit id="_msg285">
<source xml:space="preserve">Bitcoin</source>
- <context-group purpose="location"><context context-type="linenumber">139</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">137</context></context-group>
</trans-unit>
<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">301</context></context-group>
<trans-unit id="_msg286[0]">
<source xml:space="preserve">%n GB of space available</source>
</trans-unit>
@@ -1288,7 +1290,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">305</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
<trans-unit id="_msg287[0]">
<source xml:space="preserve">(of %n GB needed)</source>
</trans-unit>
@@ -1297,7 +1299,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">308</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">306</context></context-group>
<trans-unit id="_msg288[0]">
<source xml:space="preserve">(%n GB needed for full chain)</source>
</trans-unit>
@@ -1307,18 +1309,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">325</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">323</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">380</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">378</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">383</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">390</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 +1331,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">394</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">392</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">396</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">394</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">252</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">250</context></context-group>
</trans-unit>
<trans-unit id="_msg296">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">282</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">280</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1349,25 +1351,25 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="HelpMessageDialog">
<trans-unit id="_msg297">
<source xml:space="preserve">version</source>
- <context-group purpose="location"><context context-type="linenumber">38</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">36</context></context-group>
</trans-unit>
<trans-unit id="_msg298">
<source xml:space="preserve">About %1</source>
- <context-group purpose="location"><context context-type="linenumber">42</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">40</context></context-group>
</trans-unit>
<trans-unit id="_msg299">
<source xml:space="preserve">Command-line options</source>
- <context-group purpose="location"><context context-type="linenumber">60</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">58</context></context-group>
</trans-unit>
</group>
<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">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">144</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">147</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1441,7 +1443,7 @@ The migration process will create a backup of the wallet before migrating. This
<source xml:space="preserve">Unknown…</source>
<context-group purpose="location"><context context-type="linenumber">222</context></context-group>
<context-group purpose="location"><context context-type="linenumber">248</context></context-group>
- <context-group purpose="location"><context context-type="sourcefile">../modaloverlay.cpp</context><context context-type="linenumber">152</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../modaloverlay.cpp</context><context context-type="linenumber">160</context></context-group>
</trans-unit>
<trans-unit id="_msg318">
<source xml:space="preserve">calculating…</source>
@@ -1478,21 +1480,21 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="ModalOverlay">
<trans-unit id="_msg325">
<source xml:space="preserve">%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
- <context-group purpose="location"><context context-type="linenumber">31</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">34</context></context-group>
</trans-unit>
<trans-unit id="_msg326">
<source xml:space="preserve">Unknown. Syncing Headers (%1, %2%)…</source>
- <context-group purpose="location"><context context-type="linenumber">158</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">166</context></context-group>
</trans-unit>
<trans-unit id="_msg327">
<source xml:space="preserve">Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <context-group purpose="location"><context context-type="linenumber">163</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">171</context></context-group>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="QObject">
<trans-unit id="_msg328">
<source xml:space="preserve">unknown</source>
- <context-group purpose="location"><context context-type="linenumber">123</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">131</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1820,85 +1822,85 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="OptionsDialog">
<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">152</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">153</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="_msg404">
<source xml:space="preserve">default</source>
- <context-group purpose="location"><context context-type="linenumber">164</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">165</context></context-group>
</trans-unit>
<trans-unit id="_msg405">
<source xml:space="preserve">none</source>
- <context-group purpose="location"><context context-type="linenumber">238</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">239</context></context-group>
</trans-unit>
<trans-unit id="_msg406">
<source xml:space="preserve">Confirm options reset</source>
- <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">348</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="_msg407">
<source xml:space="preserve">Client restart required to activate changes.</source>
- <context-group purpose="location"><context context-type="linenumber">338</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">419</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">420</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="_msg408">
<source xml:space="preserve">Current settings will be backed up at &quot;%1&quot;.</source>
- <context-group purpose="location"><context context-type="linenumber">342</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">343</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="_msg409">
<source xml:space="preserve">Client will be shut down. Do you want to proceed?</source>
- <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">346</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="_msg410">
<source xml:space="preserve">Configuration options</source>
- <context-group purpose="location"><context context-type="linenumber">365</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">366</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="_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">368</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">369</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="_msg412">
<source xml:space="preserve">Continue</source>
- <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
</trans-unit>
<trans-unit id="_msg413">
<source xml:space="preserve">Cancel</source>
- <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">373</context></context-group>
</trans-unit>
<trans-unit id="_msg414">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">382</context></context-group>
</trans-unit>
<trans-unit id="_msg415">
<source xml:space="preserve">The configuration file could not be opened.</source>
- <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">382</context></context-group>
</trans-unit>
<trans-unit id="_msg416">
<source xml:space="preserve">This change would require a client restart.</source>
- <context-group purpose="location"><context context-type="linenumber">423</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">424</context></context-group>
</trans-unit>
<trans-unit id="_msg417">
<source xml:space="preserve">The supplied proxy address is invalid.</source>
- <context-group purpose="location"><context context-type="linenumber">451</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">452</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>
+ <context-group purpose="location"><context context-type="linenumber">61</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>
+ <context-group purpose="location"><context context-type="linenumber">62</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>
+ <context-group purpose="location"><context context-type="linenumber">63</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1906,7 +1908,7 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="OptionsModel">
<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">230</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">228</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -2027,112 +2029,112 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="PSBTOperationsDialog">
<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>
+ <context-group purpose="location"><context context-type="linenumber">64</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">89</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">99</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">101</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">104</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">116</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">126</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">129</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">138</context></context-group>
</trans-unit>
<trans-unit id="_msg457">
<source xml:space="preserve">Save Transaction Data</source>
- <context-group purpose="location"><context context-type="linenumber">157</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">161</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">163</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="_msg459">
<source xml:space="preserve">PSBT saved to disk.</source>
- <context-group purpose="location"><context context-type="linenumber">166</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">170</context></context-group>
</trans-unit>
<trans-unit id="_msg460">
<source xml:space="preserve">Sends %1 to %2</source>
- <context-group purpose="location"><context context-type="linenumber">183</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">187</context></context-group>
</trans-unit>
<trans-unit id="_msg461">
<source xml:space="preserve">own address</source>
- <context-group purpose="location"><context context-type="linenumber">187</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">191</context></context-group>
</trans-unit>
<trans-unit id="_msg462">
<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>
+ <context-group purpose="location"><context context-type="linenumber">199</context></context-group>
</trans-unit>
<trans-unit id="_msg463">
<source xml:space="preserve">Pays transaction fee: </source>
- <context-group purpose="location"><context context-type="linenumber">197</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">201</context></context-group>
</trans-unit>
<trans-unit id="_msg464">
<source xml:space="preserve">Total Amount</source>
- <context-group purpose="location"><context context-type="linenumber">209</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">213</context></context-group>
</trans-unit>
<trans-unit id="_msg465">
<source xml:space="preserve">or</source>
- <context-group purpose="location"><context context-type="linenumber">212</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">216</context></context-group>
</trans-unit>
<trans-unit id="_msg466">
<source xml:space="preserve">Transaction has %1 unsigned inputs.</source>
- <context-group purpose="location"><context context-type="linenumber">218</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">222</context></context-group>
</trans-unit>
<trans-unit id="_msg467">
<source xml:space="preserve">Transaction is missing some information about inputs.</source>
- <context-group purpose="location"><context context-type="linenumber">264</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">268</context></context-group>
</trans-unit>
<trans-unit id="_msg468">
<source xml:space="preserve">Transaction still needs signature(s).</source>
- <context-group purpose="location"><context context-type="linenumber">268</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">272</context></context-group>
</trans-unit>
<trans-unit id="_msg469">
<source xml:space="preserve">(But no wallet is loaded.)</source>
- <context-group purpose="location"><context context-type="linenumber">271</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">275</context></context-group>
</trans-unit>
<trans-unit id="_msg470">
<source xml:space="preserve">(But this wallet cannot sign transactions.)</source>
- <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">278</context></context-group>
</trans-unit>
<trans-unit id="_msg471">
<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>
+ <context-group purpose="location"><context context-type="linenumber">281</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>
+ <context-group purpose="location"><context context-type="linenumber">289</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">289</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">293</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -2140,37 +2142,37 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="PaymentServer">
<trans-unit id="_msg474">
<source xml:space="preserve">Payment request error</source>
- <context-group purpose="location"><context context-type="linenumber">149</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">194</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">210</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">216</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">223</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">194</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">211</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">234</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">224</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">233</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -2254,116 +2256,116 @@ If you are receiving this error you should request the merchant provide a BIP21
<group restype="x-trolltech-linguist-context" resname="QObject">
<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>
+ <context-group purpose="location"><context context-type="linenumber">138</context></context-group>
</trans-unit>
<trans-unit id="_msg495">
<source xml:space="preserve">Ctrl+W</source>
- <context-group purpose="location"><context context-type="linenumber">421</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">433</context></context-group>
</trans-unit>
<trans-unit id="_msg496">
<source xml:space="preserve">Unroutable</source>
- <context-group purpose="location"><context context-type="linenumber">678</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">690</context></context-group>
</trans-unit>
<trans-unit id="_msg497">
<source xml:space="preserve">IPv4</source>
- <context-group purpose="location"><context context-type="linenumber">680</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">692</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="_msg498">
<source xml:space="preserve">IPv6</source>
- <context-group purpose="location"><context context-type="linenumber">682</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">694</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="_msg499">
<source xml:space="preserve">Onion</source>
- <context-group purpose="location"><context context-type="linenumber">684</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">696</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="_msg500">
<source xml:space="preserve">I2P</source>
- <context-group purpose="location"><context context-type="linenumber">686</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">698</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="_msg501">
<source xml:space="preserve">CJDNS</source>
- <context-group purpose="location"><context context-type="linenumber">688</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">700</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="_msg502">
<source xml:space="preserve">Inbound</source>
- <context-group purpose="location"><context context-type="linenumber">702</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">714</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="_msg503">
<source xml:space="preserve">Outbound</source>
- <context-group purpose="location"><context context-type="linenumber">705</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">717</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="_msg504">
<source xml:space="preserve">Full Relay</source>
- <context-group purpose="location"><context context-type="linenumber">710</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">722</context></context-group>
<note annotates="source" from="developer">Peer connection type that relays all network information.</note>
</trans-unit>
<trans-unit id="_msg505">
<source xml:space="preserve">Block Relay</source>
- <context-group purpose="location"><context context-type="linenumber">713</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">725</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="_msg506">
<source xml:space="preserve">Manual</source>
- <context-group purpose="location"><context context-type="linenumber">715</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">727</context></context-group>
<note annotates="source" from="developer">Peer connection type established manually through one of several methods.</note>
</trans-unit>
<trans-unit id="_msg507">
<source xml:space="preserve">Feeler</source>
- <context-group purpose="location"><context context-type="linenumber">717</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">729</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="_msg508">
<source xml:space="preserve">Address Fetch</source>
- <context-group purpose="location"><context context-type="linenumber">719</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">731</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="_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>
+ <context-group purpose="location"><context context-type="linenumber">755</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>
+ <context-group purpose="location"><context context-type="linenumber">756</context></context-group>
</trans-unit>
<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>
+ <context-group purpose="location"><context context-type="linenumber">757</context></context-group>
</trans-unit>
<trans-unit id="_msg512">
<source xml:space="preserve">%1 s</source>
- <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>
+ <context-group purpose="location"><context context-type="linenumber">747</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">758</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">784</context></context-group>
</trans-unit>
<trans-unit id="_msg513">
<source xml:space="preserve">None</source>
- <context-group purpose="location"><context context-type="linenumber">760</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">772</context></context-group>
</trans-unit>
<trans-unit id="_msg514">
<source xml:space="preserve">N/A</source>
- <context-group purpose="location"><context context-type="linenumber">766</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">778</context></context-group>
</trans-unit>
<trans-unit id="_msg515">
<source xml:space="preserve">%1 ms</source>
- <context-group purpose="location"><context context-type="linenumber">767</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">779</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">785</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">797</context></context-group>
<trans-unit id="_msg516[0]">
<source xml:space="preserve">%n second(s)</source>
</trans-unit>
@@ -2372,7 +2374,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">789</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">801</context></context-group>
<trans-unit id="_msg517[0]">
<source xml:space="preserve">%n minute(s)</source>
</trans-unit>
@@ -2381,7 +2383,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">793</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">805</context></context-group>
<trans-unit id="_msg518[0]">
<source xml:space="preserve">%n hour(s)</source>
</trans-unit>
@@ -2390,7 +2392,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">797</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">809</context></context-group>
<trans-unit id="_msg519[0]">
<source xml:space="preserve">%n day(s)</source>
</trans-unit>
@@ -2399,8 +2401,8 @@ If you are receiving this error you should request the merchant provide a BIP21
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">801</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">807</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">813</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">819</context></context-group>
<trans-unit id="_msg520[0]">
<source xml:space="preserve">%n week(s)</source>
</trans-unit>
@@ -2410,10 +2412,10 @@ If you are receiving this error you should request the merchant provide a BIP21
</group>
<trans-unit id="_msg521">
<source xml:space="preserve">%1 and %2</source>
- <context-group purpose="location"><context context-type="linenumber">807</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">819</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">807</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">819</context></context-group>
<trans-unit id="_msg522[0]">
<source xml:space="preserve">%n year(s)</source>
</trans-unit>
@@ -2423,60 +2425,65 @@ If you are receiving this error you should request the merchant provide a BIP21
</group>
<trans-unit id="_msg523">
<source xml:space="preserve">%1 B</source>
- <context-group purpose="location"><context context-type="linenumber">815</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">827</context></context-group>
</trans-unit>
<trans-unit id="_msg524">
<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>
+ <context-group purpose="location"><context context-type="linenumber">829</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1021</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>
+ <context-group purpose="location"><context context-type="linenumber">831</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1022</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1023</context></context-group>
</trans-unit>
<trans-unit id="_msg526">
<source xml:space="preserve">%1 GB</source>
- <context-group purpose="location"><context context-type="linenumber">821</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">833</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg527">
+ <source xml:space="preserve">default wallet</source>
+ <context-group purpose="location"><context context-type="linenumber">1013</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="_msg527">
+ <trans-unit id="_msg528">
<source xml:space="preserve">&amp;Save Image…</source>
- <context-group purpose="location"><context context-type="linenumber">30</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">28</context></context-group>
</trans-unit>
- <trans-unit id="_msg528">
+ <trans-unit id="_msg529">
<source xml:space="preserve">&amp;Copy Image</source>
- <context-group purpose="location"><context context-type="linenumber">31</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">29</context></context-group>
</trans-unit>
- <trans-unit id="_msg529">
+ <trans-unit id="_msg530">
<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>
+ <context-group purpose="location"><context context-type="linenumber">40</context></context-group>
</trans-unit>
- <trans-unit id="_msg530">
+ <trans-unit id="_msg531">
<source xml:space="preserve">Error encoding URI into QR Code.</source>
- <context-group purpose="location"><context context-type="linenumber">49</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">47</context></context-group>
</trans-unit>
- <trans-unit id="_msg531">
+ <trans-unit id="_msg532">
<source xml:space="preserve">QR code support not available.</source>
- <context-group purpose="location"><context context-type="linenumber">90</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">88</context></context-group>
</trans-unit>
- <trans-unit id="_msg532">
+ <trans-unit id="_msg533">
<source xml:space="preserve">Save QR Code</source>
- <context-group purpose="location"><context context-type="linenumber">120</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">118</context></context-group>
</trans-unit>
- <trans-unit id="_msg533">
+ <trans-unit id="_msg534">
<source xml:space="preserve">PNG Image</source>
- <context-group purpose="location"><context context-type="linenumber">123</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">121</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>
</trans-unit>
</group>
</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="_msg534">
+ <trans-unit id="_msg535">
<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>
@@ -2485,500 +2492,520 @@ If you are receiving this error you should request the merchant provide a BIP21
<context-group purpose="location"><context context-type="linenumber">182</context></context-group>
<context-group purpose="location"><context context-type="linenumber">218</context></context-group>
<context-group purpose="location"><context context-type="linenumber">241</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">277</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">300</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">336</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">359</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1051</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1077</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1103</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1129</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1155</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1201</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1224</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1253</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1279</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1302</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1325</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1348</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1371</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1397</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1423</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1446</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1469</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1492</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1515</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1538</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1564</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1587</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1610</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1636</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1662</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">1688</context></context-group>
- <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>
+ <context-group purpose="location"><context context-type="linenumber">312</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">394</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1161</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1187</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1213</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1239</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1265</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1288</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1311</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1334</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1363</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1389</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1412</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1435</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1458</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1481</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1507</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1533</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1556</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1579</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1602</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1625</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1648</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1674</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1697</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1720</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1746</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1772</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1798</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1824</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.h</context><context context-type="linenumber">145</context></context-group>
</trans-unit>
- <trans-unit id="_msg535">
+ <trans-unit id="_msg536">
<source xml:space="preserve">Client version</source>
<context-group purpose="location"><context context-type="linenumber">65</context></context-group>
</trans-unit>
- <trans-unit id="_msg536">
+ <trans-unit id="_msg537">
<source xml:space="preserve">&amp;Information</source>
<context-group purpose="location"><context context-type="linenumber">43</context></context-group>
</trans-unit>
- <trans-unit id="_msg537">
+ <trans-unit id="_msg538">
<source xml:space="preserve">General</source>
<context-group purpose="location"><context context-type="linenumber">58</context></context-group>
</trans-unit>
- <trans-unit id="_msg538">
+ <trans-unit id="_msg539">
<source xml:space="preserve">Datadir</source>
<context-group purpose="location"><context context-type="linenumber">114</context></context-group>
</trans-unit>
- <trans-unit id="_msg539">
+ <trans-unit id="_msg540">
<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="_msg540">
+ <trans-unit id="_msg541">
<source xml:space="preserve">Blocksdir</source>
<context-group purpose="location"><context context-type="linenumber">143</context></context-group>
</trans-unit>
- <trans-unit id="_msg541">
+ <trans-unit id="_msg542">
<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="_msg542">
+ <trans-unit id="_msg543">
<source xml:space="preserve">Startup time</source>
<context-group purpose="location"><context context-type="linenumber">172</context></context-group>
</trans-unit>
- <trans-unit id="_msg543">
+ <trans-unit id="_msg544">
<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>
+ <context-group purpose="location"><context context-type="linenumber">1255</context></context-group>
</trans-unit>
- <trans-unit id="_msg544">
+ <trans-unit id="_msg545">
<source xml:space="preserve">Name</source>
<context-group purpose="location"><context context-type="linenumber">208</context></context-group>
</trans-unit>
- <trans-unit id="_msg545">
+ <trans-unit id="_msg546">
<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="_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="_msg547">
- <source xml:space="preserve">Memory Pool</source>
- <context-group purpose="location"><context context-type="linenumber">319</context></context-group>
+ <source xml:space="preserve">Local Addresses</source>
+ <context-group purpose="location"><context context-type="linenumber">254</context></context-group>
</trans-unit>
<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>
+ <source xml:space="preserve">Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <context-group purpose="location"><context context-type="linenumber">282</context></context-group>
</trans-unit>
<trans-unit id="_msg549">
- <source xml:space="preserve">Memory usage</source>
- <context-group purpose="location"><context context-type="linenumber">349</context></context-group>
+ <source xml:space="preserve">Block chain</source>
+ <context-group purpose="location"><context context-type="linenumber">295</context></context-group>
</trans-unit>
<trans-unit id="_msg550">
- <source xml:space="preserve">Wallet: </source>
- <context-group purpose="location"><context context-type="linenumber">443</context></context-group>
+ <source xml:space="preserve">Memory Pool</source>
+ <context-group purpose="location"><context context-type="linenumber">354</context></context-group>
</trans-unit>
<trans-unit id="_msg551">
- <source xml:space="preserve">(none)</source>
- <context-group purpose="location"><context context-type="linenumber">454</context></context-group>
+ <source xml:space="preserve">Current number of transactions</source>
+ <context-group purpose="location"><context context-type="linenumber">361</context></context-group>
</trans-unit>
<trans-unit id="_msg552">
- <source xml:space="preserve">&amp;Reset</source>
- <context-group purpose="location"><context context-type="linenumber">665</context></context-group>
+ <source xml:space="preserve">Memory usage</source>
+ <context-group purpose="location"><context context-type="linenumber">384</context></context-group>
</trans-unit>
<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>
+ <source xml:space="preserve">Wallet: </source>
+ <context-group purpose="location"><context context-type="linenumber">478</context></context-group>
</trans-unit>
<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>
+ <source xml:space="preserve">(none)</source>
+ <context-group purpose="location"><context context-type="linenumber">489</context></context-group>
</trans-unit>
<trans-unit id="_msg555">
- <source xml:space="preserve">&amp;Peers</source>
- <context-group purpose="location"><context context-type="linenumber">866</context></context-group>
+ <source xml:space="preserve">&amp;Reset</source>
+ <context-group purpose="location"><context context-type="linenumber">700</context></context-group>
</trans-unit>
<trans-unit id="_msg556">
- <source xml:space="preserve">Banned peers</source>
- <context-group purpose="location"><context context-type="linenumber">942</context></context-group>
+ <source xml:space="preserve">Received</source>
+ <context-group purpose="location"><context context-type="linenumber">780</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1615</context></context-group>
</trans-unit>
<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">1173</context></context-group>
+ <source xml:space="preserve">Sent</source>
+ <context-group purpose="location"><context context-type="linenumber">860</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1592</context></context-group>
</trans-unit>
<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>
+ <source xml:space="preserve">&amp;Peers</source>
+ <context-group purpose="location"><context context-type="linenumber">901</context></context-group>
</trans-unit>
<trans-unit id="_msg559">
- <source xml:space="preserve">Transport</source>
- <context-group purpose="location"><context context-type="linenumber">1093</context></context-group>
+ <source xml:space="preserve">Banned peers</source>
+ <context-group purpose="location"><context context-type="linenumber">977</context></context-group>
</trans-unit>
<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>
+ <source xml:space="preserve">Select a peer to view detailed information.</source>
+ <context-group purpose="location"><context context-type="linenumber">1053</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1189</context></context-group>
</trans-unit>
<trans-unit id="_msg561">
- <source xml:space="preserve">Session ID</source>
- <context-group purpose="location"><context context-type="linenumber">1119</context></context-group>
+ <source xml:space="preserve">Hide Peers Detail</source>
+ <context-group purpose="location"><context context-type="linenumber">1105</context></context-group>
</trans-unit>
<trans-unit id="_msg562">
- <source xml:space="preserve">Version</source>
- <context-group purpose="location"><context context-type="linenumber">1168</context></context-group>
+ <source xml:space="preserve">Ctrl+X</source>
+ <context-group purpose="location"><context context-type="linenumber">1126</context></context-group>
</trans-unit>
<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>
+ <source xml:space="preserve">The transport layer version: %1</source>
+ <context-group purpose="location"><context context-type="linenumber">1200</context></context-group>
</trans-unit>
<trans-unit id="_msg564">
- <source xml:space="preserve">Transaction Relay</source>
- <context-group purpose="location"><context context-type="linenumber">1243</context></context-group>
+ <source xml:space="preserve">Transport</source>
+ <context-group purpose="location"><context context-type="linenumber">1203</context></context-group>
</trans-unit>
<trans-unit id="_msg565">
- <source xml:space="preserve">Starting Block</source>
- <context-group purpose="location"><context context-type="linenumber">1292</context></context-group>
+ <source xml:space="preserve">Session ID</source>
+ <context-group purpose="location"><context context-type="linenumber">1229</context></context-group>
</trans-unit>
<trans-unit id="_msg566">
- <source xml:space="preserve">Synced Headers</source>
- <context-group purpose="location"><context context-type="linenumber">1315</context></context-group>
+ <source xml:space="preserve">Version</source>
+ <context-group purpose="location"><context context-type="linenumber">1278</context></context-group>
</trans-unit>
<trans-unit id="_msg567">
- <source xml:space="preserve">Synced Blocks</source>
- <context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
+ <source xml:space="preserve">Whether we relay transactions to this peer.</source>
+ <context-group purpose="location"><context context-type="linenumber">1350</context></context-group>
</trans-unit>
<trans-unit id="_msg568">
- <source xml:space="preserve">Last Transaction</source>
- <context-group purpose="location"><context context-type="linenumber">1413</context></context-group>
+ <source xml:space="preserve">Transaction Relay</source>
+ <context-group purpose="location"><context context-type="linenumber">1353</context></context-group>
</trans-unit>
<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>
+ <source xml:space="preserve">Starting Block</source>
+ <context-group purpose="location"><context context-type="linenumber">1402</context></context-group>
</trans-unit>
<trans-unit id="_msg570">
- <source xml:space="preserve">Mapped AS</source>
- <context-group purpose="location"><context context-type="linenumber">1626</context></context-group>
+ <source xml:space="preserve">Synced Headers</source>
+ <context-group purpose="location"><context context-type="linenumber">1425</context></context-group>
</trans-unit>
<trans-unit id="_msg571">
+ <source xml:space="preserve">Synced Blocks</source>
+ <context-group purpose="location"><context context-type="linenumber">1448</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg572">
+ <source xml:space="preserve">Last Transaction</source>
+ <context-group purpose="location"><context context-type="linenumber">1523</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg573">
+ <source xml:space="preserve">The mapped Autonomous System used for diversifying peer selection.</source>
+ <context-group purpose="location"><context context-type="linenumber">1733</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg574">
+ <source xml:space="preserve">Mapped AS</source>
+ <context-group purpose="location"><context context-type="linenumber">1736</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg575">
<source xml:space="preserve">Whether we relay addresses to this peer.</source>
- <context-group purpose="location"><context context-type="linenumber">1649</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1759</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="_msg572">
+ <trans-unit id="_msg576">
<source xml:space="preserve">Address Relay</source>
- <context-group purpose="location"><context context-type="linenumber">1652</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1762</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="_msg573">
+ <trans-unit id="_msg577">
<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>
+ <context-group purpose="location"><context context-type="linenumber">1785</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="_msg574">
+ <trans-unit id="_msg578">
<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>
+ <context-group purpose="location"><context context-type="linenumber">1811</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="_msg575">
+ <trans-unit id="_msg579">
<source xml:space="preserve">Addresses Processed</source>
- <context-group purpose="location"><context context-type="linenumber">1678</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1788</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="_msg576">
+ <trans-unit id="_msg580">
<source xml:space="preserve">Addresses Rate-Limited</source>
- <context-group purpose="location"><context context-type="linenumber">1704</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1814</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="_msg577">
+ <trans-unit id="_msg581">
<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>
+ <context-group purpose="location"><context context-type="linenumber">1301</context></context-group>
</trans-unit>
- <trans-unit id="_msg578">
+ <trans-unit id="_msg582">
<source xml:space="preserve">Node window</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg579">
+ <trans-unit id="_msg583">
<source xml:space="preserve">Current block height</source>
- <context-group purpose="location"><context context-type="linenumber">267</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">302</context></context-group>
</trans-unit>
- <trans-unit id="_msg580">
+ <trans-unit id="_msg584">
<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>
+ <context-group purpose="location"><context context-type="linenumber">432</context></context-group>
</trans-unit>
- <trans-unit id="_msg581">
+ <trans-unit id="_msg585">
<source xml:space="preserve">Decrease font size</source>
- <context-group purpose="location"><context context-type="linenumber">475</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">510</context></context-group>
</trans-unit>
- <trans-unit id="_msg582">
+ <trans-unit id="_msg586">
<source xml:space="preserve">Increase font size</source>
- <context-group purpose="location"><context context-type="linenumber">495</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">530</context></context-group>
</trans-unit>
- <trans-unit id="_msg583">
+ <trans-unit id="_msg587">
<source xml:space="preserve">Permissions</source>
- <context-group purpose="location"><context context-type="linenumber">1041</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1151</context></context-group>
</trans-unit>
- <trans-unit id="_msg584">
+ <trans-unit id="_msg588">
<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>
+ <context-group purpose="location"><context context-type="linenumber">1174</context></context-group>
</trans-unit>
- <trans-unit id="_msg585">
+ <trans-unit id="_msg589">
<source xml:space="preserve">Direction/Type</source>
- <context-group purpose="location"><context context-type="linenumber">1067</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1177</context></context-group>
</trans-unit>
- <trans-unit id="_msg586">
+ <trans-unit id="_msg590">
+ <source xml:space="preserve">The BIP324 session ID string in hex.</source>
+ <context-group purpose="location"><context context-type="linenumber">1226</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg591">
<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>
+ <context-group purpose="location"><context context-type="linenumber">1252</context></context-group>
</trans-unit>
- <trans-unit id="_msg587">
+ <trans-unit id="_msg592">
<source xml:space="preserve">Services</source>
- <context-group purpose="location"><context context-type="linenumber">1214</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1324</context></context-group>
</trans-unit>
- <trans-unit id="_msg588">
+ <trans-unit id="_msg593">
<source xml:space="preserve">High bandwidth BIP152 compact block relay: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1266</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1376</context></context-group>
</trans-unit>
- <trans-unit id="_msg589">
+ <trans-unit id="_msg594">
<source xml:space="preserve">High Bandwidth</source>
- <context-group purpose="location"><context context-type="linenumber">1269</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1379</context></context-group>
</trans-unit>
- <trans-unit id="_msg590">
+ <trans-unit id="_msg595">
<source xml:space="preserve">Connection Time</source>
- <context-group purpose="location"><context context-type="linenumber">1361</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1471</context></context-group>
</trans-unit>
- <trans-unit id="_msg591">
+ <trans-unit id="_msg596">
<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>
+ <context-group purpose="location"><context context-type="linenumber">1494</context></context-group>
</trans-unit>
- <trans-unit id="_msg592">
+ <trans-unit id="_msg597">
<source xml:space="preserve">Last Block</source>
- <context-group purpose="location"><context context-type="linenumber">1387</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1497</context></context-group>
</trans-unit>
- <trans-unit id="_msg593">
+ <trans-unit id="_msg598">
<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>
+ <context-group purpose="location"><context context-type="linenumber">1520</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="_msg594">
+ <trans-unit id="_msg599">
<source xml:space="preserve">Last Send</source>
- <context-group purpose="location"><context context-type="linenumber">1436</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1546</context></context-group>
</trans-unit>
- <trans-unit id="_msg595">
+ <trans-unit id="_msg600">
<source xml:space="preserve">Last Receive</source>
- <context-group purpose="location"><context context-type="linenumber">1459</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1569</context></context-group>
</trans-unit>
- <trans-unit id="_msg596">
+ <trans-unit id="_msg601">
<source xml:space="preserve">Ping Time</source>
- <context-group purpose="location"><context context-type="linenumber">1528</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1638</context></context-group>
</trans-unit>
- <trans-unit id="_msg597">
+ <trans-unit id="_msg602">
<source xml:space="preserve">The duration of a currently outstanding ping.</source>
- <context-group purpose="location"><context context-type="linenumber">1551</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1661</context></context-group>
</trans-unit>
- <trans-unit id="_msg598">
+ <trans-unit id="_msg603">
<source xml:space="preserve">Ping Wait</source>
- <context-group purpose="location"><context context-type="linenumber">1554</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1664</context></context-group>
</trans-unit>
- <trans-unit id="_msg599">
+ <trans-unit id="_msg604">
<source xml:space="preserve">Min Ping</source>
- <context-group purpose="location"><context context-type="linenumber">1577</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1687</context></context-group>
</trans-unit>
- <trans-unit id="_msg600">
+ <trans-unit id="_msg605">
<source xml:space="preserve">Time Offset</source>
- <context-group purpose="location"><context context-type="linenumber">1600</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1710</context></context-group>
</trans-unit>
- <trans-unit id="_msg601">
+ <trans-unit id="_msg606">
<source xml:space="preserve">Last block time</source>
- <context-group purpose="location"><context context-type="linenumber">290</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
</trans-unit>
- <trans-unit id="_msg602">
+ <trans-unit id="_msg607">
<source xml:space="preserve">&amp;Open</source>
- <context-group purpose="location"><context context-type="linenumber">400</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">435</context></context-group>
</trans-unit>
- <trans-unit id="_msg603">
+ <trans-unit id="_msg608">
<source xml:space="preserve">&amp;Console</source>
- <context-group purpose="location"><context context-type="linenumber">426</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">461</context></context-group>
</trans-unit>
- <trans-unit id="_msg604">
+ <trans-unit id="_msg609">
<source xml:space="preserve">&amp;Network Traffic</source>
- <context-group purpose="location"><context context-type="linenumber">613</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">648</context></context-group>
</trans-unit>
- <trans-unit id="_msg605">
+ <trans-unit id="_msg610">
<source xml:space="preserve">Totals</source>
- <context-group purpose="location"><context context-type="linenumber">681</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">716</context></context-group>
</trans-unit>
- <trans-unit id="_msg606">
+ <trans-unit id="_msg611">
<source xml:space="preserve">Debug log file</source>
- <context-group purpose="location"><context context-type="linenumber">390</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">425</context></context-group>
</trans-unit>
- <trans-unit id="_msg607">
+ <trans-unit id="_msg612">
<source xml:space="preserve">Clear console</source>
- <context-group purpose="location"><context context-type="linenumber">515</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">550</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../rpcconsole.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RPCConsole">
- <trans-unit id="_msg608">
+ <trans-unit id="_msg613">
<source xml:space="preserve">In:</source>
- <context-group purpose="location"><context context-type="linenumber">970</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">973</context></context-group>
</trans-unit>
- <trans-unit id="_msg609">
+ <trans-unit id="_msg614">
<source xml:space="preserve">Out:</source>
- <context-group purpose="location"><context context-type="linenumber">971</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">974</context></context-group>
</trans-unit>
- <trans-unit id="_msg610">
+ <trans-unit id="_msg615">
<source xml:space="preserve">Inbound: initiated by peer</source>
- <context-group purpose="location"><context context-type="linenumber">496</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">497</context></context-group>
<note annotates="source" from="developer">Explanatory text for an inbound peer connection.</note>
</trans-unit>
- <trans-unit id="_msg611">
+ <trans-unit id="_msg616">
<source xml:space="preserve">Outbound Full Relay: default</source>
- <context-group purpose="location"><context context-type="linenumber">500</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">501</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="_msg612">
+ <trans-unit id="_msg617">
<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>
+ <context-group purpose="location"><context context-type="linenumber">504</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="_msg613">
+ <trans-unit id="_msg618">
<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>
+ <context-group purpose="location"><context context-type="linenumber">509</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="_msg614">
+ <trans-unit id="_msg619">
<source xml:space="preserve">Outbound Feeler: short-lived, for testing addresses</source>
- <context-group purpose="location"><context context-type="linenumber">514</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">515</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="_msg615">
+ <trans-unit id="_msg620">
<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>
+ <context-group purpose="location"><context context-type="linenumber">518</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="_msg616">
+ <trans-unit id="_msg621">
<source xml:space="preserve">detecting: peer could be v1 or v2</source>
- <context-group purpose="location"><context context-type="linenumber">522</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">523</context></context-group>
<note annotates="source" from="developer">Explanatory text for &quot;detecting&quot; transport type.</note>
</trans-unit>
- <trans-unit id="_msg617">
+ <trans-unit id="_msg622">
<source xml:space="preserve">v1: unencrypted, plaintext transport protocol</source>
- <context-group purpose="location"><context context-type="linenumber">524</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">525</context></context-group>
<note annotates="source" from="developer">Explanatory text for v1 transport type.</note>
</trans-unit>
- <trans-unit id="_msg618">
+ <trans-unit id="_msg623">
<source xml:space="preserve">v2: BIP324 encrypted transport protocol</source>
- <context-group purpose="location"><context context-type="linenumber">526</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">527</context></context-group>
<note annotates="source" from="developer">Explanatory text for v2 transport type.</note>
</trans-unit>
- <trans-unit id="_msg619">
+ <trans-unit id="_msg624">
<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>
+ <context-group purpose="location"><context context-type="linenumber">531</context></context-group>
</trans-unit>
- <trans-unit id="_msg620">
+ <trans-unit id="_msg625">
<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>
+ <context-group purpose="location"><context context-type="linenumber">532</context></context-group>
</trans-unit>
- <trans-unit id="_msg621">
+ <trans-unit id="_msg626">
<source xml:space="preserve">no high bandwidth relay selected</source>
- <context-group purpose="location"><context context-type="linenumber">532</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">533</context></context-group>
</trans-unit>
- <trans-unit id="_msg622">
+ <trans-unit id="_msg627">
<source xml:space="preserve">Ctrl++</source>
- <context-group purpose="location"><context context-type="linenumber">545</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">546</context></context-group>
<note annotates="source" from="developer">Main shortcut to increase the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg623">
+ <trans-unit id="_msg628">
<source xml:space="preserve">Ctrl+=</source>
- <context-group purpose="location"><context context-type="linenumber">547</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">548</context></context-group>
<note annotates="source" from="developer">Secondary shortcut to increase the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg624">
+ <trans-unit id="_msg629">
<source xml:space="preserve">Ctrl+-</source>
- <context-group purpose="location"><context context-type="linenumber">551</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">552</context></context-group>
<note annotates="source" from="developer">Main shortcut to decrease the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg625">
+ <trans-unit id="_msg630">
<source xml:space="preserve">Ctrl+_</source>
- <context-group purpose="location"><context context-type="linenumber">553</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">554</context></context-group>
<note annotates="source" from="developer">Secondary shortcut to decrease the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg626">
+ <trans-unit id="_msg631">
<source xml:space="preserve">&amp;Copy address</source>
- <context-group purpose="location"><context context-type="linenumber">706</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">708</context></context-group>
<note annotates="source" from="developer">Context menu action to copy the address of a peer.</note>
</trans-unit>
- <trans-unit id="_msg627">
+ <trans-unit id="_msg632">
<source xml:space="preserve">&amp;Disconnect</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="_msg628">
+ <trans-unit id="_msg633">
<source xml:space="preserve">1 &amp;hour</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="_msg629">
+ <trans-unit id="_msg634">
<source xml:space="preserve">1 d&amp;ay</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="_msg630">
+ <trans-unit id="_msg635">
<source xml:space="preserve">1 &amp;week</source>
- <context-group purpose="location"><context context-type="linenumber">713</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">715</context></context-group>
</trans-unit>
- <trans-unit id="_msg631">
+ <trans-unit id="_msg636">
<source xml:space="preserve">1 &amp;year</source>
- <context-group purpose="location"><context context-type="linenumber">714</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">716</context></context-group>
</trans-unit>
- <trans-unit id="_msg632">
+ <trans-unit id="_msg637">
<source xml:space="preserve">&amp;Copy IP/Netmask</source>
- <context-group purpose="location"><context context-type="linenumber">740</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">742</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="_msg633">
+ <trans-unit id="_msg638">
<source xml:space="preserve">&amp;Unban</source>
- <context-group purpose="location"><context context-type="linenumber">744</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">746</context></context-group>
</trans-unit>
- <trans-unit id="_msg634">
+ <trans-unit id="_msg639">
<source xml:space="preserve">Network activity disabled</source>
- <context-group purpose="location"><context context-type="linenumber">974</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">977</context></context-group>
</trans-unit>
- <trans-unit id="_msg635">
+ <trans-unit id="_msg640">
+ <source xml:space="preserve">None</source>
+ <context-group purpose="location"><context context-type="linenumber">990</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg641">
<source xml:space="preserve">Executing command without any wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1053</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1069</context></context-group>
</trans-unit>
- <trans-unit id="_msg636">
+ <trans-unit id="_msg642">
<source xml:space="preserve">Ctrl+I</source>
- <context-group purpose="location"><context context-type="linenumber">1378</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
</trans-unit>
- <trans-unit id="_msg637">
+ <trans-unit id="_msg643">
<source xml:space="preserve">Ctrl+T</source>
- <context-group purpose="location"><context context-type="linenumber">1379</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1396</context></context-group>
</trans-unit>
- <trans-unit id="_msg638">
+ <trans-unit id="_msg644">
<source xml:space="preserve">Ctrl+N</source>
- <context-group purpose="location"><context context-type="linenumber">1380</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1397</context></context-group>
</trans-unit>
- <trans-unit id="_msg639">
+ <trans-unit id="_msg645">
<source xml:space="preserve">Ctrl+P</source>
- <context-group purpose="location"><context context-type="linenumber">1381</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1398</context></context-group>
</trans-unit>
- <trans-unit id="_msg640">
+ <trans-unit id="_msg646">
<source xml:space="preserve">Node window - [%1]</source>
- <context-group purpose="location"><context context-type="linenumber">1399</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1416</context></context-group>
</trans-unit>
- <trans-unit id="_msg641">
+ <trans-unit id="_msg647">
<source xml:space="preserve">Executing command using &quot;%1&quot; wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1051</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1067</context></context-group>
</trans-unit>
- <trans-unit id="_msg642">
+ <trans-unit id="_msg648">
<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.
@@ -2986,124 +3013,124 @@ 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">904</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">906</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="_msg643">
+ <trans-unit id="_msg649">
<source xml:space="preserve">Executing…</source>
- <context-group purpose="location"><context context-type="linenumber">1061</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1077</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="_msg644">
+ <trans-unit id="_msg650">
<source xml:space="preserve">(peer: %1)</source>
- <context-group purpose="location"><context context-type="linenumber">1179</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1195</context></context-group>
</trans-unit>
- <trans-unit id="_msg645">
+ <trans-unit id="_msg651">
<source xml:space="preserve">via %1</source>
- <context-group purpose="location"><context context-type="linenumber">1181</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1197</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="_msg646">
+ <trans-unit id="_msg652">
<source xml:space="preserve">Yes</source>
- <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">144</context></context-group>
</trans-unit>
- <trans-unit id="_msg647">
+ <trans-unit id="_msg653">
<source xml:space="preserve">No</source>
- <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">144</context></context-group>
</trans-unit>
- <trans-unit id="_msg648">
+ <trans-unit id="_msg654">
<source xml:space="preserve">To</source>
- <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">144</context></context-group>
</trans-unit>
- <trans-unit id="_msg649">
+ <trans-unit id="_msg655">
<source xml:space="preserve">From</source>
- <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">144</context></context-group>
</trans-unit>
- <trans-unit id="_msg650">
+ <trans-unit id="_msg656">
<source xml:space="preserve">Ban for</source>
- <context-group purpose="location"><context context-type="linenumber">147</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
</trans-unit>
- <trans-unit id="_msg651">
+ <trans-unit id="_msg657">
<source xml:space="preserve">Never</source>
- <context-group purpose="location"><context context-type="linenumber">189</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">187</context></context-group>
</trans-unit>
- <trans-unit id="_msg652">
+ <trans-unit id="_msg658">
<source xml:space="preserve">Unknown</source>
- <context-group purpose="location"><context context-type="linenumber">147</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
</trans-unit>
</group>
</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="_msg653">
+ <trans-unit id="_msg659">
<source xml:space="preserve">&amp;Amount:</source>
<context-group purpose="location"><context context-type="linenumber">37</context></context-group>
</trans-unit>
- <trans-unit id="_msg654">
+ <trans-unit id="_msg660">
<source xml:space="preserve">&amp;Label:</source>
<context-group purpose="location"><context context-type="linenumber">83</context></context-group>
</trans-unit>
- <trans-unit id="_msg655">
+ <trans-unit id="_msg661">
<source xml:space="preserve">&amp;Message:</source>
<context-group purpose="location"><context context-type="linenumber">53</context></context-group>
</trans-unit>
- <trans-unit id="_msg656">
+ <trans-unit id="_msg662">
<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="_msg657">
+ <trans-unit id="_msg663">
<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="_msg658">
+ <trans-unit id="_msg664">
<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="_msg659">
+ <trans-unit id="_msg665">
<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="_msg660">
+ <trans-unit id="_msg666">
<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="_msg661">
+ <trans-unit id="_msg667">
<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="_msg662">
+ <trans-unit id="_msg668">
<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="_msg663">
+ <trans-unit id="_msg669">
<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="_msg664">
+ <trans-unit id="_msg670">
<source xml:space="preserve">Clear</source>
<context-group purpose="location"><context context-type="linenumber">137</context></context-group>
</trans-unit>
- <trans-unit id="_msg665">
+ <trans-unit id="_msg671">
<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="_msg666">
+ <trans-unit id="_msg672">
<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="_msg667">
+ <trans-unit id="_msg673">
<source xml:space="preserve">Show</source>
<context-group purpose="location"><context context-type="linenumber">301</context></context-group>
</trans-unit>
- <trans-unit id="_msg668">
+ <trans-unit id="_msg674">
<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="_msg669">
+ <trans-unit id="_msg675">
<source xml:space="preserve">Remove</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
@@ -3111,63 +3138,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="_msg670">
+ <trans-unit id="_msg676">
<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="_msg671">
+ <trans-unit id="_msg677">
<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="_msg672">
+ <trans-unit id="_msg678">
<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="_msg673">
+ <trans-unit id="_msg679">
<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="_msg674">
+ <trans-unit id="_msg680">
<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="_msg675">
+ <trans-unit id="_msg681">
<source xml:space="preserve">Base58 (Legacy)</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg676">
+ <trans-unit id="_msg682">
<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="_msg677">
+ <trans-unit id="_msg683">
<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="_msg678">
+ <trans-unit id="_msg684">
<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="_msg679">
+ <trans-unit id="_msg685">
<source xml:space="preserve">Bech32 (SegWit)</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg680">
+ <trans-unit id="_msg686">
<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="_msg681">
+ <trans-unit id="_msg687">
<source xml:space="preserve">Bech32m (Taproot)</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg682">
+ <trans-unit id="_msg688">
<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="_msg683">
+ <trans-unit id="_msg689">
<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="_msg684">
+ <trans-unit id="_msg690">
<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>
@@ -3175,51 +3202,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="_msg685">
+ <trans-unit id="_msg691">
<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="_msg686">
+ <trans-unit id="_msg692">
<source xml:space="preserve">Address:</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg687">
+ <trans-unit id="_msg693">
<source xml:space="preserve">Amount:</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
</trans-unit>
- <trans-unit id="_msg688">
+ <trans-unit id="_msg694">
<source xml:space="preserve">Label:</source>
<context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
- <trans-unit id="_msg689">
+ <trans-unit id="_msg695">
<source xml:space="preserve">Message:</source>
<context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
- <trans-unit id="_msg690">
+ <trans-unit id="_msg696">
<source xml:space="preserve">Wallet:</source>
<context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
- <trans-unit id="_msg691">
+ <trans-unit id="_msg697">
<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="_msg692">
+ <trans-unit id="_msg698">
<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="_msg693">
+ <trans-unit id="_msg699">
<source xml:space="preserve">&amp;Verify</source>
<context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
- <trans-unit id="_msg694">
+ <trans-unit id="_msg700">
<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="_msg695">
+ <trans-unit id="_msg701">
<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="_msg696">
+ <trans-unit id="_msg702">
<source xml:space="preserve">Payment information</source>
<context-group purpose="location"><context context-type="linenumber">39</context></context-group>
</trans-unit>
@@ -3227,190 +3254,190 @@ 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="_msg697">
+ <trans-unit id="_msg703">
<source xml:space="preserve">Request payment to %1</source>
- <context-group purpose="location"><context context-type="linenumber">48</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">46</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../recentrequeststablemodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RecentRequestsTableModel">
- <trans-unit id="_msg698">
+ <trans-unit id="_msg704">
<source xml:space="preserve">Date</source>
- <context-group purpose="location"><context context-type="linenumber">32</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">34</context></context-group>
</trans-unit>
- <trans-unit id="_msg699">
+ <trans-unit id="_msg705">
<source xml:space="preserve">Label</source>
- <context-group purpose="location"><context context-type="linenumber">32</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">34</context></context-group>
</trans-unit>
- <trans-unit id="_msg700">
+ <trans-unit id="_msg706">
<source xml:space="preserve">Message</source>
- <context-group purpose="location"><context context-type="linenumber">32</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">34</context></context-group>
</trans-unit>
- <trans-unit id="_msg701">
+ <trans-unit id="_msg707">
<source xml:space="preserve">(no label)</source>
- <context-group purpose="location"><context context-type="linenumber">70</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">72</context></context-group>
</trans-unit>
- <trans-unit id="_msg702">
+ <trans-unit id="_msg708">
<source xml:space="preserve">(no message)</source>
- <context-group purpose="location"><context context-type="linenumber">79</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">81</context></context-group>
</trans-unit>
- <trans-unit id="_msg703">
+ <trans-unit id="_msg709">
<source xml:space="preserve">(no amount requested)</source>
- <context-group purpose="location"><context context-type="linenumber">87</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">89</context></context-group>
</trans-unit>
- <trans-unit id="_msg704">
+ <trans-unit id="_msg710">
<source xml:space="preserve">Requested</source>
- <context-group purpose="location"><context context-type="linenumber">130</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">132</context></context-group>
</trans-unit>
</group>
</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="_msg705">
+ <trans-unit id="_msg711">
<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>
+ <context-group purpose="location"><context context-type="sourcefile">../sendcoinsdialog.cpp</context><context context-type="linenumber">763</context></context-group>
</trans-unit>
- <trans-unit id="_msg706">
+ <trans-unit id="_msg712">
<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="_msg707">
+ <trans-unit id="_msg713">
<source xml:space="preserve">automatically selected</source>
<context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg708">
+ <trans-unit id="_msg714">
<source xml:space="preserve">Insufficient funds!</source>
<context-group purpose="location"><context context-type="linenumber">139</context></context-group>
</trans-unit>
- <trans-unit id="_msg709">
+ <trans-unit id="_msg715">
<source xml:space="preserve">Quantity:</source>
<context-group purpose="location"><context context-type="linenumber">231</context></context-group>
</trans-unit>
- <trans-unit id="_msg710">
+ <trans-unit id="_msg716">
<source xml:space="preserve">Bytes:</source>
<context-group purpose="location"><context context-type="linenumber">266</context></context-group>
</trans-unit>
- <trans-unit id="_msg711">
+ <trans-unit id="_msg717">
<source xml:space="preserve">Amount:</source>
<context-group purpose="location"><context context-type="linenumber">314</context></context-group>
</trans-unit>
- <trans-unit id="_msg712">
+ <trans-unit id="_msg718">
<source xml:space="preserve">Fee:</source>
<context-group purpose="location"><context context-type="linenumber">365</context></context-group>
</trans-unit>
- <trans-unit id="_msg713">
+ <trans-unit id="_msg719">
<source xml:space="preserve">After Fee:</source>
<context-group purpose="location"><context context-type="linenumber">419</context></context-group>
</trans-unit>
- <trans-unit id="_msg714">
+ <trans-unit id="_msg720">
<source xml:space="preserve">Change:</source>
<context-group purpose="location"><context context-type="linenumber">451</context></context-group>
</trans-unit>
- <trans-unit id="_msg715">
+ <trans-unit id="_msg721">
<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="_msg716">
+ <trans-unit id="_msg722">
<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="_msg717">
+ <trans-unit id="_msg723">
<source xml:space="preserve">Transaction Fee:</source>
<context-group purpose="location"><context context-type="linenumber">704</context></context-group>
</trans-unit>
- <trans-unit id="_msg718">
+ <trans-unit id="_msg724">
<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="_msg719">
+ <trans-unit id="_msg725">
<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="_msg720">
+ <trans-unit id="_msg726">
<source xml:space="preserve">per kilobyte</source>
<context-group purpose="location"><context context-type="linenumber">833</context></context-group>
</trans-unit>
- <trans-unit id="_msg721">
+ <trans-unit id="_msg727">
<source xml:space="preserve">Hide</source>
<context-group purpose="location"><context context-type="linenumber">780</context></context-group>
</trans-unit>
- <trans-unit id="_msg722">
+ <trans-unit id="_msg728">
<source xml:space="preserve">Recommended:</source>
<context-group purpose="location"><context context-type="linenumber">892</context></context-group>
</trans-unit>
- <trans-unit id="_msg723">
+ <trans-unit id="_msg729">
<source xml:space="preserve">Custom:</source>
<context-group purpose="location"><context context-type="linenumber">922</context></context-group>
</trans-unit>
- <trans-unit id="_msg724">
+ <trans-unit id="_msg730">
<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="_msg725">
+ <trans-unit id="_msg731">
<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="_msg726">
+ <trans-unit id="_msg732">
<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="_msg727">
+ <trans-unit id="_msg733">
<source xml:space="preserve">Inputs…</source>
<context-group purpose="location"><context context-type="linenumber">110</context></context-group>
</trans-unit>
- <trans-unit id="_msg728">
+ <trans-unit id="_msg734">
<source xml:space="preserve">Choose…</source>
<context-group purpose="location"><context context-type="linenumber">718</context></context-group>
</trans-unit>
- <trans-unit id="_msg729">
+ <trans-unit id="_msg735">
<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="_msg730">
+ <trans-unit id="_msg736">
<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="_msg731">
+ <trans-unit id="_msg737">
<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="_msg732">
+ <trans-unit id="_msg738">
<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="_msg733">
+ <trans-unit id="_msg739">
<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="_msg734">
+ <trans-unit id="_msg740">
<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="_msg735">
+ <trans-unit id="_msg741">
<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="_msg736">
+ <trans-unit id="_msg742">
<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="_msg737">
+ <trans-unit id="_msg743">
<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="_msg738">
+ <trans-unit id="_msg744">
<source xml:space="preserve">Balance:</source>
<context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
</trans-unit>
- <trans-unit id="_msg739">
+ <trans-unit id="_msg745">
<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="_msg740">
+ <trans-unit id="_msg746">
<source xml:space="preserve">S&amp;end</source>
<context-group purpose="location"><context context-type="linenumber">1097</context></context-group>
</trans-unit>
@@ -3418,300 +3445,300 @@ 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="_msg741">
+ <trans-unit id="_msg747">
<source xml:space="preserve">Copy quantity</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg742">
+ <trans-unit id="_msg748">
<source xml:space="preserve">Copy amount</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg743">
+ <trans-unit id="_msg749">
<source xml:space="preserve">Copy fee</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg744">
+ <trans-unit id="_msg750">
<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="_msg745">
+ <trans-unit id="_msg751">
<source xml:space="preserve">Copy bytes</source>
<context-group purpose="location"><context context-type="linenumber">99</context></context-group>
</trans-unit>
- <trans-unit id="_msg746">
+ <trans-unit id="_msg752">
<source xml:space="preserve">Copy change</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg747">
+ <trans-unit id="_msg753">
<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="_msg748">
+ <trans-unit id="_msg754">
<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="_msg749">
+ <trans-unit id="_msg755">
<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="_msg750">
+ <trans-unit id="_msg756">
<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="_msg751">
+ <trans-unit id="_msg757">
<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="_msg752">
+ <trans-unit id="_msg758">
<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="_msg753">
+ <trans-unit id="_msg759">
<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="_msg754">
+ <trans-unit id="_msg760">
<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="_msg755">
+ <trans-unit id="_msg761">
<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="_msg756">
+ <trans-unit id="_msg762">
<source xml:space="preserve">Sign failed</source>
- <context-group purpose="location"><context context-type="linenumber">450</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">451</context></context-group>
</trans-unit>
- <trans-unit id="_msg757">
+ <trans-unit id="_msg763">
<source xml:space="preserve">External signer not found</source>
- <context-group purpose="location"><context context-type="linenumber">455</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">456</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="_msg764">
<source xml:space="preserve">External signer failure</source>
- <context-group purpose="location"><context context-type="linenumber">461</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">462</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="_msg759">
+ <trans-unit id="_msg765">
<source xml:space="preserve">Save Transaction Data</source>
- <context-group purpose="location"><context context-type="linenumber">425</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">426</context></context-group>
</trans-unit>
- <trans-unit id="_msg760">
+ <trans-unit id="_msg766">
<source xml:space="preserve">Partially Signed Transaction (Binary)</source>
- <context-group purpose="location"><context context-type="linenumber">427</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">428</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="_msg761">
+ <trans-unit id="_msg767">
<source xml:space="preserve">PSBT saved</source>
- <context-group purpose="location"><context context-type="linenumber">435</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">436</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="_msg762">
+ <trans-unit id="_msg768">
<source xml:space="preserve">External balance:</source>
- <context-group purpose="location"><context context-type="linenumber">708</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">709</context></context-group>
</trans-unit>
- <trans-unit id="_msg763">
+ <trans-unit id="_msg769">
<source xml:space="preserve">or</source>
<context-group purpose="location"><context context-type="linenumber">384</context></context-group>
</trans-unit>
- <trans-unit id="_msg764">
+ <trans-unit id="_msg770">
<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="_msg765">
+ <trans-unit id="_msg771">
<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="_msg766">
+ <trans-unit id="_msg772">
<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">
+ <trans-unit id="_msg773">
<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="_msg768">
+ <trans-unit id="_msg774">
<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="_msg769">
+ <trans-unit id="_msg775">
<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="_msg770">
+ <trans-unit id="_msg776">
<source xml:space="preserve">Transaction fee</source>
<context-group purpose="location"><context context-type="linenumber">351</context></context-group>
</trans-unit>
- <trans-unit id="_msg771">
+ <trans-unit id="_msg777">
<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="_msg772">
+ <trans-unit id="_msg778">
<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="_msg773">
+ <trans-unit id="_msg779">
<source xml:space="preserve">Total Amount</source>
<context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg774">
+ <trans-unit id="_msg780">
<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="_msg775">
+ <trans-unit id="_msg781">
<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="_msg776">
+ <trans-unit id="_msg782">
<source xml:space="preserve">PSBT saved to disk</source>
- <context-group purpose="location"><context context-type="linenumber">435</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">436</context></context-group>
</trans-unit>
- <trans-unit id="_msg777">
+ <trans-unit id="_msg783">
<source xml:space="preserve">Confirm send coins</source>
- <context-group purpose="location"><context context-type="linenumber">484</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">485</context></context-group>
</trans-unit>
- <trans-unit id="_msg778">
+ <trans-unit id="_msg784">
<source xml:space="preserve">Watch-only balance:</source>
- <context-group purpose="location"><context context-type="linenumber">711</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">712</context></context-group>
</trans-unit>
- <trans-unit id="_msg779">
+ <trans-unit id="_msg785">
<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>
+ <context-group purpose="location"><context context-type="linenumber">736</context></context-group>
</trans-unit>
- <trans-unit id="_msg780">
+ <trans-unit id="_msg786">
<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>
+ <context-group purpose="location"><context context-type="linenumber">739</context></context-group>
</trans-unit>
- <trans-unit id="_msg781">
+ <trans-unit id="_msg787">
<source xml:space="preserve">The amount exceeds your balance.</source>
- <context-group purpose="location"><context context-type="linenumber">741</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">742</context></context-group>
</trans-unit>
- <trans-unit id="_msg782">
+ <trans-unit id="_msg788">
<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>
+ <context-group purpose="location"><context context-type="linenumber">745</context></context-group>
</trans-unit>
- <trans-unit id="_msg783">
+ <trans-unit id="_msg789">
<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>
+ <context-group purpose="location"><context context-type="linenumber">748</context></context-group>
</trans-unit>
- <trans-unit id="_msg784">
+ <trans-unit id="_msg790">
<source xml:space="preserve">Transaction creation failed!</source>
- <context-group purpose="location"><context context-type="linenumber">750</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">751</context></context-group>
</trans-unit>
- <trans-unit id="_msg785">
+ <trans-unit id="_msg791">
<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>
+ <context-group purpose="location"><context context-type="linenumber">755</context></context-group>
</trans-unit>
- <trans-unit id="_msg786">
+ <trans-unit id="_msg792">
<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>
+ <context-group purpose="location"><context context-type="linenumber">834</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">869</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="_msg787[0]">
+ <context-group purpose="location"><context context-type="linenumber">883</context></context-group>
+ <trans-unit id="_msg793[0]">
<source xml:space="preserve">Estimated to begin confirmation within %n block(s).</source>
</trans-unit>
- <trans-unit id="_msg787[1]">
+ <trans-unit id="_msg793[1]">
<source xml:space="preserve">Estimated to begin confirmation within %n block(s).</source>
</trans-unit>
</group>
- <trans-unit id="_msg788">
+ <trans-unit id="_msg794">
<source xml:space="preserve">Warning: Invalid Bitcoin address</source>
- <context-group purpose="location"><context context-type="linenumber">977</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">978</context></context-group>
</trans-unit>
- <trans-unit id="_msg789">
+ <trans-unit id="_msg795">
<source xml:space="preserve">Warning: Unknown change address</source>
- <context-group purpose="location"><context context-type="linenumber">982</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">983</context></context-group>
</trans-unit>
- <trans-unit id="_msg790">
+ <trans-unit id="_msg796">
<source xml:space="preserve">Confirm custom change address</source>
- <context-group purpose="location"><context context-type="linenumber">985</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">986</context></context-group>
</trans-unit>
- <trans-unit id="_msg791">
+ <trans-unit id="_msg797">
<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>
+ <context-group purpose="location"><context context-type="linenumber">986</context></context-group>
</trans-unit>
- <trans-unit id="_msg792">
+ <trans-unit id="_msg798">
<source xml:space="preserve">(no label)</source>
- <context-group purpose="location"><context context-type="linenumber">1006</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1007</context></context-group>
</trans-unit>
</group>
</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="_msg793">
+ <trans-unit id="_msg799">
<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="_msg794">
+ <trans-unit id="_msg800">
<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="_msg795">
+ <trans-unit id="_msg801">
<source xml:space="preserve">&amp;Label:</source>
<context-group purpose="location"><context context-type="linenumber">128</context></context-group>
</trans-unit>
- <trans-unit id="_msg796">
+ <trans-unit id="_msg802">
<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="_msg797">
+ <trans-unit id="_msg803">
<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="_msg798">
+ <trans-unit id="_msg804">
<source xml:space="preserve">Alt+A</source>
<context-group purpose="location"><context context-type="linenumber">76</context></context-group>
</trans-unit>
- <trans-unit id="_msg799">
+ <trans-unit id="_msg805">
<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="_msg800">
+ <trans-unit id="_msg806">
<source xml:space="preserve">Alt+P</source>
<context-group purpose="location"><context context-type="linenumber">99</context></context-group>
</trans-unit>
- <trans-unit id="_msg801">
+ <trans-unit id="_msg807">
<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="_msg802">
+ <trans-unit id="_msg808">
<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="_msg803">
+ <trans-unit id="_msg809">
<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="_msg804">
+ <trans-unit id="_msg810">
<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="_msg805">
+ <trans-unit id="_msg811">
<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="_msg806">
+ <trans-unit id="_msg812">
<source xml:space="preserve">Message:</source>
<context-group purpose="location"><context context-type="linenumber">192</context></context-group>
</trans-unit>
- <trans-unit id="_msg807">
+ <trans-unit id="_msg813">
<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="_msg808">
+ <trans-unit id="_msg814">
<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>
@@ -3719,11 +3746,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="_msg809">
+ <trans-unit id="_msg815">
<source xml:space="preserve">Send</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg810">
+ <trans-unit id="_msg816">
<source xml:space="preserve">Create Unsigned</source>
<context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
@@ -3731,105 +3758,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="_msg811">
+ <trans-unit id="_msg817">
<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="_msg812">
+ <trans-unit id="_msg818">
<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="_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>
+ <trans-unit id="_msg819">
+ <source xml:space="preserve">You can sign messages/agreements with your legacy (P2PKH) 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="_msg814">
+ <trans-unit id="_msg820">
<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="_msg815">
+ <trans-unit id="_msg821">
<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="_msg816">
+ <trans-unit id="_msg822">
<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="_msg817">
+ <trans-unit id="_msg823">
<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="_msg818">
+ <trans-unit id="_msg824">
<source xml:space="preserve">Alt+P</source>
<context-group purpose="location"><context context-type="linenumber">88</context></context-group>
</trans-unit>
- <trans-unit id="_msg819">
+ <trans-unit id="_msg825">
<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="_msg820">
+ <trans-unit id="_msg826">
<source xml:space="preserve">Signature</source>
<context-group purpose="location"><context context-type="linenumber">110</context></context-group>
</trans-unit>
- <trans-unit id="_msg821">
+ <trans-unit id="_msg827">
<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="_msg822">
+ <trans-unit id="_msg828">
<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="_msg823">
+ <trans-unit id="_msg829">
<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="_msg824">
+ <trans-unit id="_msg830">
<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="_msg825">
+ <trans-unit id="_msg831">
<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="_msg826">
+ <trans-unit id="_msg832">
<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="_msg827">
+ <trans-unit id="_msg833">
<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="_msg828">
+ <trans-unit id="_msg834">
<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="_msg829">
+ <trans-unit id="_msg835">
<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="_msg830">
+ <trans-unit id="_msg836">
<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="_msg831">
+ <trans-unit id="_msg837">
<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="_msg832">
+ <trans-unit id="_msg838">
<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="_msg833">
+ <trans-unit id="_msg839">
<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="_msg834">
+ <trans-unit id="_msg840">
<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>
@@ -3837,81 +3864,79 @@ 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="_msg835">
+ <trans-unit id="_msg841">
<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>
+ <context-group purpose="location"><context context-type="linenumber">120</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">219</context></context-group>
</trans-unit>
- <trans-unit id="_msg836">
+ <trans-unit id="_msg842">
<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>
+ <context-group purpose="location"><context context-type="linenumber">120</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">220</context></context-group>
</trans-unit>
- <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>
+ <trans-unit id="_msg843">
+ <source xml:space="preserve">The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <context-group purpose="location"><context context-type="linenumber">127</context></context-group>
<context-group purpose="location"><context context-type="linenumber">225</context></context-group>
</trans-unit>
- <trans-unit id="_msg838">
+ <trans-unit id="_msg844">
<source xml:space="preserve">Wallet unlock was cancelled.</source>
- <context-group purpose="location"><context context-type="linenumber">134</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">135</context></context-group>
</trans-unit>
- <trans-unit id="_msg839">
+ <trans-unit id="_msg845">
<source xml:space="preserve">No error</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="_msg840">
+ <trans-unit id="_msg846">
<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>
+ <context-group purpose="location"><context context-type="linenumber">149</context></context-group>
</trans-unit>
- <trans-unit id="_msg841">
+ <trans-unit id="_msg847">
<source xml:space="preserve">Message signing failed.</source>
- <context-group purpose="location"><context context-type="linenumber">151</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">152</context></context-group>
</trans-unit>
- <trans-unit id="_msg842">
+ <trans-unit id="_msg848">
<source xml:space="preserve">Message signed.</source>
- <context-group purpose="location"><context context-type="linenumber">163</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">164</context></context-group>
</trans-unit>
- <trans-unit id="_msg843">
+ <trans-unit id="_msg849">
<source xml:space="preserve">The signature could not be decoded.</source>
- <context-group purpose="location"><context context-type="linenumber">232</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">230</context></context-group>
</trans-unit>
- <trans-unit id="_msg844">
+ <trans-unit id="_msg850">
<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>
+ <context-group purpose="location"><context context-type="linenumber">231</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg845">
+ <trans-unit id="_msg851">
<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>
+ <context-group purpose="location"><context context-type="linenumber">237</context></context-group>
</trans-unit>
- <trans-unit id="_msg846">
+ <trans-unit id="_msg852">
<source xml:space="preserve">Message verification failed.</source>
- <context-group purpose="location"><context context-type="linenumber">245</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">243</context></context-group>
</trans-unit>
- <trans-unit id="_msg847">
+ <trans-unit id="_msg853">
<source xml:space="preserve">Message verified.</source>
- <context-group purpose="location"><context context-type="linenumber">213</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">214</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../splashscreen.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SplashScreen">
- <trans-unit id="_msg848">
+ <trans-unit id="_msg854">
<source xml:space="preserve">(press q to shutdown and continue later)</source>
- <context-group purpose="location"><context context-type="linenumber">177</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">175</context></context-group>
</trans-unit>
- <trans-unit id="_msg849">
+ <trans-unit id="_msg855">
<source xml:space="preserve">press q to shutdown</source>
- <context-group purpose="location"><context context-type="linenumber">178</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">176</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../trafficgraphwidget.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TrafficGraphWidget">
- <trans-unit id="_msg850">
+ <trans-unit id="_msg856">
<source xml:space="preserve">kB/s</source>
<context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
@@ -3919,194 +3944,194 @@ 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="_msg851">
+ <trans-unit id="_msg857">
<source xml:space="preserve">conflicted with a transaction with %1 confirmations</source>
- <context-group purpose="location"><context context-type="linenumber">44</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">40</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="_msg852">
+ <trans-unit id="_msg858">
<source xml:space="preserve">0/unconfirmed, in memory pool</source>
- <context-group purpose="location"><context context-type="linenumber">51</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">47</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="_msg853">
+ <trans-unit id="_msg859">
<source xml:space="preserve">0/unconfirmed, not in memory pool</source>
- <context-group purpose="location"><context context-type="linenumber">56</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">52</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="_msg854">
+ <trans-unit id="_msg860">
<source xml:space="preserve">abandoned</source>
- <context-group purpose="location"><context context-type="linenumber">62</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">58</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="_msg855">
+ <trans-unit id="_msg861">
<source xml:space="preserve">%1/unconfirmed</source>
- <context-group purpose="location"><context context-type="linenumber">70</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">66</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="_msg856">
+ <trans-unit id="_msg862">
<source xml:space="preserve">%1 confirmations</source>
- <context-group purpose="location"><context context-type="linenumber">75</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">71</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="_msg857">
+ <trans-unit id="_msg863">
<source xml:space="preserve">Status</source>
- <context-group purpose="location"><context context-type="linenumber">125</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">121</context></context-group>
</trans-unit>
- <trans-unit id="_msg858">
+ <trans-unit id="_msg864">
<source xml:space="preserve">Date</source>
- <context-group purpose="location"><context context-type="linenumber">128</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">124</context></context-group>
</trans-unit>
- <trans-unit id="_msg859">
+ <trans-unit id="_msg865">
<source xml:space="preserve">Source</source>
- <context-group purpose="location"><context context-type="linenumber">135</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">131</context></context-group>
</trans-unit>
- <trans-unit id="_msg860">
+ <trans-unit id="_msg866">
<source xml:space="preserve">Generated</source>
- <context-group purpose="location"><context context-type="linenumber">135</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">131</context></context-group>
</trans-unit>
- <trans-unit id="_msg861">
+ <trans-unit id="_msg867">
<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>
+ <context-group purpose="location"><context context-type="linenumber">136</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">150</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">222</context></context-group>
</trans-unit>
- <trans-unit id="_msg862">
+ <trans-unit id="_msg868">
<source xml:space="preserve">unknown</source>
- <context-group purpose="location"><context context-type="linenumber">154</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">150</context></context-group>
</trans-unit>
- <trans-unit id="_msg863">
+ <trans-unit id="_msg869">
<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>
+ <context-group purpose="location"><context context-type="linenumber">151</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">171</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">241</context></context-group>
</trans-unit>
- <trans-unit id="_msg864">
+ <trans-unit id="_msg870">
<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>
+ <context-group purpose="location"><context context-type="linenumber">153</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">248</context></context-group>
</trans-unit>
- <trans-unit id="_msg865">
+ <trans-unit id="_msg871">
<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>
+ <context-group purpose="location"><context context-type="linenumber">153</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">222</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">250</context></context-group>
</trans-unit>
- <trans-unit id="_msg866">
+ <trans-unit id="_msg872">
<source xml:space="preserve">label</source>
- <context-group purpose="location"><context context-type="linenumber">159</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">155</context></context-group>
</trans-unit>
- <trans-unit id="_msg867">
+ <trans-unit id="_msg873">
<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>
- <context-group purpose="location"><context context-type="linenumber">261</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">291</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">351</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">191</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">203</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">257</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">287</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">197</context></context-group>
- <trans-unit id="_msg868[0]">
+ <context-group purpose="location"><context context-type="linenumber">193</context></context-group>
+ <trans-unit id="_msg874[0]">
<source xml:space="preserve">matures in %n more block(s)</source>
</trans-unit>
- <trans-unit id="_msg868[1]">
+ <trans-unit id="_msg874[1]">
<source xml:space="preserve">matures in %n more block(s)</source>
</trans-unit>
</group>
- <trans-unit id="_msg869">
+ <trans-unit id="_msg875">
<source xml:space="preserve">not accepted</source>
- <context-group purpose="location"><context context-type="linenumber">199</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">195</context></context-group>
</trans-unit>
- <trans-unit id="_msg870">
+ <trans-unit id="_msg876">
<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>
+ <context-group purpose="location"><context context-type="linenumber">255</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">281</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">344</context></context-group>
</trans-unit>
- <trans-unit id="_msg871">
+ <trans-unit id="_msg877">
<source xml:space="preserve">Total debit</source>
- <context-group purpose="location"><context context-type="linenumber">269</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">265</context></context-group>
</trans-unit>
- <trans-unit id="_msg872">
+ <trans-unit id="_msg878">
<source xml:space="preserve">Total credit</source>
- <context-group purpose="location"><context context-type="linenumber">270</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">266</context></context-group>
</trans-unit>
- <trans-unit id="_msg873">
+ <trans-unit id="_msg879">
<source xml:space="preserve">Transaction fee</source>
- <context-group purpose="location"><context context-type="linenumber">275</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">271</context></context-group>
</trans-unit>
- <trans-unit id="_msg874">
+ <trans-unit id="_msg880">
<source xml:space="preserve">Net amount</source>
- <context-group purpose="location"><context context-type="linenumber">297</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">293</context></context-group>
</trans-unit>
- <trans-unit id="_msg875">
+ <trans-unit id="_msg881">
<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>
+ <context-group purpose="location"><context context-type="linenumber">299</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">311</context></context-group>
</trans-unit>
- <trans-unit id="_msg876">
+ <trans-unit id="_msg882">
<source xml:space="preserve">Comment</source>
- <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
</trans-unit>
- <trans-unit id="_msg877">
+ <trans-unit id="_msg883">
<source xml:space="preserve">Transaction ID</source>
- <context-group purpose="location"><context context-type="linenumber">307</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
</trans-unit>
- <trans-unit id="_msg878">
+ <trans-unit id="_msg884">
<source xml:space="preserve">Transaction total size</source>
- <context-group purpose="location"><context context-type="linenumber">308</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">304</context></context-group>
</trans-unit>
- <trans-unit id="_msg879">
+ <trans-unit id="_msg885">
<source xml:space="preserve">Transaction virtual size</source>
- <context-group purpose="location"><context context-type="linenumber">309</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
</trans-unit>
- <trans-unit id="_msg880">
+ <trans-unit id="_msg886">
<source xml:space="preserve">Output index</source>
- <context-group purpose="location"><context context-type="linenumber">310</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">306</context></context-group>
</trans-unit>
- <trans-unit id="_msg881">
+ <trans-unit id="_msg887">
<source xml:space="preserve">%1 (Certificate was not verified)</source>
- <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">322</context></context-group>
</trans-unit>
- <trans-unit id="_msg882">
+ <trans-unit id="_msg888">
<source xml:space="preserve">Merchant</source>
- <context-group purpose="location"><context context-type="linenumber">329</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
</trans-unit>
- <trans-unit id="_msg883">
+ <trans-unit id="_msg889">
<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>
+ <context-group purpose="location"><context context-type="linenumber">333</context></context-group>
</trans-unit>
- <trans-unit id="_msg884">
+ <trans-unit id="_msg890">
<source xml:space="preserve">Debug information</source>
- <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">341</context></context-group>
</trans-unit>
- <trans-unit id="_msg885">
+ <trans-unit id="_msg891">
<source xml:space="preserve">Transaction</source>
- <context-group purpose="location"><context context-type="linenumber">353</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">349</context></context-group>
</trans-unit>
- <trans-unit id="_msg886">
+ <trans-unit id="_msg892">
<source xml:space="preserve">Inputs</source>
- <context-group purpose="location"><context context-type="linenumber">356</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">352</context></context-group>
</trans-unit>
- <trans-unit id="_msg887">
+ <trans-unit id="_msg893">
<source xml:space="preserve">Amount</source>
- <context-group purpose="location"><context context-type="linenumber">375</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
</trans-unit>
- <trans-unit id="_msg888">
+ <trans-unit id="_msg894">
<source xml:space="preserve">true</source>
- <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">373</context></context-group>
</trans-unit>
- <trans-unit id="_msg889">
+ <trans-unit id="_msg895">
<source xml:space="preserve">false</source>
- <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">373</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="_msg890">
+ <trans-unit id="_msg896">
<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>
@@ -4114,7 +4139,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="_msg891">
+ <trans-unit id="_msg897">
<source xml:space="preserve">Details for %1</source>
<context-group purpose="location"><context context-type="linenumber">18</context></context-group>
</trans-unit>
@@ -4122,95 +4147,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="_msg892">
+ <trans-unit id="_msg898">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg893">
+ <trans-unit id="_msg899">
<source xml:space="preserve">Type</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg894">
+ <trans-unit id="_msg900">
<source xml:space="preserve">Label</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg895">
+ <trans-unit id="_msg901">
<source xml:space="preserve">Unconfirmed</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg896">
+ <trans-unit id="_msg902">
<source xml:space="preserve">Abandoned</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg897">
+ <trans-unit id="_msg903">
<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="_msg898">
+ <trans-unit id="_msg904">
<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="_msg899">
+ <trans-unit id="_msg905">
<source xml:space="preserve">Conflicted</source>
<context-group purpose="location"><context context-type="linenumber">330</context></context-group>
</trans-unit>
- <trans-unit id="_msg900">
+ <trans-unit id="_msg906">
<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="_msg901">
+ <trans-unit id="_msg907">
<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="_msg902">
+ <trans-unit id="_msg908">
<source xml:space="preserve">Received with</source>
<context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg903">
+ <trans-unit id="_msg909">
<source xml:space="preserve">Received from</source>
<context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
- <trans-unit id="_msg904">
+ <trans-unit id="_msg910">
<source xml:space="preserve">Sent to</source>
<context-group purpose="location"><context context-type="linenumber">380</context></context-group>
</trans-unit>
- <trans-unit id="_msg905">
+ <trans-unit id="_msg911">
<source xml:space="preserve">Mined</source>
<context-group purpose="location"><context context-type="linenumber">382</context></context-group>
</trans-unit>
- <trans-unit id="_msg906">
+ <trans-unit id="_msg912">
<source xml:space="preserve">watch-only</source>
<context-group purpose="location"><context context-type="linenumber">410</context></context-group>
</trans-unit>
- <trans-unit id="_msg907">
+ <trans-unit id="_msg913">
<source xml:space="preserve">(n/a)</source>
<context-group purpose="location"><context context-type="linenumber">424</context></context-group>
</trans-unit>
- <trans-unit id="_msg908">
+ <trans-unit id="_msg914">
<source xml:space="preserve">(no label)</source>
<context-group purpose="location"><context context-type="linenumber">629</context></context-group>
</trans-unit>
- <trans-unit id="_msg909">
+ <trans-unit id="_msg915">
<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="_msg910">
+ <trans-unit id="_msg916">
<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="_msg911">
+ <trans-unit id="_msg917">
<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="_msg912">
+ <trans-unit id="_msg918">
<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="_msg913">
+ <trans-unit id="_msg919">
<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="_msg914">
+ <trans-unit id="_msg920">
<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>
@@ -4218,162 +4243,162 @@ 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="_msg915">
+ <trans-unit id="_msg921">
<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="_msg916">
+ <trans-unit id="_msg922">
<source xml:space="preserve">Today</source>
<context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
- <trans-unit id="_msg917">
+ <trans-unit id="_msg923">
<source xml:space="preserve">This week</source>
<context-group purpose="location"><context context-type="linenumber">75</context></context-group>
</trans-unit>
- <trans-unit id="_msg918">
+ <trans-unit id="_msg924">
<source xml:space="preserve">This month</source>
<context-group purpose="location"><context context-type="linenumber">76</context></context-group>
</trans-unit>
- <trans-unit id="_msg919">
+ <trans-unit id="_msg925">
<source xml:space="preserve">Last month</source>
<context-group purpose="location"><context context-type="linenumber">77</context></context-group>
</trans-unit>
- <trans-unit id="_msg920">
+ <trans-unit id="_msg926">
<source xml:space="preserve">This year</source>
<context-group purpose="location"><context context-type="linenumber">78</context></context-group>
</trans-unit>
- <trans-unit id="_msg921">
+ <trans-unit id="_msg927">
<source xml:space="preserve">Received with</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg922">
+ <trans-unit id="_msg928">
<source xml:space="preserve">Sent to</source>
<context-group purpose="location"><context context-type="linenumber">92</context></context-group>
</trans-unit>
- <trans-unit id="_msg923">
+ <trans-unit id="_msg929">
<source xml:space="preserve">Mined</source>
<context-group purpose="location"><context context-type="linenumber">94</context></context-group>
</trans-unit>
- <trans-unit id="_msg924">
+ <trans-unit id="_msg930">
<source xml:space="preserve">Other</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg925">
+ <trans-unit id="_msg931">
<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="_msg926">
+ <trans-unit id="_msg932">
<source xml:space="preserve">Min amount</source>
<context-group purpose="location"><context context-type="linenumber">104</context></context-group>
</trans-unit>
- <trans-unit id="_msg927">
+ <trans-unit id="_msg933">
<source xml:space="preserve">Range…</source>
<context-group purpose="location"><context context-type="linenumber">79</context></context-group>
</trans-unit>
- <trans-unit id="_msg928">
+ <trans-unit id="_msg934">
<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="_msg929">
+ <trans-unit id="_msg935">
<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="_msg930">
+ <trans-unit id="_msg936">
<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="_msg931">
+ <trans-unit id="_msg937">
<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="_msg932">
+ <trans-unit id="_msg938">
<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="_msg933">
+ <trans-unit id="_msg939">
<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="_msg934">
+ <trans-unit id="_msg940">
<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="_msg935">
+ <trans-unit id="_msg941">
<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="_msg936">
+ <trans-unit id="_msg942">
<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="_msg937">
+ <trans-unit id="_msg943">
<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="_msg938">
+ <trans-unit id="_msg944">
<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="_msg939">
+ <trans-unit id="_msg945">
<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="_msg940">
+ <trans-unit id="_msg946">
<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="_msg941">
+ <trans-unit id="_msg947">
<source xml:space="preserve">Confirmed</source>
<context-group purpose="location"><context context-type="linenumber">370</context></context-group>
</trans-unit>
- <trans-unit id="_msg942">
+ <trans-unit id="_msg948">
<source xml:space="preserve">Watch-only</source>
<context-group purpose="location"><context context-type="linenumber">372</context></context-group>
</trans-unit>
- <trans-unit id="_msg943">
+ <trans-unit id="_msg949">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">373</context></context-group>
</trans-unit>
- <trans-unit id="_msg944">
+ <trans-unit id="_msg950">
<source xml:space="preserve">Type</source>
<context-group purpose="location"><context context-type="linenumber">374</context></context-group>
</trans-unit>
- <trans-unit id="_msg945">
+ <trans-unit id="_msg951">
<source xml:space="preserve">Label</source>
<context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg946">
+ <trans-unit id="_msg952">
<source xml:space="preserve">Address</source>
<context-group purpose="location"><context context-type="linenumber">376</context></context-group>
</trans-unit>
- <trans-unit id="_msg947">
+ <trans-unit id="_msg953">
<source xml:space="preserve">ID</source>
<context-group purpose="location"><context context-type="linenumber">378</context></context-group>
</trans-unit>
- <trans-unit id="_msg948">
+ <trans-unit id="_msg954">
<source xml:space="preserve">Exporting Failed</source>
<context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg949">
+ <trans-unit id="_msg955">
<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="_msg950">
+ <trans-unit id="_msg956">
<source xml:space="preserve">Exporting Successful</source>
<context-group purpose="location"><context context-type="linenumber">385</context></context-group>
</trans-unit>
- <trans-unit id="_msg951">
+ <trans-unit id="_msg957">
<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="_msg952">
+ <trans-unit id="_msg958">
<source xml:space="preserve">Range:</source>
<context-group purpose="location"><context context-type="linenumber">558</context></context-group>
</trans-unit>
- <trans-unit id="_msg953">
+ <trans-unit id="_msg959">
<source xml:space="preserve">to</source>
<context-group purpose="location"><context context-type="linenumber">566</context></context-group>
</trans-unit>
@@ -4381,39 +4406,39 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../walletframe.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="WalletFrame">
- <trans-unit id="_msg954">
+ <trans-unit id="_msg960">
<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="_msg955">
+ <trans-unit id="_msg961">
<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="_msg956">
+ <trans-unit id="_msg962">
<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="_msg957">
+ <trans-unit id="_msg963">
<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="_msg958">
+ <trans-unit id="_msg964">
<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="_msg959">
+ <trans-unit id="_msg965">
<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="_msg960">
+ <trans-unit id="_msg966">
<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="_msg961">
+ <trans-unit id="_msg967">
<source xml:space="preserve">Unable to decode PSBT</source>
<context-group purpose="location"><context context-type="linenumber">229</context></context-group>
</trans-unit>
@@ -4421,114 +4446,113 @@ 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="_msg962">
+ <trans-unit id="_msg968">
<source xml:space="preserve">Send Coins</source>
- <context-group purpose="location"><context context-type="linenumber">227</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">240</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">224</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">237</context></context-group>
</trans-unit>
- <trans-unit id="_msg963">
+ <trans-unit id="_msg969">
<source xml:space="preserve">Fee bump error</source>
- <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>
+ <context-group purpose="location"><context context-type="linenumber">491</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">540</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">560</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">565</context></context-group>
</trans-unit>
- <trans-unit id="_msg964">
+ <trans-unit id="_msg970">
<source xml:space="preserve">Increasing transaction fee failed</source>
- <context-group purpose="location"><context context-type="linenumber">494</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">491</context></context-group>
</trans-unit>
- <trans-unit id="_msg965">
+ <trans-unit id="_msg971">
<source xml:space="preserve">Do you want to increase the fee?</source>
- <context-group purpose="location"><context context-type="linenumber">501</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">498</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="_msg966">
+ <trans-unit id="_msg972">
<source xml:space="preserve">Current fee:</source>
- <context-group purpose="location"><context context-type="linenumber">505</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">502</context></context-group>
</trans-unit>
- <trans-unit id="_msg967">
+ <trans-unit id="_msg973">
<source xml:space="preserve">Increase:</source>
- <context-group purpose="location"><context context-type="linenumber">509</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">506</context></context-group>
</trans-unit>
- <trans-unit id="_msg968">
+ <trans-unit id="_msg974">
<source xml:space="preserve">New fee:</source>
- <context-group purpose="location"><context context-type="linenumber">513</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">510</context></context-group>
</trans-unit>
- <trans-unit id="_msg969">
+ <trans-unit id="_msg975">
<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">521</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">518</context></context-group>
</trans-unit>
- <trans-unit id="_msg970">
+ <trans-unit id="_msg976">
<source xml:space="preserve">Confirm fee bump</source>
- <context-group purpose="location"><context context-type="linenumber">526</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">523</context></context-group>
</trans-unit>
- <trans-unit id="_msg971">
+ <trans-unit id="_msg977">
<source xml:space="preserve">Can&apos;t draft transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">549</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">540</context></context-group>
</trans-unit>
- <trans-unit id="_msg972">
+ <trans-unit id="_msg978">
<source xml:space="preserve">PSBT copied</source>
- <context-group purpose="location"><context context-type="linenumber">556</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">547</context></context-group>
</trans-unit>
- <trans-unit id="_msg973">
- <source xml:space="preserve">Copied to clipboard</source>
- <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 id="_msg979">
+ <source xml:space="preserve">Fee-bump PSBT copied to clipboard</source>
+ <context-group purpose="location"><context context-type="linenumber">547</context></context-group>
</trans-unit>
- <trans-unit id="_msg974">
+ <trans-unit id="_msg980">
<source xml:space="preserve">Can&apos;t sign transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">564</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">560</context></context-group>
</trans-unit>
- <trans-unit id="_msg975">
+ <trans-unit id="_msg981">
<source xml:space="preserve">Could not commit transaction</source>
- <context-group purpose="location"><context context-type="linenumber">569</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">565</context></context-group>
</trans-unit>
- <trans-unit id="_msg976">
- <source xml:space="preserve">Can&apos;t display address</source>
- <context-group purpose="location"><context context-type="linenumber">583</context></context-group>
+ <trans-unit id="_msg982">
+ <source xml:space="preserve">Signer error</source>
+ <context-group purpose="location"><context context-type="linenumber">578</context></context-group>
</trans-unit>
- <trans-unit id="_msg977">
- <source xml:space="preserve">default wallet</source>
- <context-group purpose="location"><context context-type="linenumber">601</context></context-group>
+ <trans-unit id="_msg983">
+ <source xml:space="preserve">Can&apos;t display address</source>
+ <context-group purpose="location"><context context-type="linenumber">581</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="_msg978">
+ <trans-unit id="_msg984">
<source xml:space="preserve">&amp;Export</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg979">
+ <trans-unit id="_msg985">
<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="_msg980">
+ <trans-unit id="_msg986">
<source xml:space="preserve">Backup Wallet</source>
<context-group purpose="location"><context context-type="linenumber">214</context></context-group>
</trans-unit>
- <trans-unit id="_msg981">
+ <trans-unit id="_msg987">
<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="_msg982">
+ <trans-unit id="_msg988">
<source xml:space="preserve">Backup Failed</source>
<context-group purpose="location"><context context-type="linenumber">222</context></context-group>
</trans-unit>
- <trans-unit id="_msg983">
+ <trans-unit id="_msg989">
<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="_msg984">
+ <trans-unit id="_msg990">
<source xml:space="preserve">Backup Successful</source>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg985">
+ <trans-unit id="_msg991">
<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="_msg986">
+ <trans-unit id="_msg992">
<source xml:space="preserve">Cancel</source>
<context-group purpose="location"><context context-type="linenumber">263</context></context-group>
</trans-unit>
@@ -4536,902 +4560,1011 @@ 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="_msg987">
+ <trans-unit id="_msg993">
<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="_msg988">
+ <trans-unit id="_msg994">
<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="_msg989">
+ <trans-unit id="_msg995">
<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="_msg990">
+ <trans-unit id="_msg996">
<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="_msg991">
+ <trans-unit id="_msg997">
<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="_msg992">
+ <trans-unit id="_msg998">
<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="_msg993">
+ <trans-unit id="_msg999">
<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="_msg994">
+ <trans-unit id="_msg1000">
<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="_msg995">
+ <trans-unit id="_msg1001">
<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="_msg996">
+ <trans-unit id="_msg1002">
<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="_msg997">
+ <trans-unit id="_msg1003">
<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="_msg998">
+ <trans-unit id="_msg1004">
<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="_msg999">
+ <trans-unit id="_msg1005">
<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="_msg1000">
+ <trans-unit id="_msg1006">
<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="_msg1001">
+ <trans-unit id="_msg1007">
<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="_msg1002">
+ <trans-unit id="_msg1008">
<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="_msg1003">
+ <trans-unit id="_msg1009">
<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>
+ <context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg1004">
+ <trans-unit id="_msg1010">
<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>
+ <context-group purpose="location"><context context-type="linenumber">112</context></context-group>
</trans-unit>
- <trans-unit id="_msg1005">
+ <trans-unit id="_msg1011">
<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>
+ <context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg1006">
+ <trans-unit id="_msg1012">
<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>
+ <context-group purpose="location"><context context-type="linenumber">123</context></context-group>
</trans-unit>
- <trans-unit id="_msg1007">
+ <trans-unit id="_msg1013">
<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>
+ <context-group purpose="location"><context context-type="linenumber">126</context></context-group>
</trans-unit>
- <trans-unit id="_msg1008">
+ <trans-unit id="_msg1014">
<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="_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>
+ <context-group purpose="location"><context context-type="linenumber">128</context></context-group>
</trans-unit>
- <trans-unit id="_msg1010">
+ <trans-unit id="_msg1015">
<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>
+ <context-group purpose="location"><context context-type="linenumber">144</context></context-group>
</trans-unit>
- <trans-unit id="_msg1011">
+ <trans-unit id="_msg1016">
<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>
+ <context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
- <trans-unit id="_msg1012">
+ <trans-unit id="_msg1017">
<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>
+ <context-group purpose="location"><context context-type="linenumber">149</context></context-group>
</trans-unit>
- <trans-unit id="_msg1013">
+ <trans-unit id="_msg1018">
<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>
+ <context-group purpose="location"><context context-type="linenumber">152</context></context-group>
</trans-unit>
- <trans-unit id="_msg1014">
+ <trans-unit id="_msg1019">
<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>
+ <context-group purpose="location"><context context-type="linenumber">158</context></context-group>
</trans-unit>
- <trans-unit id="_msg1015">
+ <trans-unit id="_msg1020">
<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>
+ <context-group purpose="location"><context context-type="linenumber">162</context></context-group>
</trans-unit>
- <trans-unit id="_msg1016">
+ <trans-unit id="_msg1021">
<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>
+ <context-group purpose="location"><context context-type="linenumber">165</context></context-group>
</trans-unit>
- <trans-unit id="_msg1017">
+ <trans-unit id="_msg1022">
<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>
+ <context-group purpose="location"><context context-type="linenumber">181</context></context-group>
</trans-unit>
- <trans-unit id="_msg1018">
+ <trans-unit id="_msg1023">
<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>
+ <context-group purpose="location"><context context-type="linenumber">183</context></context-group>
</trans-unit>
- <trans-unit id="_msg1019">
+ <trans-unit id="_msg1024">
<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>
+ <context-group purpose="location"><context context-type="linenumber">187</context></context-group>
</trans-unit>
- <trans-unit id="_msg1020">
+ <trans-unit id="_msg1025">
<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>
+ <context-group purpose="location"><context context-type="linenumber">190</context></context-group>
</trans-unit>
- <trans-unit id="_msg1021">
+ <trans-unit id="_msg1026">
<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>
+ <context-group purpose="location"><context context-type="linenumber">193</context></context-group>
</trans-unit>
- <trans-unit id="_msg1022">
+ <trans-unit id="_msg1027">
<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>
+ <context-group purpose="location"><context context-type="linenumber">196</context></context-group>
</trans-unit>
- <trans-unit id="_msg1023">
+ <trans-unit id="_msg1028">
<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>
+ <context-group purpose="location"><context context-type="linenumber">198</context></context-group>
</trans-unit>
- <trans-unit id="_msg1024">
+ <trans-unit id="_msg1029">
<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>
+ <context-group purpose="location"><context context-type="linenumber">207</context></context-group>
</trans-unit>
- <trans-unit id="_msg1025">
+ <trans-unit id="_msg1030">
<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>
+ <context-group purpose="location"><context context-type="linenumber">217</context></context-group>
</trans-unit>
- <trans-unit id="_msg1026">
+ <trans-unit id="_msg1031">
<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>
+ <context-group purpose="location"><context context-type="linenumber">225</context></context-group>
</trans-unit>
- <trans-unit id="_msg1027">
+ <trans-unit id="_msg1032">
<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>
+ <context-group purpose="location"><context context-type="linenumber">228</context></context-group>
</trans-unit>
- <trans-unit id="_msg1028">
+ <trans-unit id="_msg1033">
<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>
+ <context-group purpose="location"><context context-type="linenumber">231</context></context-group>
</trans-unit>
- <trans-unit id="_msg1029">
+ <trans-unit id="_msg1034">
<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>
+ <context-group purpose="location"><context context-type="linenumber">235</context></context-group>
</trans-unit>
- <trans-unit id="_msg1030">
+ <trans-unit id="_msg1035">
<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>
+ <context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg1031">
+ <trans-unit id="_msg1036">
<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>
+ <context-group purpose="location"><context context-type="linenumber">243</context></context-group>
</trans-unit>
- <trans-unit id="_msg1032">
+ <trans-unit id="_msg1037">
<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>
+ <context-group purpose="location"><context context-type="linenumber">245</context></context-group>
</trans-unit>
- <trans-unit id="_msg1033">
+ <trans-unit id="_msg1038">
<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>
+ <context-group purpose="location"><context context-type="linenumber">248</context></context-group>
</trans-unit>
- <trans-unit id="_msg1034">
+ <trans-unit id="_msg1039">
<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>
+ <context-group purpose="location"><context context-type="linenumber">251</context></context-group>
</trans-unit>
- <trans-unit id="_msg1035">
+ <trans-unit id="_msg1040">
<source xml:space="preserve">%s is set very high!</source>
- <context-group purpose="location"><context context-type="linenumber">244</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">270</context></context-group>
</trans-unit>
- <trans-unit id="_msg1036">
+ <trans-unit id="_msg1041">
<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="_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>
+ <context-group purpose="location"><context context-type="linenumber">271</context></context-group>
</trans-unit>
- <trans-unit id="_msg1038">
+ <trans-unit id="_msg1042">
<source xml:space="preserve">Cannot resolve -%s address: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">248</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">275</context></context-group>
</trans-unit>
- <trans-unit id="_msg1039">
+ <trans-unit id="_msg1043">
<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>
+ <context-group purpose="location"><context context-type="linenumber">276</context></context-group>
</trans-unit>
- <trans-unit id="_msg1040">
+ <trans-unit id="_msg1044">
<source xml:space="preserve">Cannot set -peerblockfilters without -blockfilterindex.</source>
- <context-group purpose="location"><context context-type="linenumber">250</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">277</context></context-group>
</trans-unit>
- <trans-unit id="_msg1041">
+ <trans-unit id="_msg1045">
<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>
+ <context-group purpose="location"><context context-type="linenumber">278</context></context-group>
</trans-unit>
- <trans-unit id="_msg1042">
+ <trans-unit id="_msg1046">
<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="_msg1043">
+ <trans-unit id="_msg1047">
<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="_msg1044">
+ <trans-unit id="_msg1048">
<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="_msg1045">
+ <trans-unit id="_msg1049">
<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="_msg1046">
+ <trans-unit id="_msg1050">
<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="_msg1047">
+ <trans-unit id="_msg1051">
<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="_msg1048">
+ <trans-unit id="_msg1052">
<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="_msg1049">
+ <trans-unit id="_msg1053">
<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="_msg1050">
- <source xml:space="preserve">Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
+ <trans-unit id="_msg1054">
+ <source xml:space="preserve">Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
<context-group purpose="location"><context context-type="linenumber">89</context></context-group>
</trans-unit>
- <trans-unit id="_msg1051">
- <source xml:space="preserve">Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <trans-unit id="_msg1055">
+ <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">92</context></context-group>
</trans-unit>
- <trans-unit id="_msg1052">
+ <trans-unit id="_msg1056">
+ <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">95</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1057">
+ <source xml:space="preserve">Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <context-group purpose="location"><context context-type="linenumber">101</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1058">
+ <source xml:space="preserve">Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <context-group purpose="location"><context context-type="linenumber">104</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1059">
<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>
+ <context-group purpose="location"><context context-type="linenumber">106</context></context-group>
</trans-unit>
- <trans-unit id="_msg1053">
+ <trans-unit id="_msg1060">
<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>
+ <context-group purpose="location"><context context-type="linenumber">109</context></context-group>
</trans-unit>
- <trans-unit id="_msg1054">
+ <trans-unit id="_msg1061">
+ <source xml:space="preserve">Maximum transaction weight is less than transaction weight without inputs</source>
+ <context-group purpose="location"><context context-type="linenumber">116</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1062">
+ <source xml:space="preserve">Maximum transaction weight is too low, can not accommodate change output</source>
+ <context-group purpose="location"><context context-type="linenumber">118</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1063">
<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>
+ <context-group purpose="location"><context context-type="linenumber">131</context></context-group>
</trans-unit>
- <trans-unit id="_msg1055">
+ <trans-unit id="_msg1064">
<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>
+ <context-group purpose="location"><context context-type="linenumber">134</context></context-group>
</trans-unit>
- <trans-unit id="_msg1056">
+ <trans-unit id="_msg1065">
<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>
+ <context-group purpose="location"><context context-type="linenumber">137</context></context-group>
</trans-unit>
- <trans-unit id="_msg1057">
+ <trans-unit id="_msg1066">
<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>
+ <context-group purpose="location"><context context-type="linenumber">141</context></context-group>
</trans-unit>
- <trans-unit id="_msg1058">
+ <trans-unit id="_msg1067">
+ <source xml:space="preserve">Rename of &apos;%s&apos; -&gt; &apos;%s&apos; failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <context-group purpose="location"><context context-type="linenumber">155</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1068">
+ <source xml:space="preserve">The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction 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">170</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1069">
<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>
+ <context-group purpose="location"><context context-type="linenumber">174</context></context-group>
</trans-unit>
- <trans-unit id="_msg1059">
+ <trans-unit id="_msg1070">
<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>
+ <context-group purpose="location"><context context-type="linenumber">177</context></context-group>
</trans-unit>
- <trans-unit id="_msg1060">
+ <trans-unit id="_msg1071">
<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>
+ <context-group purpose="location"><context context-type="linenumber">201</context></context-group>
</trans-unit>
- <trans-unit id="_msg1061">
+ <trans-unit id="_msg1072">
<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>
+ <context-group purpose="location"><context context-type="linenumber">204</context></context-group>
</trans-unit>
- <trans-unit id="_msg1062">
+ <trans-unit id="_msg1073">
<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>
+ <context-group purpose="location"><context context-type="linenumber">210</context></context-group>
</trans-unit>
- <trans-unit id="_msg1063">
+ <trans-unit id="_msg1074">
<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>
+ <context-group purpose="location"><context context-type="linenumber">213</context></context-group>
</trans-unit>
- <trans-unit id="_msg1064">
+ <trans-unit id="_msg1075">
<source xml:space="preserve">Unrecognized descriptor found. Loading wallet %s
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <context-group purpose="location"><context context-type="linenumber">204</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">220</context></context-group>
</trans-unit>
- <trans-unit id="_msg1065">
+ <trans-unit id="_msg1076">
+ <source xml:space="preserve">Your computer&apos;s date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you&apos;ve confirmed your computer&apos;s clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you&apos;ve connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <context-group purpose="location"><context context-type="linenumber">254</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1077">
<source xml:space="preserve">
Unable to cleanup failed migration</source>
- <context-group purpose="location"><context context-type="linenumber">238</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">262</context></context-group>
</trans-unit>
- <trans-unit id="_msg1066">
+ <trans-unit id="_msg1078">
<source xml:space="preserve">
Unable to restore backup of wallet.</source>
- <context-group purpose="location"><context context-type="linenumber">241</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">265</context></context-group>
</trans-unit>
- <trans-unit id="_msg1067">
+ <trans-unit id="_msg1079">
+ <source xml:space="preserve">whitebind may only be used for incoming connections (&quot;out&quot; was passed)</source>
+ <context-group purpose="location"><context context-type="linenumber">268</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1080">
+ <source xml:space="preserve">A fatal internal error occurred, see debug.log for details: </source>
+ <context-group purpose="location"><context context-type="linenumber">272</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1081">
+ <source xml:space="preserve">Assumeutxo data not found for the given blockhash &apos;%s&apos;.</source>
+ <context-group purpose="location"><context context-type="linenumber">273</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1082">
<source xml:space="preserve">Block verification was interrupted</source>
- <context-group purpose="location"><context context-type="linenumber">247</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
</trans-unit>
- <trans-unit id="_msg1068">
+ <trans-unit id="_msg1083">
<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>
+ <context-group purpose="location"><context context-type="linenumber">279</context></context-group>
</trans-unit>
- <trans-unit id="_msg1069">
+ <trans-unit id="_msg1084">
<source xml:space="preserve">Copyright (C) %i-%i</source>
- <context-group purpose="location"><context context-type="linenumber">253</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">280</context></context-group>
</trans-unit>
- <trans-unit id="_msg1070">
+ <trans-unit id="_msg1085">
+ <source xml:space="preserve">Corrupt block found indicating potential hardware failure.</source>
+ <context-group purpose="location"><context context-type="linenumber">281</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1086">
<source xml:space="preserve">Corrupted block database detected</source>
- <context-group purpose="location"><context context-type="linenumber">254</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">282</context></context-group>
</trans-unit>
- <trans-unit id="_msg1071">
+ <trans-unit id="_msg1087">
<source xml:space="preserve">Could not find asmap file %s</source>
- <context-group purpose="location"><context context-type="linenumber">255</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">283</context></context-group>
</trans-unit>
- <trans-unit id="_msg1072">
+ <trans-unit id="_msg1088">
<source xml:space="preserve">Could not parse asmap file %s</source>
- <context-group purpose="location"><context context-type="linenumber">256</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">284</context></context-group>
</trans-unit>
- <trans-unit id="_msg1073">
+ <trans-unit id="_msg1089">
<source xml:space="preserve">Disk space is too low!</source>
- <context-group purpose="location"><context context-type="linenumber">257</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">285</context></context-group>
</trans-unit>
- <trans-unit id="_msg1074">
+ <trans-unit id="_msg1090">
<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>
+ <context-group purpose="location"><context context-type="linenumber">286</context></context-group>
</trans-unit>
- <trans-unit id="_msg1075">
+ <trans-unit id="_msg1091">
<source xml:space="preserve">Done loading</source>
- <context-group purpose="location"><context context-type="linenumber">259</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">287</context></context-group>
</trans-unit>
- <trans-unit id="_msg1076">
+ <trans-unit id="_msg1092">
<source xml:space="preserve">Dump file %s does not exist.</source>
- <context-group purpose="location"><context context-type="linenumber">260</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">288</context></context-group>
</trans-unit>
- <trans-unit id="_msg1077">
+ <trans-unit id="_msg1093">
+ <source xml:space="preserve">Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <context-group purpose="location"><context context-type="linenumber">289</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1094">
<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>
+ <context-group purpose="location"><context context-type="linenumber">290</context></context-group>
</trans-unit>
- <trans-unit id="_msg1078">
+ <trans-unit id="_msg1095">
<source xml:space="preserve">Error creating %s</source>
- <context-group purpose="location"><context context-type="linenumber">262</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">291</context></context-group>
</trans-unit>
- <trans-unit id="_msg1079">
+ <trans-unit id="_msg1096">
<source xml:space="preserve">Error initializing block database</source>
- <context-group purpose="location"><context context-type="linenumber">263</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">292</context></context-group>
</trans-unit>
- <trans-unit id="_msg1080">
+ <trans-unit id="_msg1097">
<source xml:space="preserve">Error initializing wallet database environment %s!</source>
- <context-group purpose="location"><context context-type="linenumber">264</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">293</context></context-group>
</trans-unit>
- <trans-unit id="_msg1081">
+ <trans-unit id="_msg1098">
<source xml:space="preserve">Error loading %s</source>
- <context-group purpose="location"><context context-type="linenumber">265</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">294</context></context-group>
</trans-unit>
- <trans-unit id="_msg1082">
+ <trans-unit id="_msg1099">
<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>
+ <context-group purpose="location"><context context-type="linenumber">295</context></context-group>
</trans-unit>
- <trans-unit id="_msg1083">
+ <trans-unit id="_msg1100">
<source xml:space="preserve">Error loading %s: Wallet corrupted</source>
- <context-group purpose="location"><context context-type="linenumber">267</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">296</context></context-group>
</trans-unit>
- <trans-unit id="_msg1084">
+ <trans-unit id="_msg1101">
<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>
+ <context-group purpose="location"><context context-type="linenumber">297</context></context-group>
</trans-unit>
- <trans-unit id="_msg1085">
+ <trans-unit id="_msg1102">
<source xml:space="preserve">Error loading block database</source>
- <context-group purpose="location"><context context-type="linenumber">269</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">298</context></context-group>
</trans-unit>
- <trans-unit id="_msg1086">
+ <trans-unit id="_msg1103">
<source xml:space="preserve">Error opening block database</source>
- <context-group purpose="location"><context context-type="linenumber">270</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">299</context></context-group>
</trans-unit>
- <trans-unit id="_msg1087">
+ <trans-unit id="_msg1104">
<source xml:space="preserve">Error reading configuration file: %s</source>
- <context-group purpose="location"><context context-type="linenumber">271</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">300</context></context-group>
</trans-unit>
- <trans-unit id="_msg1088">
+ <trans-unit id="_msg1105">
<source xml:space="preserve">Error reading from database, shutting down.</source>
- <context-group purpose="location"><context context-type="linenumber">272</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
</trans-unit>
- <trans-unit id="_msg1089">
+ <trans-unit id="_msg1106">
<source xml:space="preserve">Error reading next record from wallet database</source>
- <context-group purpose="location"><context context-type="linenumber">273</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">302</context></context-group>
</trans-unit>
- <trans-unit id="_msg1090">
+ <trans-unit id="_msg1107">
<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>
+ <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
</trans-unit>
- <trans-unit id="_msg1091">
+ <trans-unit id="_msg1108">
<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>
+ <context-group purpose="location"><context context-type="linenumber">304</context></context-group>
</trans-unit>
- <trans-unit id="_msg1092">
+ <trans-unit id="_msg1109">
<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>
+ <context-group purpose="location"><context context-type="linenumber">307</context></context-group>
</trans-unit>
- <trans-unit id="_msg1093">
+ <trans-unit id="_msg1110">
<source xml:space="preserve">Error: Disk space is low for %s</source>
- <context-group purpose="location"><context context-type="linenumber">279</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">308</context></context-group>
</trans-unit>
- <trans-unit id="_msg1094">
+ <trans-unit id="_msg1111">
<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>
+ <context-group purpose="location"><context context-type="linenumber">309</context></context-group>
</trans-unit>
- <trans-unit id="_msg1095">
+ <trans-unit id="_msg1112">
<source xml:space="preserve">Error: Failed to create new watchonly wallet</source>
- <context-group purpose="location"><context context-type="linenumber">281</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">310</context></context-group>
</trans-unit>
- <trans-unit id="_msg1096">
+ <trans-unit id="_msg1113">
<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>
+ <context-group purpose="location"><context context-type="linenumber">311</context></context-group>
</trans-unit>
- <trans-unit id="_msg1097">
+ <trans-unit id="_msg1114">
<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>
+ <context-group purpose="location"><context context-type="linenumber">312</context></context-group>
</trans-unit>
- <trans-unit id="_msg1098">
+ <trans-unit id="_msg1115">
<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>
+ <context-group purpose="location"><context context-type="linenumber">313</context></context-group>
</trans-unit>
- <trans-unit id="_msg1099">
+ <trans-unit id="_msg1116">
<source xml:space="preserve">Error: Missing checksum</source>
- <context-group purpose="location"><context context-type="linenumber">285</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">314</context></context-group>
</trans-unit>
- <trans-unit id="_msg1100">
+ <trans-unit id="_msg1117">
<source xml:space="preserve">Error: No %s addresses available.</source>
- <context-group purpose="location"><context context-type="linenumber">286</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">315</context></context-group>
</trans-unit>
- <trans-unit id="_msg1101">
+ <trans-unit id="_msg1118">
<source xml:space="preserve">Error: This wallet already uses SQLite</source>
- <context-group purpose="location"><context context-type="linenumber">287</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">316</context></context-group>
</trans-unit>
- <trans-unit id="_msg1102">
+ <trans-unit id="_msg1119">
<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>
+ <context-group purpose="location"><context context-type="linenumber">317</context></context-group>
</trans-unit>
- <trans-unit id="_msg1103">
+ <trans-unit id="_msg1120">
<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>
+ <context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg1104">
+ <trans-unit id="_msg1121">
<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>
+ <context-group purpose="location"><context context-type="linenumber">319</context></context-group>
</trans-unit>
- <trans-unit id="_msg1105">
+ <trans-unit id="_msg1122">
<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>
+ <context-group purpose="location"><context context-type="linenumber">320</context></context-group>
</trans-unit>
- <trans-unit id="_msg1106">
+ <trans-unit id="_msg1123">
<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>
+ <context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg1107">
+ <trans-unit id="_msg1124">
<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>
+ <context-group purpose="location"><context context-type="linenumber">322</context></context-group>
</trans-unit>
- <trans-unit id="_msg1108">
+ <trans-unit id="_msg1125">
<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>
+ <context-group purpose="location"><context context-type="linenumber">323</context></context-group>
</trans-unit>
- <trans-unit id="_msg1109">
+ <trans-unit id="_msg1126">
<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>
+ <context-group purpose="location"><context context-type="linenumber">324</context></context-group>
</trans-unit>
- <trans-unit id="_msg1110">
+ <trans-unit id="_msg1127">
<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>
+ <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
</trans-unit>
- <trans-unit id="_msg1111">
+ <trans-unit id="_msg1128">
<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>
+ <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
- <trans-unit id="_msg1112">
+ <trans-unit id="_msg1129">
<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>
+ <context-group purpose="location"><context context-type="linenumber">327</context></context-group>
</trans-unit>
- <trans-unit id="_msg1113">
+ <trans-unit id="_msg1130">
<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>
+ <context-group purpose="location"><context context-type="linenumber">328</context></context-group>
</trans-unit>
- <trans-unit id="_msg1114">
+ <trans-unit id="_msg1131">
+ <source xml:space="preserve">Failed to connect best block (%s).</source>
+ <context-group purpose="location"><context context-type="linenumber">329</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1132">
+ <source xml:space="preserve">Failed to disconnect block.</source>
+ <context-group purpose="location"><context context-type="linenumber">330</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1133">
<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>
+ <context-group purpose="location"><context context-type="linenumber">331</context></context-group>
</trans-unit>
- <trans-unit id="_msg1115">
+ <trans-unit id="_msg1134">
+ <source xml:space="preserve">Failed to read block.</source>
+ <context-group purpose="location"><context context-type="linenumber">332</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1135">
<source xml:space="preserve">Failed to rescan the wallet during initialization</source>
- <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">333</context></context-group>
</trans-unit>
- <trans-unit id="_msg1116">
+ <trans-unit id="_msg1136">
<source xml:space="preserve">Failed to start indexes, shutting down..</source>
- <context-group purpose="location"><context context-type="linenumber">302</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">334</context></context-group>
</trans-unit>
- <trans-unit id="_msg1117">
+ <trans-unit id="_msg1137">
<source xml:space="preserve">Failed to verify database</source>
- <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
</trans-unit>
- <trans-unit id="_msg1118">
+ <trans-unit id="_msg1138">
+ <source xml:space="preserve">Failed to write block.</source>
+ <context-group purpose="location"><context context-type="linenumber">336</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1139">
+ <source xml:space="preserve">Failed to write to block index database.</source>
+ <context-group purpose="location"><context context-type="linenumber">337</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1140">
+ <source xml:space="preserve">Failed to write to coin database.</source>
+ <context-group purpose="location"><context context-type="linenumber">338</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1141">
+ <source xml:space="preserve">Failed to write undo data.</source>
+ <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1142">
<source xml:space="preserve">Failure removing transaction: %s</source>
- <context-group purpose="location"><context context-type="linenumber">304</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">340</context></context-group>
</trans-unit>
- <trans-unit id="_msg1119">
+ <trans-unit id="_msg1143">
<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>
+ <context-group purpose="location"><context context-type="linenumber">341</context></context-group>
</trans-unit>
- <trans-unit id="_msg1120">
+ <trans-unit id="_msg1144">
<source xml:space="preserve">Ignoring duplicate -wallet %s.</source>
- <context-group purpose="location"><context context-type="linenumber">306</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">342</context></context-group>
</trans-unit>
- <trans-unit id="_msg1121">
+ <trans-unit id="_msg1145">
<source xml:space="preserve">Importing…</source>
- <context-group purpose="location"><context context-type="linenumber">307</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">343</context></context-group>
</trans-unit>
- <trans-unit id="_msg1122">
+ <trans-unit id="_msg1146">
<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>
+ <context-group purpose="location"><context context-type="linenumber">344</context></context-group>
</trans-unit>
- <trans-unit id="_msg1123">
+ <trans-unit id="_msg1147">
<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>
+ <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
</trans-unit>
- <trans-unit id="_msg1124">
+ <trans-unit id="_msg1148">
<source xml:space="preserve">Input not found or already spent</source>
- <context-group purpose="location"><context context-type="linenumber">310</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">346</context></context-group>
</trans-unit>
- <trans-unit id="_msg1125">
+ <trans-unit id="_msg1149">
<source xml:space="preserve">Insufficient dbcache for block verification</source>
- <context-group purpose="location"><context context-type="linenumber">311</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
</trans-unit>
- <trans-unit id="_msg1126">
+ <trans-unit id="_msg1150">
<source xml:space="preserve">Insufficient funds</source>
- <context-group purpose="location"><context context-type="linenumber">312</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">348</context></context-group>
</trans-unit>
- <trans-unit id="_msg1127">
+ <trans-unit id="_msg1151">
<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>
+ <context-group purpose="location"><context context-type="linenumber">349</context></context-group>
</trans-unit>
- <trans-unit id="_msg1128">
+ <trans-unit id="_msg1152">
<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>
+ <context-group purpose="location"><context context-type="linenumber">350</context></context-group>
</trans-unit>
- <trans-unit id="_msg1129">
+ <trans-unit id="_msg1153">
<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>
+ <context-group purpose="location"><context context-type="linenumber">351</context></context-group>
</trans-unit>
- <trans-unit id="_msg1130">
+ <trans-unit id="_msg1154">
<source xml:space="preserve">Invalid P2P permission: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">316</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">352</context></context-group>
</trans-unit>
- <trans-unit id="_msg1131">
+ <trans-unit id="_msg1155">
<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>
+ <context-group purpose="location"><context context-type="linenumber">353</context></context-group>
</trans-unit>
- <trans-unit id="_msg1132">
+ <trans-unit id="_msg1156">
<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>
+ <context-group purpose="location"><context context-type="linenumber">354</context></context-group>
</trans-unit>
- <trans-unit id="_msg1133">
+ <trans-unit id="_msg1157">
<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>
+ <context-group purpose="location"><context context-type="linenumber">355</context></context-group>
</trans-unit>
- <trans-unit id="_msg1134">
+ <trans-unit id="_msg1158">
<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>
+ <context-group purpose="location"><context context-type="linenumber">356</context></context-group>
</trans-unit>
- <trans-unit id="_msg1135">
+ <trans-unit id="_msg1159">
<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>
+ <context-group purpose="location"><context context-type="linenumber">357</context></context-group>
</trans-unit>
- <trans-unit id="_msg1136">
+ <trans-unit id="_msg1160">
<source xml:space="preserve">Invalid pre-selected input %s</source>
- <context-group purpose="location"><context context-type="linenumber">322</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">358</context></context-group>
</trans-unit>
- <trans-unit id="_msg1137">
+ <trans-unit id="_msg1161">
<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>
+ <context-group purpose="location"><context context-type="linenumber">359</context></context-group>
</trans-unit>
- <trans-unit id="_msg1138">
+ <trans-unit id="_msg1162">
<source xml:space="preserve">Loading P2P addresses…</source>
- <context-group purpose="location"><context context-type="linenumber">324</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">360</context></context-group>
</trans-unit>
- <trans-unit id="_msg1139">
+ <trans-unit id="_msg1163">
<source xml:space="preserve">Loading banlist…</source>
- <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">361</context></context-group>
</trans-unit>
- <trans-unit id="_msg1140">
+ <trans-unit id="_msg1164">
<source xml:space="preserve">Loading block index…</source>
- <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">362</context></context-group>
</trans-unit>
- <trans-unit id="_msg1141">
+ <trans-unit id="_msg1165">
<source xml:space="preserve">Loading wallet…</source>
- <context-group purpose="location"><context context-type="linenumber">327</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">363</context></context-group>
</trans-unit>
- <trans-unit id="_msg1142">
+ <trans-unit id="_msg1166">
+ <source xml:space="preserve">Maximum transaction weight must be between %d and %d</source>
+ <context-group purpose="location"><context context-type="linenumber">364</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1167">
<source xml:space="preserve">Missing amount</source>
- <context-group purpose="location"><context context-type="linenumber">328</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">365</context></context-group>
</trans-unit>
- <trans-unit id="_msg1143">
+ <trans-unit id="_msg1168">
<source xml:space="preserve">Missing solving data for estimating transaction size</source>
- <context-group purpose="location"><context context-type="linenumber">329</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">366</context></context-group>
</trans-unit>
- <trans-unit id="_msg1144">
+ <trans-unit id="_msg1169">
<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>
+ <context-group purpose="location"><context context-type="linenumber">367</context></context-group>
</trans-unit>
- <trans-unit id="_msg1145">
+ <trans-unit id="_msg1170">
<source xml:space="preserve">No addresses available</source>
- <context-group purpose="location"><context context-type="linenumber">331</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">368</context></context-group>
</trans-unit>
- <trans-unit id="_msg1146">
+ <trans-unit id="_msg1171">
<source xml:space="preserve">Not enough file descriptors available.</source>
- <context-group purpose="location"><context context-type="linenumber">332</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">369</context></context-group>
</trans-unit>
- <trans-unit id="_msg1147">
+ <trans-unit id="_msg1172">
<source xml:space="preserve">Not found pre-selected input %s</source>
- <context-group purpose="location"><context context-type="linenumber">333</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">370</context></context-group>
</trans-unit>
- <trans-unit id="_msg1148">
+ <trans-unit id="_msg1173">
<source xml:space="preserve">Not solvable pre-selected input %s</source>
- <context-group purpose="location"><context context-type="linenumber">334</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
</trans-unit>
- <trans-unit id="_msg1149">
+ <trans-unit id="_msg1174">
+ <source xml:space="preserve">Only direction was set, no permissions: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1175">
<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>
+ <context-group purpose="location"><context context-type="linenumber">373</context></context-group>
</trans-unit>
- <trans-unit id="_msg1150">
+ <trans-unit id="_msg1176">
<source xml:space="preserve">Prune mode is incompatible with -txindex.</source>
- <context-group purpose="location"><context context-type="linenumber">336</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">374</context></context-group>
</trans-unit>
- <trans-unit id="_msg1151">
+ <trans-unit id="_msg1177">
<source xml:space="preserve">Pruning blockstore…</source>
- <context-group purpose="location"><context context-type="linenumber">337</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg1152">
+ <trans-unit id="_msg1178">
<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>
+ <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
</trans-unit>
- <trans-unit id="_msg1153">
+ <trans-unit id="_msg1179">
<source xml:space="preserve">Replaying blocks…</source>
- <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
- <trans-unit id="_msg1154">
+ <trans-unit id="_msg1180">
<source xml:space="preserve">Rescanning…</source>
- <context-group purpose="location"><context context-type="linenumber">340</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">378</context></context-group>
</trans-unit>
- <trans-unit id="_msg1155">
+ <trans-unit id="_msg1181">
<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>
+ <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
</trans-unit>
- <trans-unit id="_msg1156">
+ <trans-unit id="_msg1182">
<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>
+ <context-group purpose="location"><context context-type="linenumber">380</context></context-group>
</trans-unit>
- <trans-unit id="_msg1157">
+ <trans-unit id="_msg1183">
<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>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg1158">
+ <trans-unit id="_msg1184">
<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>
+ <context-group purpose="location"><context context-type="linenumber">382</context></context-group>
</trans-unit>
- <trans-unit id="_msg1159">
+ <trans-unit id="_msg1185">
<source xml:space="preserve">Section [%s] is not recognized.</source>
- <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">383</context></context-group>
</trans-unit>
- <trans-unit id="_msg1160">
+ <trans-unit id="_msg1186">
+ <source xml:space="preserve">Signer did not echo address</source>
+ <context-group purpose="location"><context context-type="linenumber">386</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1187">
+ <source xml:space="preserve">Signer echoed unexpected address %s</source>
+ <context-group purpose="location"><context context-type="linenumber">387</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1188">
+ <source xml:space="preserve">Signer returned error: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">388</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1189">
<source xml:space="preserve">Signing transaction failed</source>
- <context-group purpose="location"><context context-type="linenumber">348</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">389</context></context-group>
</trans-unit>
- <trans-unit id="_msg1161">
+ <trans-unit id="_msg1190">
<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>
+ <context-group purpose="location"><context context-type="linenumber">390</context></context-group>
</trans-unit>
- <trans-unit id="_msg1162">
+ <trans-unit id="_msg1191">
<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>
+ <context-group purpose="location"><context context-type="linenumber">391</context></context-group>
</trans-unit>
- <trans-unit id="_msg1163">
+ <trans-unit id="_msg1192">
<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>
+ <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
</trans-unit>
- <trans-unit id="_msg1164">
+ <trans-unit id="_msg1193">
<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>
+ <context-group purpose="location"><context context-type="linenumber">393</context></context-group>
</trans-unit>
- <trans-unit id="_msg1165">
+ <trans-unit id="_msg1194">
<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>
+ <context-group purpose="location"><context context-type="linenumber">394</context></context-group>
</trans-unit>
- <trans-unit id="_msg1166">
+ <trans-unit id="_msg1195">
<source xml:space="preserve">Starting network threads…</source>
- <context-group purpose="location"><context context-type="linenumber">354</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">395</context></context-group>
</trans-unit>
- <trans-unit id="_msg1167">
+ <trans-unit id="_msg1196">
+ <source xml:space="preserve">System error while flushing: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">396</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1197">
+ <source xml:space="preserve">System error while loading external block file: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">397</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1198">
+ <source xml:space="preserve">System error while saving block to disk: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">398</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1199">
<source xml:space="preserve">The source code is available from %s.</source>
- <context-group purpose="location"><context context-type="linenumber">355</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">399</context></context-group>
</trans-unit>
- <trans-unit id="_msg1168">
+ <trans-unit id="_msg1200">
<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>
+ <context-group purpose="location"><context context-type="linenumber">400</context></context-group>
</trans-unit>
- <trans-unit id="_msg1169">
+ <trans-unit id="_msg1201">
<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>
+ <context-group purpose="location"><context context-type="linenumber">401</context></context-group>
</trans-unit>
- <trans-unit id="_msg1170">
+ <trans-unit id="_msg1202">
<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>
+ <context-group purpose="location"><context context-type="linenumber">402</context></context-group>
</trans-unit>
- <trans-unit id="_msg1171">
+ <trans-unit id="_msg1203">
+ <source xml:space="preserve">There is no ScriptPubKeyManager for this address</source>
+ <context-group purpose="location"><context context-type="linenumber">403</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1204">
<source xml:space="preserve">This is experimental software.</source>
- <context-group purpose="location"><context context-type="linenumber">359</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">404</context></context-group>
</trans-unit>
- <trans-unit id="_msg1172">
+ <trans-unit id="_msg1205">
<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>
+ <context-group purpose="location"><context context-type="linenumber">405</context></context-group>
</trans-unit>
- <trans-unit id="_msg1173">
+ <trans-unit id="_msg1206">
<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>
+ <context-group purpose="location"><context context-type="linenumber">406</context></context-group>
</trans-unit>
- <trans-unit id="_msg1174">
+ <trans-unit id="_msg1207">
<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>
+ <context-group purpose="location"><context context-type="linenumber">407</context></context-group>
</trans-unit>
- <trans-unit id="_msg1175">
+ <trans-unit id="_msg1208">
<source xml:space="preserve">Transaction amount too small</source>
- <context-group purpose="location"><context context-type="linenumber">363</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">408</context></context-group>
</trans-unit>
- <trans-unit id="_msg1176">
+ <trans-unit id="_msg1209">
<source xml:space="preserve">Transaction amounts must not be negative</source>
- <context-group purpose="location"><context context-type="linenumber">364</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">409</context></context-group>
</trans-unit>
- <trans-unit id="_msg1177">
+ <trans-unit id="_msg1210">
<source xml:space="preserve">Transaction change output index out of range</source>
- <context-group purpose="location"><context context-type="linenumber">365</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">410</context></context-group>
</trans-unit>
- <trans-unit id="_msg1178">
+ <trans-unit id="_msg1211">
<source xml:space="preserve">Transaction must have at least one recipient</source>
- <context-group purpose="location"><context context-type="linenumber">366</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">411</context></context-group>
</trans-unit>
- <trans-unit id="_msg1179">
+ <trans-unit id="_msg1212">
<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>
+ <context-group purpose="location"><context context-type="linenumber">412</context></context-group>
</trans-unit>
- <trans-unit id="_msg1180">
+ <trans-unit id="_msg1213">
<source xml:space="preserve">Transaction too large</source>
- <context-group purpose="location"><context context-type="linenumber">368</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">413</context></context-group>
</trans-unit>
- <trans-unit id="_msg1181">
- <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">
+ <trans-unit id="_msg1214">
<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>
+ <context-group purpose="location"><context context-type="linenumber">414</context></context-group>
</trans-unit>
- <trans-unit id="_msg1183">
+ <trans-unit id="_msg1215">
<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>
+ <context-group purpose="location"><context context-type="linenumber">415</context></context-group>
</trans-unit>
- <trans-unit id="_msg1184">
+ <trans-unit id="_msg1216">
<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>
+ <context-group purpose="location"><context context-type="linenumber">416</context></context-group>
</trans-unit>
- <trans-unit id="_msg1185">
+ <trans-unit id="_msg1217">
<source xml:space="preserve">Unable to find UTXO for external input</source>
- <context-group purpose="location"><context context-type="linenumber">373</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">417</context></context-group>
</trans-unit>
- <trans-unit id="_msg1186">
+ <trans-unit id="_msg1218">
<source xml:space="preserve">Unable to generate initial keys</source>
- <context-group purpose="location"><context context-type="linenumber">374</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">418</context></context-group>
</trans-unit>
- <trans-unit id="_msg1187">
+ <trans-unit id="_msg1219">
<source xml:space="preserve">Unable to generate keys</source>
- <context-group purpose="location"><context context-type="linenumber">375</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">419</context></context-group>
</trans-unit>
- <trans-unit id="_msg1188">
+ <trans-unit id="_msg1220">
<source xml:space="preserve">Unable to open %s for writing</source>
- <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">420</context></context-group>
</trans-unit>
- <trans-unit id="_msg1189">
+ <trans-unit id="_msg1221">
<source xml:space="preserve">Unable to parse -maxuploadtarget: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">421</context></context-group>
</trans-unit>
- <trans-unit id="_msg1190">
+ <trans-unit id="_msg1222">
<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>
+ <context-group purpose="location"><context context-type="linenumber">422</context></context-group>
</trans-unit>
- <trans-unit id="_msg1191">
+ <trans-unit id="_msg1223">
<source xml:space="preserve">Unable to unload the wallet before migrating</source>
- <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">423</context></context-group>
</trans-unit>
- <trans-unit id="_msg1192">
+ <trans-unit id="_msg1224">
<source xml:space="preserve">Unknown -blockfilterindex value %s.</source>
- <context-group purpose="location"><context context-type="linenumber">380</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">424</context></context-group>
</trans-unit>
- <trans-unit id="_msg1193">
+ <trans-unit id="_msg1225">
<source xml:space="preserve">Unknown address type &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">425</context></context-group>
</trans-unit>
- <trans-unit id="_msg1194">
+ <trans-unit id="_msg1226">
<source xml:space="preserve">Unknown change type &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">382</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">426</context></context-group>
</trans-unit>
- <trans-unit id="_msg1195">
+ <trans-unit id="_msg1227">
<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>
+ <context-group purpose="location"><context context-type="linenumber">427</context></context-group>
</trans-unit>
- <trans-unit id="_msg1196">
+ <trans-unit id="_msg1228">
<source xml:space="preserve">Unknown new rules activated (versionbit %i)</source>
- <context-group purpose="location"><context context-type="linenumber">384</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">428</context></context-group>
</trans-unit>
- <trans-unit id="_msg1197">
+ <trans-unit id="_msg1229">
+ <source xml:space="preserve">Unrecognised option &quot;%s&quot; provided in -test=&lt;option&gt;.</source>
+ <context-group purpose="location"><context context-type="linenumber">429</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1230">
<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>
+ <context-group purpose="location"><context context-type="linenumber">430</context></context-group>
</trans-unit>
- <trans-unit id="_msg1198">
+ <trans-unit id="_msg1231">
<source xml:space="preserve">Wallet file creation failed: %s</source>
- <context-group purpose="location"><context context-type="linenumber">390</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">435</context></context-group>
</trans-unit>
- <trans-unit id="_msg1199">
+ <trans-unit id="_msg1232">
<source xml:space="preserve">acceptstalefeeestimates is not supported on %s chain.</source>
- <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">437</context></context-group>
</trans-unit>
- <trans-unit id="_msg1200">
+ <trans-unit id="_msg1233">
<source xml:space="preserve">Unsupported logging category %s=%s.</source>
- <context-group purpose="location"><context context-type="linenumber">386</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">431</context></context-group>
</trans-unit>
- <trans-unit id="_msg1201">
+ <trans-unit id="_msg1234">
<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>
+ <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
</trans-unit>
- <trans-unit id="_msg1202">
+ <trans-unit id="_msg1235">
<source xml:space="preserve">Error: Could not delete watchonly transactions. </source>
- <context-group purpose="location"><context context-type="linenumber">277</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">306</context></context-group>
</trans-unit>
- <trans-unit id="_msg1203">
+ <trans-unit id="_msg1236">
<source xml:space="preserve">User Agent comment (%s) contains unsafe characters.</source>
- <context-group purpose="location"><context context-type="linenumber">387</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">432</context></context-group>
</trans-unit>
- <trans-unit id="_msg1204">
+ <trans-unit id="_msg1237">
<source xml:space="preserve">Verifying blocks…</source>
- <context-group purpose="location"><context context-type="linenumber">388</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">433</context></context-group>
</trans-unit>
- <trans-unit id="_msg1205">
+ <trans-unit id="_msg1238">
<source xml:space="preserve">Verifying wallet(s)…</source>
- <context-group purpose="location"><context context-type="linenumber">389</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">434</context></context-group>
</trans-unit>
- <trans-unit id="_msg1206">
+ <trans-unit id="_msg1239">
<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>
+ <context-group purpose="location"><context context-type="linenumber">436</context></context-group>
</trans-unit>
- <trans-unit id="_msg1207">
+ <trans-unit id="_msg1240">
<source xml:space="preserve">Settings file could not be read</source>
- <context-group purpose="location"><context context-type="linenumber">346</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">384</context></context-group>
</trans-unit>
- <trans-unit id="_msg1208">
+ <trans-unit id="_msg1241">
<source xml:space="preserve">Settings file could not be written</source>
- <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">385</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 3b44647095..4cda8f900b 100644
--- a/src/qt/locale/bitcoin_eo.ts
+++ b/src/qt/locale/bitcoin_eo.ts
@@ -258,36 +258,36 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n sekundo</numerusform>
+ <numerusform>%n sekundoj</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n minuto</numerusform>
+ <numerusform>%n minutoj</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n horo</numerusform>
+ <numerusform>%n horoj</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n tago</numerusform>
+ <numerusform>%n tagoj</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n semajno</numerusform>
+ <numerusform>%n semajnoj</numerusform>
</translation>
</message>
<message>
@@ -297,11 +297,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n jaro</numerusform>
+ <numerusform>%n jaroj</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">defaÅ­lta monujo</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -477,10 +481,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Fermi ĉiujn monujojn</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">defaÅ­lta monujo</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">Monujo-Nomo</translation>
@@ -704,10 +704,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Malfermi monujon averto</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">defaÅ­lta monujo</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Malfermi la Monujon</translation>
@@ -834,8 +830,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n gigabajto de libera loko disponeble</numerusform>
+ <numerusform>%n gigabajtoj de libera loko disponebla.</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1342,6 +1338,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Malekzili</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Neniu</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">Al</translation>
</message>
@@ -1722,10 +1722,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Bonvolu kontroli la adreson kaj reprovi.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La adreso, kiun vi enmetis, referencas neniun ŝlosilon.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">MalÅloso de monujo estas nuligita.</translation>
</message>
@@ -2057,11 +2053,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">Sendi Bitmonon</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">defaÅ­lta monujo</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2144,6 +2136,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Subskriba transakcio fiaskis</translation>
</message>
<message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">la elektita dosierujo por datumoj "%s" ne ekzistas.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Äi estas eksperimenta programo</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts
index 585df2e497..9f4091eadd 100644
--- a/src/qt/locale/bitcoin_es.ts
+++ b/src/qt/locale/bitcoin_es.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Haz clic derecho para editar dirección o etiqueta</translation>
+ <translation type="unfinished">Hacer clic derecho para editar la dirección o etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -11,11 +11,11 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">&amp;Nuevo</translation>
+ <translation type="unfinished">&amp;Nueva</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copia la dirección actualmente seleccionada al portapapeles del sistema</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -129,7 +129,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Ingresa la frase de contraseña</translation>
+ <translation type="unfinished">Ingresar la frase de contraseña</translation>
</message>
<message>
<source>New passphrase</source>
@@ -137,7 +137,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Repite la nueva frase de contraseña</translation>
+ <translation type="unfinished">Repetir la nueva frase de contraseña</translation>
</message>
<message>
<source>Show passphrase</source>
@@ -184,6 +184,14 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<translation type="unfinished">Introduce la frase de contraseña antigua y la nueva para el monedero.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</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 total de tus bitcoins contra robos si el equipo está infectado con malware.</translation>
</message>
@@ -406,7 +414,11 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">monedero predeterminado</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -484,7 +496,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Cambiar la frase de contraseña utilizada para el cifrado del monedero</translation>
+ <translation type="unfinished">Cambiar la contraseña utilizada para el cifrado del monedero</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -500,35 +512,23 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Cifrar monedero…</translation>
- </message>
- <message>
- <source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Cifrar las claves privadas de tu monedero</translation>
+ <translation type="unfinished">&amp;Cifrar monedero</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Respaldar monedero…</translation>
+ <translation type="unfinished">&amp;Copia de seguridad del monedero</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña…</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <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 tus direcciones Bitcoin para probar la propiedad</translation>
+ <translation type="unfinished">Firmar &amp;mensaje...</translation>
</message>
<message>
<source>&amp;Verify message…</source>
- <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 mensajes para comprobar que fueron firmados con la dirección Bitcoin indicada</translation>
+ <translation type="unfinished">&amp;Verificar mensaje...</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
@@ -551,24 +551,12 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<translation type="unfinished">Cerrar todos los monederos...</translation>
</message>
<message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;Archivo</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <translation type="unfinished">&amp;Parámetros</translation>
- </message>
- <message>
<source>&amp;Help</source>
<translation type="unfinished">&amp;Ayuda</translation>
</message>
<message>
- <source>Tabs toolbar</source>
- <translation type="unfinished">Barra de pestañas</translation>
- </message>
- <message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -576,27 +564,27 @@ Solo es posible firmar con direcciones de tipo "legacy".</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 pares…</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Solicitar pagos (genera códigos QR y URI de tipo "bitcoin:")</translation>
+ <translation type="unfinished">Solicitar pagos (genera código QR y URI's de 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 y etiquetas utilizadas</translation>
+ <translation type="unfinished">Editar la lista de las direcciones y etiquetas almacenadas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Muestra el listado de direcciones de recepción y etiquetas utilizadas</translation>
+ <translation type="unfinished">Mostrar la lista de direcciones de envío y etiquetas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -605,8 +593,8 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Se ha procesado %n bloque del historial de transacciones.</numerusform>
- <numerusform>Se han procesado %n bloques del historial de transacciones.</numerusform>
+ <numerusform>Procesado %n bloque del historial de transacciones.</numerusform>
+ <numerusform>Procesado %n bloques del historial de transacciones.</numerusform>
</translation>
</message>
<message>
@@ -615,15 +603,15 @@ Solo es posible firmar con direcciones de tipo "legacy".</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">El último bloque recibido fue generado hace %1.</translation>
+ <translation type="unfinished">El último bloque recibido fue generado hace %1 horas.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Las transacciones posteriores aún no estarán visibles.</translation>
+ <translation type="unfinished">Las transacciones posteriores aún no son visibles.</translation>
</message>
<message>
<source>Warning</source>
@@ -635,7 +623,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">Al día</translation>
+ <translation type="unfinished">Actualizado al día </translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -647,27 +635,23 @@ Solo es posible firmar con direcciones de tipo "legacy".</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>
- <translation type="unfinished">Ventana de nodo</translation>
- </message>
- <message>
- <source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Abrir la consola de depuración y diagnóstico de nodos</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de recepción</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Abrir un URI de tipo "bitcoin:"</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -716,10 +700,6 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<translation type="unfinished">Ocultar los valores de la ventana de previsualización</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Monedero predeterminado</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">No hay monederos disponibles</translation>
</message>
@@ -757,7 +737,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 cliente</translation>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -771,8 +751,8 @@ Solo es posible firmar con direcciones de tipo "legacy".</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 Bitcoin.</numerusform>
- <numerusform>%n conexiones activas con la red Bitcoin.</numerusform>
+ <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -788,16 +768,16 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
<message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
- <translation type="unfinished">Desactivar la actividad de la red</translation>
+ <translation type="unfinished">Deshabilitar actividad de red</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">Habilitar la actividad de la red</translation>
+ <translation type="unfinished">Habilitar actividad de red</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -907,7 +887,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Tras la comisión:</translation>
+ <translation type="unfinished">Después de la comisión:</translation>
</message>
<message>
<source>Change:</source>
@@ -915,7 +895,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>(un)select all</source>
- <translation type="unfinished">(de)seleccionar todo</translation>
+ <translation type="unfinished">(de)selecionar todo</translation>
</message>
<message>
<source>Tree mode</source>
@@ -931,11 +911,11 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Received with label</source>
- <translation type="unfinished">Recibido con etiqueta</translation>
+ <translation type="unfinished">Recibido con dirección</translation>
</message>
<message>
<source>Received with address</source>
- <translation type="unfinished">Recibido con dirección</translation>
+ <translation type="unfinished">Recibido con etiqueta</translation>
</message>
<message>
<source>Date</source>
@@ -971,11 +951,11 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
- <translation type="unfinished">&amp;Desbloquear importe no gastado</translation>
+ <translation type="unfinished">&amp;Desbloquear lo no gastado</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -987,7 +967,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar tras comisión</translation>
+ <translation type="unfinished">Copiar después de la comisión</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -1011,7 +991,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">cambio de %1 (%2)</translation>
+ <translation type="unfinished">cambia desde %1 (%2)</translation>
</message>
<message>
<source>(change)</source>
@@ -1032,7 +1012,7 @@ Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>Create wallet failed</source>
- <translation type="unfinished">Error al crear monedero</translation>
+ <translation type="unfinished">Fallo al crear monedero</translation>
</message>
<message>
<source>Create wallet warning</source>
@@ -1076,11 +1056,11 @@ If this wallet contains any watchonly scripts, a new wallet will be created whic
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.
+ <translation type="unfinished">La migración del monedero lo convertirá en uno o más monederos basados en descriptores. Será necesario realizar una nuevo respaldo 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>
+El proceso de migración creará un respaldo del monedero antes de migrar. Este archivo de respaldo 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, el respaldo puede restaurarse con la funcionalidad "Restaurar monedero".</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -1092,7 +1072,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">La migración del monedero "%1" se realizó correctamente.</translation>
+ <translation type="unfinished">La migración del monedero "%1" se ha realizado correctamente.</translation>
</message>
<message>
<source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
@@ -1122,10 +1102,6 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
<translation type="unfinished">Advertencia al abrir monedero</translation>
</message>
<message>
- <source>default wallet</source>
- <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>
@@ -1252,7 +1228,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
<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 (se requiere para la firma externa)</translation>
</message>
</context>
<context>
@@ -1303,7 +1279,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>Could not unlock wallet.</source>
- <translation type="unfinished">No se pudo desbloquear el monedero.</translation>
+ <translation type="unfinished">No se ha podido desbloquear el monedero.</translation>
</message>
<message>
<source>New key generation failed.</source>
@@ -1362,11 +1338,11 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</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">Se almacenará al menos %1 GB de datos en este directorio, que aumentará con el tiempo.</translation>
+ <translation type="unfinished">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Se almacenará aproximadamente %1 GB de datos en este directorio.</translation>
+ <translation type="unfinished">Se almacenarán aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1562,7 +1538,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</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 (por ejemplo, IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ <translation type="unfinished">Dirección IP del proxy (p. ej., 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>
@@ -1570,7 +1546,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</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>
@@ -1611,7 +1587,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
<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>
+ <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 del 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>
@@ -1665,12 +1641,12 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
<message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">Activar controles &amp;TBPF</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">Establecer si se muestran los controles TBPF</translation>
+ <translation type="unfinished">Establecer si se muestran los controles de TBPF</translation>
</message>
<message>
<source>External Signer (e.g. hardware wallet)</source>
@@ -1774,7 +1750,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</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 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>
@@ -1803,7 +1779,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
<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 (requerido para la firma externa)</translation>
+ <translation type="unfinished">Compilado sin compatibilidad con firma externa (se requiere para la firma externa)</translation>
</message>
<message>
<source>default</source>
@@ -1853,7 +1829,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>The configuration file could not be opened.</source>
- <translation type="unfinished">El archivo de configuración no se pudo abrir.</translation>
+ <translation type="unfinished">El archivo de configuración no se ha podido abrir.</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1903,7 +1879,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>Immature:</source>
- <translation type="unfinished">Inmadura:</translation>
+ <translation type="unfinished">Inmaduro:</translation>
</message>
<message>
<source>Mined balance that has not yet matured</source>
@@ -1950,7 +1926,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
- <translation type="unfinished">Operaciones TBPF</translation>
+ <translation type="unfinished">Operaciones de TBPF</translation>
</message>
<message>
<source>Sign Tx</source>
@@ -2063,7 +2039,7 @@ El proceso de migración creará una copia de seguridad del monedero antes de mi
</message>
<message>
<source>(But no wallet is loaded.)</source>
- <translation type="unfinished">(No existe ningún monedero cargado).</translation>
+ <translation type="unfinished">(No hay ningún monedero cargado).</translation>
</message>
<message>
<source>(But this wallet cannot sign transactions.)</source>
@@ -2114,7 +2090,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Payment request file handling</source>
- <translation type="unfinished">Gestión del archivo de solicitud de pago</translation>
+ <translation type="unfinished">Gestión de archivos de solicitud de pago</translation>
</message>
</context>
<context>
@@ -2230,10 +2206,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<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>
</message>
@@ -2254,6 +2226,14 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2302,6 +2282,10 @@ 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>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2310,10 +2294,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<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>
@@ -2389,7 +2369,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>Current block height</source>
@@ -2420,6 +2400,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Sentido/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</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>
</message>
@@ -2450,7 +2434,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<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 la mempool.</translation>
+ <translation type="unfinished">Tiempo transcurrido desde que se recibió de este par una nueva transacción aceptada en el mempool.</translation>
</message>
<message>
<source>Last Send</source>
@@ -2612,6 +2596,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
@@ -2694,7 +2682,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %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">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 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>An optional label to associate with the new receiving address.</source>
@@ -2702,11 +2690,11 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</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;opcional&lt;/b&gt;.</translation>
+ <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. Deje esto vacío o en cero para no solicitar una cantidad específica.</translation>
+ <translation type="unfinished">Un importe opcional para solicitar. Déjalo vacío o ingresa cero para no solicitar un importe específico.</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>
@@ -2714,7 +2702,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
- <translation type="unfinished">Mensaje opcional asociado a la solicitud de pago que podría ser presentado al remitente </translation>
+ <translation type="unfinished">Un mensaje opcional que se adjunta a la solicitud de pago y que puede mostrarse al remitente.</translation>
</message>
<message>
<source>&amp;Create new receiving address</source>
@@ -2786,7 +2774,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>Could not unlock wallet.</source>
- <translation type="unfinished">No se pudo desbloquear el monedero.</translation>
+ <translation type="unfinished">No se ha podido desbloquear el monedero.</translation>
</message>
<message>
<source>Could not generate new %1 address</source>
@@ -2891,7 +2879,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>
@@ -2999,7 +2987,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Confirmation time target:</source>
- <translation type="unfinished">Objetivo de tiempo de confirmación</translation>
+ <translation type="unfinished">Objetivo de tiempo de confirmación:</translation>
</message>
<message>
<source>Enable Replace-By-Fee</source>
@@ -3039,7 +3027,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar tras comisión</translation>
+ <translation type="unfinished">Copiar después de la comisión</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -3203,7 +3191,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
+ <translation type="unfinished">Se ha encontrado una dirección duplicada: las direcciones solo se deben usar una vez.</translation>
</message>
<message>
<source>Transaction creation failed!</source>
@@ -3273,7 +3261,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The amount to send in the selected unit</source>
- <translation type="unfinished">El importe que se 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>
@@ -3293,7 +3281,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
+ <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>
@@ -3322,8 +3310,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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>
- <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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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 mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) 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>
@@ -3410,8 +3398,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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>
- <translation type="unfinished">La dirección introducida no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3423,7 +3411,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation type="unfinished">No se dispone de la clave privada para la dirección introducida.</translation>
+ <translation type="unfinished">La clave privada para la dirección ingresada no está disponible.</translation>
</message>
<message>
<source>Message signing failed.</source>
@@ -3435,7 +3423,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The signature could not be decoded.</source>
- <translation type="unfinished">La firma no pudo decodificarse.</translation>
+ <translation type="unfinished">La firma no ha podido decodificarse.</translation>
</message>
<message>
<source>Please check the signature and try again.</source>
@@ -3458,7 +3446,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>SplashScreen</name>
<message>
<source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(presione la tecla q para apagar y continuar después)</translation>
+ <translation type="unfinished">(Presionar q para apagar y seguir luego)</translation>
</message>
<message>
<source>press q to shutdown</source>
@@ -3470,7 +3458,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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">Hay un conflicto con una transacción de %1 confirmaciones.</translation>
+ <translation type="unfinished">Hay un conflicto con una transacción con %1 confirmaciones</translation>
</message>
<message>
<source>0/unconfirmed, in memory pool</source>
@@ -3637,7 +3625,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>TransactionDescDialog</name>
<message>
<source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Esta ventana muestra información detallada sobre la transacción</translation>
+ <translation type="unfinished">Este panel muestra una descripción detallada de la transacción</translation>
</message>
<message>
<source>Details for %1</source>
@@ -3688,19 +3676,19 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Received with</source>
- <translation type="unfinished">Recibido con</translation>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Received from</source>
- <translation type="unfinished">Recibido de</translation>
+ <translation type="unfinished">Recibida de</translation>
</message>
<message>
<source>Sent to</source>
- <translation type="unfinished">Enviado a</translation>
+ <translation type="unfinished">Enviada a</translation>
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
</message>
<message>
<source>watch-only</source>
@@ -3767,15 +3755,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Received with</source>
- <translation type="unfinished">Recibido con</translation>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Sent to</source>
- <translation type="unfinished">Enviado a</translation>
+ <translation type="unfinished">Enviada a</translation>
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
</message>
<message>
<source>Other</source>
@@ -3807,7 +3795,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Copiar &amp;ID de la transacción</translation>
+ <translation type="unfinished">Copiar &amp;identificador de transacción</translation>
</message>
<message>
<source>Copy &amp;raw transaction</source>
@@ -3849,7 +3837,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmado</translation>
+ <translation type="unfinished">Confirmada</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3872,12 +3860,16 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Dirección</translation>
</message>
<message>
+ <source>ID</source>
+ <translation type="unfinished">Identificador</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<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">Ocurrió un error al intentar guardar el historial de transacciones en %1.</translation>
+ <translation type="unfinished">Ha ocurrido un error al intentar guardar el historial de transacciones en %1.</translation>
</message>
<message>
<source>Exporting Successful</source>
@@ -3924,7 +3916,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">El archivo TBPF debe ser más pequeño de 100 MiB</translation>
+ <translation type="unfinished">El archivo de la TBPF debe ser inferior a 100 MiB</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
@@ -3939,11 +3931,11 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Fee bump error</source>
- <translation type="unfinished">Error de incremento de la comisión</translation>
+ <translation type="unfinished">Error de incremento de comisión</translation>
</message>
<message>
<source>Increasing transaction fee failed</source>
- <translation type="unfinished">Ha fallado el incremento de la comisión de transacción.</translation>
+ <translation type="unfinished">Fallo al incrementar la comisión de transacción</translation>
</message>
<message>
<source>Do you want to increase the fee?</source>
@@ -3972,32 +3964,31 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Can't draft transaction.</source>
- <translation type="unfinished">No se pudo preparar la transacción.</translation>
+ <translation type="unfinished">No se puede crear un borrador de la transacción.</translation>
</message>
<message>
<source>PSBT copied</source>
<translation type="unfinished">TBPF copiada </translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
- <translation type="unfinished">No puede firmar la transacción.</translation>
+ <translation type="unfinished">No se puede firmar la transacción.</translation>
</message>
<message>
<source>Could not commit transaction</source>
- <translation type="unfinished">No se pudo confirmar la transacción</translation>
+ <translation type="unfinished">No se ha podido confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">monedero predeterminado</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -4048,11 +4039,11 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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 de Bitcoin para rescatar o restaurar una copia de seguridad.</translation>
+ <translation type="unfinished">%s corrupto. Intenta utilizar la herramienta del monedero de Bitcoin para rescatar o restaurar un respaldo.</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>
+ <translation type="unfinished">%s no ha podido 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 ha permitido 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 ha dejado el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que ha causado 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>
@@ -4096,15 +4087,15 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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 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>
+ <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 ha obtenido 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 de tipo "legacy" 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 este monedero tipo "legacy". Asegúrate de proporcionar la frase de contraseña del monedero si está encriptada.</translation>
+ <translation type="unfinished">Error: No se pueden producir descriptores para este monedero de 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>
@@ -4112,7 +4103,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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>
+ <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>
@@ -4120,7 +4111,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se proporcionó ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
+ <translation type="unfinished">No se ha proporcionado 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>
@@ -4131,10 +4122,6 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
<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">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">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4168,7 +4155,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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 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>
+ <translation type="unfinished">Este error podría ocurrir si el monedero no se ha cerrado correctamente y se ha cargado por última vez usando una compilación con una versión más reciente de Berkeley DB. Si es así, usa el software que ha cargado 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>
@@ -4188,7 +4175,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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). Reduce 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>
@@ -4196,11 +4183,11 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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 monedero desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
+ <translation type="unfinished">Se ha proporcionado 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>
+ <translation type="unfinished">El nivel de registro específico de la categoría 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>
@@ -4243,10 +4230,6 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
<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">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 la dirección de -%s: "%s"</translation>
</message>
@@ -4260,11 +4243,11 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
+ <translation type="unfinished">No se puede escribir en el directorio de datos '%s'; verificar 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>
+ <translation type="unfinished">El valor de %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -4276,7 +4259,7 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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>
+ <translation type="unfinished">Error al leer %s. Todas las claves se han leído 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>
@@ -4292,17 +4275,31 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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>
+ <translation type="unfinished">No se ha podido 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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se ha podido eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</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>
+ <translation type="unfinished">No se ha podido 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>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el vaciado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el vaciado del archivo para deshacer al disco. Es probable que se deba a un error de E/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>
@@ -4311,22 +4308,38 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
<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>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas.</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</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>
+ <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero el proxy para conectar 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>
+ <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero no se proporciona el proxy para conectar 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>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas del monedero supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</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 un importe menor o consolidar manualmente las UTXO del monedero.</translation>
</message>
@@ -4340,18 +4353,18 @@ Ve a "Archivo &gt; Abrir monedero" para cargar uno.
</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 la UTXO. Reinicia para reanudar la descarga normal del bloque inicial o intenta cargar una instantánea diferente.</translation>
+ <translation type="unfinished">No se ha validado la instantánea de la UTXO. Reinicia para reanudar la descarga normal del bloque inicial 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á la mempool.</translation>
+ <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará el 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 inesperada tipo "legacy" en el monedero basado en descriptores. Cargando monedero %s
+ <translation type="unfinished">Se ha encontrado una entrada inesperada tipo "legacy" en el monedero basado en descriptores. Cargando monedero %s
Es posible que el monedero haya sido manipulado o creado con malas intenciones.
</translation>
@@ -4362,13 +4375,17 @@ Es posible que el monedero haya sido manipulado o creado 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 ha encontrado un descriptor desconocido. Cargando monedero %s.
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>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora del ordenador parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj del ordenador, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4378,11 +4395,23 @@ No se puede limpiar la migración fallida</translation>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
-No se puede restaurar la copia de seguridad del monedero.</translation>
+No se puede restaurar el respaldo del monedero.</translation>
+ </message>
+ <message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</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 obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se han encontrado datos assumeutxo para el blockhash indicado "%s".</translation>
</message>
<message>
<source>Block verification was interrupted</source>
- <translation type="unfinished">Se interrumpió la verificación de bloques</translation>
+ <translation type="unfinished">Se ha interrumpido la verificación de bloques</translation>
</message>
<message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
@@ -4393,20 +4422,24 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se ha encontrado un bloque corrupto que indica un posible fallo del hardware.</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>
+ <translation type="unfinished">Se ha detectado 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 asmap %s</translation>
+ <translation type="unfinished">No se ha podido 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 asmap %s</translation>
+ <translation type="unfinished">No se ha podido analizar el archivo asmap %s</translation>
</message>
<message>
<source>Disk space is too low!</source>
- <translation type="unfinished">¡El espacio en el disco es demasiado pequeño!</translation>
+ <translation type="unfinished">¡El espacio en disco es demasiado pequeño!</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
@@ -4421,6 +4454,10 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</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>
@@ -4434,7 +4471,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error initializing wallet database environment %s!</source>
- <translation type="unfinished">Error al inicializar el entorno de la base de datos del monedero %s</translation>
+ <translation type="unfinished">Error al inicializar el entorno de la base de datos del monedero %s</translation>
</message>
<message>
<source>Error loading %s</source>
@@ -4482,7 +4519,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
- <translation type="unfinished">Error: No se pudo crear el cursor en la base de datos</translation>
+ <translation type="unfinished">Error: No se ha podido crear el cursor en la base de datos</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
@@ -4494,19 +4531,19 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Error: No se puede crear un monedero solo de observación</translation>
+ <translation type="unfinished">Error: No se ha podido 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 hexadecimal (%s)</translation>
+ <translation type="unfinished">Error: Se ha recibido 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 hexadecimal (%s)</translation>
+ <translation type="unfinished">Error: Se ha recibido un valor que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
- <translation type="unfinished">Error: El pool de claves se agotó. Invoca keypoolrefill primero.</translation>
+ <translation type="unfinished">Error: El pool de claves se ha agotado. Invoca keypoolrefill primero.</translation>
</message>
<message>
<source>Error: Missing checksum</source>
@@ -4514,7 +4551,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
- <translation type="unfinished">Error: No hay direcciones %s disponibles .</translation>
+ <translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
@@ -4569,10 +4606,22 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<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 connect best block (%s).</source>
+ <translation type="unfinished">No se ha podido conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se ha podido desconectar el bloque.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se ha podido leer el bloque.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Error al rescanear el monedero durante la inicialización</translation>
</message>
@@ -4585,6 +4634,22 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se ha podido escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Error al eliminar la transacción: %s</translation>
</message>
@@ -4602,7 +4667,7 @@ No se puede 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">El bloque génesis es incorrecto o no se encontró. ¿El directorio de datos es incorrecto para la red?</translation>
+ <translation type="unfinished">El bloque génesis es incorrecto o no se ha encontrado. ¿El directorio de datos es incorrecto para la red?</translation>
</message>
<message>
<source>Initialization sanity check failed. %s is shutting down.</source>
@@ -4610,7 +4675,7 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Input not found or already spent</source>
- <translation type="unfinished">Entrada no encontrada o ya gastada</translation>
+ <translation type="unfinished">La entrada no se ha encontrado o ya se ha gastado</translation>
</message>
<message>
<source>Insufficient dbcache for block verification</source>
@@ -4662,7 +4727,7 @@ No se puede restaurar la copia de seguridad del monedero.</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>
+ <translation type="unfinished">Fallo en la escucha para conexiones entrantes (la escucha ha devuelto el error %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -4681,6 +4746,10 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Cargando monedero...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta el importe</translation>
</message>
@@ -4702,13 +4771,17 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
- <translation type="unfinished">La entrada preseleccionada no se encontró %s</translation>
+ <translation type="unfinished">La entrada preseleccionada no se ha encontrado %s</translation>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
<translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4753,6 +4826,18 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se ha hecho eco de la dirección.</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se ha hecho eco de una dirección inesperada: %s.</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante ha devuelto un error: %s.</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
@@ -4781,6 +4866,18 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s.</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s.</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s.</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
@@ -4790,13 +4887,17 @@ No se puede restaurar la copia de seguridad del monedero.</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>
+ <translation type="unfinished">El importe de la transacción es demasiado pequeño para pagar la comisión</translation>
</message>
<message>
<source>The wallet will avoid paying less than the minimum relay fee.</source>
<translation type="unfinished">El monedero evitará pagar menos que la comisión mínima de retransmisión. </translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4837,12 +4938,8 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<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>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">No se puede establecer un enlace a %s en este equipo (bind devolvió el error %s)</translation>
+ <translation type="unfinished">No se puede establecer un enlace a %s en este equipo (bind ha devuelto el error %s)</translation>
</message>
<message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
@@ -4901,6 +4998,10 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</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>
@@ -4942,11 +5043,11 @@ No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Settings file could not be read</source>
- <translation type="unfinished">El archivo de configuración no puede leerse</translation>
+ <translation type="unfinished">El archivo de configuración no pudo leerse</translation>
</message>
<message>
<source>Settings file could not be written</source>
- <translation type="unfinished">El archivo de configuración no puede escribirse</translation>
+ <translation type="unfinished">El archivo de configuración no ha podido escribirse</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts
index 0f4dda3755..419d9a0437 100644
--- a/src/qt/locale/bitcoin_es_CL.ts
+++ b/src/qt/locale/bitcoin_es_CL.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copiar la dirección actualmente seleccionada al sistema de portapapeles</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -177,6 +177,14 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Introducir la vieja contraseña y la nueva contraseña para la billetera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</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 codificando tu billetera no garantiza mantener a salvo tus bitcoins en caso de tener virus en el computador.</translation>
</message>
@@ -264,7 +272,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</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">Se ha producido un error interno. 1%1 Se intentará continuar de manera segura. Este es un error inesperado que se puede reportar como se describe a continuación.</translation>
+ <translation type="unfinished">Se ha producido un error interno. %1 Se intentará continuar de manera segura. Este es un error inesperado que se puede reportar como se describe a continuación.</translation>
</message>
</context>
<context>
@@ -281,7 +289,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 todavía no ha terminado de forma segura...</translation>
</message>
<message>
<source>unknown</source>
@@ -390,7 +398,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera predeterminada</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -487,20 +499,32 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Encripta las claves privadas que pertenecen a tu billetera</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Copia de seguridad del monedero</translation>
+ </message>
+ <message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <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">Firme mensajes con sus direcciones de Bitcoin para demostrar que los posee</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <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">Verifique los mensajes para asegurarse de que fueron firmados con las direcciones de Bitcoin especificadas</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar PSBT desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar PSBT desde el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -516,7 +540,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 todos los monederos...</translation>
+ <translation type="unfinished">Cerrar Todos los Monederos...</translation>
</message>
<message>
<source>&amp;File</source>
@@ -536,7 +560,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -552,7 +576,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -614,28 +638,24 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Cargar PSBT 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>
- </message>
- <message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</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 del nodo</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de recepción</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Bitcoin: abrir URI</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -661,7 +681,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 todos los monederos</translation>
+ <translation type="unfinished">Cerrar todas las billeteras</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -676,30 +696,18 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<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>
<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>
- <message>
<source>No wallets available</source>
<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 de la billetera</translation>
+ <translation type="unfinished">Datos del monedero </translation>
</message>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Cargar copia de seguridad de billetera</translation>
+ <translation type="unfinished">Cargar copia de seguridad del monedero</translation>
</message>
<message>
<source>Restore Wallet</source>
@@ -709,7 +717,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre del monedero</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
<source>&amp;Window</source>
@@ -729,20 +737,20 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">M&amp;ostrar</translation>
+ <translation type="unfinished">&amp;Mostrar</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 conexiones activas con la red Bitcoin</numerusform>
- <numerusform>%n conexiones activas con la red Bitcoin </numerusform>
+ <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de 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">Hacer clic para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -752,7 +760,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
- <translation type="unfinished">Deshabilitar actividad de red</translation>
+ <translation type="unfinished">Desactivar la actividad de la red</translation>
</message>
<message>
<source>Enable network activity</source>
@@ -761,7 +769,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -821,11 +829,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">La generación de la clave HD está &lt;b&gt; activada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La generación de la clave HD está &lt;b&gt; activada &lt;/b&gt;</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>
@@ -833,11 +841,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</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">La billetera está &lt;b&gt; encriptada &lt;/ b&gt; y actualmente &lt;b&gt; desbloqueada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt; encriptada &lt;/b&gt; y actualmente &lt;b&gt; desbloqueada &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">La billetera está &lt;b&gt; encriptada &lt;/ b&gt; y actualmente está &lt;b&gt; bloqueada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt; encriptada &lt;/b&gt; y actualmente está &lt;b&gt; bloqueada &lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -935,7 +943,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">B&amp;loquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -1032,7 +1040,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</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>
+ <translation type="unfinished">Estas seguro de wue 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.
@@ -1082,10 +1090,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Advertencia sobre crear monedero</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir billetera</translation>
@@ -2158,6 +2162,14 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2175,7 +2187,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Wallet: </source>
- <translation type="unfinished">Monedero:</translation>
+ <translation type="unfinished">Monedero: </translation>
</message>
<message>
<source>&amp;Reset</source>
@@ -2202,6 +2214,10 @@ 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>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2210,10 +2226,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
@@ -2289,7 +2301,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>Current block height</source>
@@ -2316,6 +2328,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</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 mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2504,6 +2520,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Actividad de red deshabilitada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
@@ -2589,7 +2609,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>
@@ -2850,7 +2870,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">Entradas...</translation>
+ <translation type="unfinished">Entradas…</translation>
</message>
<message>
<source>Choose…</source>
@@ -3180,8 +3200,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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>
- <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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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 mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) 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>
@@ -3264,8 +3284,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Por favor, revisa la dirección e intenta nuevamente.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La dirección ingresada no corresponde a una llave válida.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3825,9 +3845,8 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">PSBT copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3838,12 +3857,12 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -3863,7 +3882,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 de la billetera</translation>
+ <translation type="unfinished">Datos del monedero </translation>
</message>
<message>
<source>Backup Failed</source>
@@ -3977,10 +3996,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>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">Verifica que la fecha y hora de la computadora 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">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4089,10 +4104,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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">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 direccion: '%s'</translation>
</message>
@@ -4105,10 +4116,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <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>
@@ -4141,6 +4148,12 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se ha podido eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</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>
@@ -4149,6 +4162,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/O.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/O.</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>
@@ -4157,6 +4178,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</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>
@@ -4173,6 +4202,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas del monedero supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</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>
@@ -4215,6 +4252,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora del ordenador parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj del ordenador, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4227,10 +4268,26 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</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 obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se han encontrado datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se ha encontrado un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Corrupción de base de datos de bloques detectada.</translation>
</message>
@@ -4259,6 +4316,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>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</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>
@@ -4408,10 +4469,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<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 connect best block (%s).</source>
+ <translation type="unfinished">No se ha podido conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se ha podido desconectar el bloque.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se ha podido leer el bloque.</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>
@@ -4424,6 +4497,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se ha podido escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
</message>
@@ -4520,6 +4609,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta la cantidad</translation>
</message>
@@ -4548,6 +4641,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Entrada preseleccionada no solucionable %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4592,6 +4689,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante ha devuelto un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Firma de transacción fallida</translation>
</message>
@@ -4620,6 +4729,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente esta disponible desde %s.</translation>
</message>
@@ -4636,6 +4757,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La billetera no permitirá pagar menos que la fee de transmisión mínima (relay fee).</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4676,10 +4801,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Transacción muy 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>
- </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>
</message>
@@ -4740,6 +4861,10 @@ 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>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
diff --git a/src/qt/locale/bitcoin_es_CO.ts b/src/qt/locale/bitcoin_es_CO.ts
index 1451f88104..14fbc9d056 100644
--- a/src/qt/locale/bitcoin_es_CO.ts
+++ b/src/qt/locale/bitcoin_es_CO.ts
@@ -51,7 +51,7 @@
</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>
+ <translation type="unfinished">Elige la dirección en la que se recibirán monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -65,7 +65,7 @@
<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 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>
+Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -184,6 +184,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Ingresa la antigua frase de contraseña y la nueva frase de contraseña para la billetera.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</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>
@@ -225,7 +233,7 @@ Solo es posible firmar con direcciones de tipo legacy.</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>
+ <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 es correcto, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -259,7 +267,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<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">El archivo de configuración %1 puede estar dañado o no ser válido.</translation>
</message>
<message>
<source>Runaway exception</source>
@@ -292,13 +300,17 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 aún no se cerró de forma segura...</translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">"%1" integrado</translation>
+ </message>
+ <message>
<source>Default system font "%1"</source>
<translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
</message>
@@ -397,7 +409,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera predeterminada</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -430,7 +446,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Show information about %1</source>
- <translation type="unfinished">Mostrar Información sobre %1</translation>
+ <translation type="unfinished">Mostrar información sobre %1</translation>
</message>
<message>
<source>About &amp;Qt</source>
@@ -487,7 +503,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Options…</source>
- <translation type="unfinished">&amp;Opciones…</translation>
+ <translation type="unfinished">&amp;Opciones...</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
@@ -495,15 +511,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Encriptar las claves privadas que pertenecen a la billetera</translation>
+ <translation type="unfinished">Encriptar las llaves privadas que pertenecen a tu 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>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
</message>
<message>
<source>Sign &amp;message…</source>
@@ -511,7 +527,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 mensajes con tus direcciones de Bitcoin para demostrar que te pertenecen</translation>
+ <translation type="unfinished">Firmar un mensaje para provar que usted es dueño de esta dirección</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -519,11 +535,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 para asegurarte de que estén firmados con direcciones de Bitcoin concretas</translation>
+ <translation type="unfinished">Verificar mensajes comprobando que están firmados con direcciones Bitcoin concretas</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar TBPF desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar TBPF desde el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -531,11 +547,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>
@@ -559,7 +575,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -575,7 +591,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -583,11 +599,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de envío usadas</translation>
+ <translation type="unfinished">Mostrar la lista de direcciones de envío y etiquetas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de recepción usadas</translation>
+ <translation type="unfinished">Mostrar la lista de direcciones de recepción y etiquetas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -614,7 +630,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Las transacciones posteriores aún no están visibles.</translation>
+ <translation type="unfinished">Las transacciones posteriores aún no estarán visibles.</translation>
</message>
<message>
<source>Warning</source>
@@ -654,7 +670,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de destino</translation>
+ <translation type="unfinished">&amp;Direcciones de recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
@@ -707,10 +723,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<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 billeteras disponibles</translation>
</message>
@@ -732,7 +744,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>
@@ -748,7 +760,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 cliente</translation>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -938,7 +950,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmada</translation>
+ <translation type="unfinished">Confirmado</translation>
</message>
<message>
<source>Copy amount</source>
@@ -1087,11 +1099,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
+ <translation type="unfinished">Los scripts solo de observación se migraron a una nueva billetera llamada "%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>
+ <translation type="unfinished">Los scripts solucionables pero no de observación se migraron a una nueva billetera llamada "%1".</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1113,10 +1125,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Advertencia al abrir billetera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir billetera</translation>
@@ -1353,11 +1361,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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">Se almacenará al menos %1 GB de información en este directorio, que aumentará con el tiempo.</translation>
+ <translation type="unfinished">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Se almacenará aproximadamente %1 GB de información en este directorio.</translation>
+ <translation type="unfinished">Se almacenarán aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1565,7 +1573,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Font in the Overview tab: </source>
- <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ <translation type="unfinished">Fuente en la pestaña "Vista general":</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
@@ -2217,10 +2225,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<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">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 ubicación no predeterminada del directorio de bloques, usa la opción "%1".</translation>
</message>
@@ -2241,6 +2245,14 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
@@ -2289,6 +2301,10 @@ 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>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2297,10 +2313,6 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<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>
@@ -2407,6 +2419,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</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 mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2599,6 +2615,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ejecutar comando sin ninguna billetera</translation>
</message>
@@ -2646,7 +2666,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>To</source>
- <translation type="unfinished">Para</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>From</source>
@@ -3064,7 +3084,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -3121,7 +3141,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>%1 from wallet '%2'</source>
- <translation type="unfinished">%1 desde monedero "%2"</translation>
+ <translation type="unfinished">%1 desde billetera "%2"</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
@@ -3194,7 +3214,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Transaction creation failed!</source>
- <translation type="unfinished">¡Fallo al crear la transacción!</translation>
+ <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>
@@ -3284,7 +3304,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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">Un mensaje que se adjuntó al bitcoin: URI que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por 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>
@@ -3309,8 +3329,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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>
- <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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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 mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) 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>
@@ -3397,8 +3417,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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>
- <translation type="unfinished">La dirección ingresada no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3494,7 +3514,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Source</source>
- <translation type="unfinished">Fuente</translation>
+ <translation type="unfinished">Origen</translation>
</message>
<message>
<source>Generated</source>
@@ -3510,7 +3530,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>To</source>
- <translation type="unfinished">Para</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>own address</source>
@@ -3915,7 +3935,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">El archivo TBPF debe ser más pequeño de 100 MiB</translation>
+ <translation type="unfinished">El archivo de la TBPF debe ser más pequeño de 100 MiB</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
@@ -3970,9 +3990,8 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">TBPF copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3983,12 +4002,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera predeterminada</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -4122,10 +4141,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<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>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">Verifica que la fecha y hora de la computadora 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">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
@@ -4234,10 +4249,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<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">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 la dirección de -%s: "%s"</translation>
</message>
@@ -4250,10 +4261,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <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">El valor establecido para %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
@@ -4286,6 +4293,12 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se pudo eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</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>
@@ -4294,6 +4307,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<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>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/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>
@@ -4302,6 +4323,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<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>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</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>
@@ -4318,6 +4347,14 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Falló el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas de la billetera supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</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 un importe menor o consolidar manualmente las UTXO de la billetera.</translation>
</message>
@@ -4342,7 +4379,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
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 basada en descriptores. Cargando billetera%s
+ <translation type="unfinished">Se encontró una entrada inesperada tipo "legacy" en la billetera basada en descriptores. Cargando billetera%s
Es posible que la billetera haya sido manipulada o creada con malas intenciones.
</translation>
@@ -4360,6 +4397,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora de la computadora parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj de la computadora, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4372,6 +4413,18 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</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 obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se encontraron datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
@@ -4384,6 +4437,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se encontró un bloque corrupto que indica un posible fallo del hardware.</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>
@@ -4412,6 +4469,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>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</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>
@@ -4533,7 +4594,7 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <translation type="unfinished">Error: No se pudo leer el registro del mejor localizador de bloques de la billetera.</translation>
</message>
<message>
<source>Error: Unable to remove watchonly address book data</source>
@@ -4545,26 +4606,37 @@ No se puede restaurar la copia de seguridad de la 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>
+ <translation type="unfinished">Error: No se pudo escribir el registro del mejor localizador de bloques de la billetera solucionable.</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>
+ <translation type="unfinished">Error: No se pudo escribir el registro del mejor localizador de bloques de la billetera 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 la billetera 1%s
- </translation>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera %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 connect best block (%s).</source>
+ <translation type="unfinished">No se pudo conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se pudo desconectar el bloque.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se pudo leer el bloque.</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>
@@ -4577,8 +4649,24 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se pudo escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
- <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ <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>
@@ -4673,6 +4761,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta el importe</translation>
</message>
@@ -4701,6 +4793,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">La poda no se puede configurar con un valor negativo.</translation>
</message>
@@ -4745,6 +4841,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante ha devuelto un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
@@ -4773,6 +4881,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
@@ -4789,6 +4909,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La billetera evitará pagar menos que la comisión mínima de retransmisión.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este es un software experimental.</translation>
</message>
@@ -4829,10 +4953,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<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>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">No se puede establecer un enlace a %s en esta computadora (bind devolvió el error %s)</translation>
</message>
@@ -4893,12 +5013,16 @@ 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>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</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>Wallet file creation failed: %s</source>
- <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ <translation type="unfinished">Error al crear el archivo de la billetera: %s</translation>
</message>
<message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
@@ -4910,11 +5034,11 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <translation type="unfinished">Error: No se puede agregar la transacción solo de observación %s a la billetera solo de observación</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
- <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ <translation type="unfinished">Error: No se pudieron eliminar las transacciones solo de observación</translation>
</message>
<message>
<source>User Agent comment (%s) contains unsafe characters.</source>
diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts
index b49fe13730..47008084b8 100644
--- a/src/qt/locale/bitcoin_es_DO.ts
+++ b/src/qt/locale/bitcoin_es_DO.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Click derecho para editar la dirección o etiqueta</translation>
+ <translation type="unfinished">Hacer clic derecho para editar la dirección o etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -11,11 +11,11 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">&amp;Nuevo</translation>
+ <translation type="unfinished">&amp;Nueva</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copie las direcciones seleccionadas actualmente al portapapeles del sistema</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</translation>
</message>
<message>
<source>&amp;Copy</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">Borrar las direcciones seleccionadas recientemente de la lista</translation>
+ <translation type="unfinished">Eliminar la dirección seleccionada de la lista</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Introduzca una dirección o etiqueta que buscar</translation>
+ <translation type="unfinished">Ingresar una dirección o etiqueta para buscar</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exportar los datos en la pestaña actual a un archivo</translation>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -47,32 +47,33 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Escoja la direccion a enviar las monedas</translation>
+ <translation type="unfinished">Elige la dirección a la que se enviarán monedas</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Elige la dirección para recibir monedas</translation>
+ <translation type="unfinished">Elige la dirección en la que se recibirán monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
- <translation type="unfinished">Escoger</translation>
+ <translation type="unfinished">&amp;Seleccionar</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>
+ <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 de Bitcoin para recibir pagos. Utilice el botón 'Crear nueva dirección de recepción' en la pestaña Recibir para crear nuevas direcciones. La firma solo es posible con direcciones del tipo 'legacy'</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>
- <translation type="unfinished">Copiar dirección</translation>
+ <translation type="unfinished">&amp;Copiar dirección</translation>
</message>
<message>
<source>Copy &amp;Label</source>
- <translation type="unfinished">Copiar &amp;Etiqueta</translation>
+ <translation type="unfinished">Copiar &amp;etiqueta</translation>
</message>
<message>
<source>&amp;Edit</source>
@@ -90,12 +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">Tuvimos un problema al guardar la dirección en la lista %1. Intenta de Nuevo.</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">Recepción de direcciones - %1
-</translation>
+ <translation type="unfinished">Direcciones de recepción - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -106,11 +110,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>AddressTableModel</name>
<message>
<source>Label</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">Etiqueta</translation>
</message>
<message>
<source>Address</source>
- <translation type="unfinished">Direccion</translation>
+ <translation type="unfinished">Dirección</translation>
</message>
<message>
<source>(no label)</source>
@@ -121,11 +125,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation type="unfinished">Diálogo contraseña</translation>
+ <translation type="unfinished">Diálogo de frase de contraseña</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Ingresa frase de contraseña</translation>
+ <translation type="unfinished">Ingresar la frase de contraseña</translation>
</message>
<message>
<source>New passphrase</source>
@@ -133,100 +137,107 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Repetir nueva frase de contraseña</translation>
+ <translation type="unfinished">Repetir la nueva frase de contraseña</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Mostrar frase de contraseña</translation>
+ <translation type="unfinished">Mostrar la frase de contraseña</translation>
</message>
<message>
<source>Encrypt wallet</source>
- <translation type="unfinished">Cifrar monedero</translation>
+ <translation type="unfinished">Encriptar billetera</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Esta operación necesita su frase de contraseña de la billetera para desbloquearla.
-</translation>
+ <translation type="unfinished">Esta operación requiere la frase de contraseña de la billetera para desbloquearla.</translation>
</message>
<message>
<source>Unlock wallet</source>
- <translation type="unfinished">Desbloquear monedero</translation>
+ <translation type="unfinished">Desbloquear billetera</translation>
</message>
<message>
<source>Change passphrase</source>
- <translation type="unfinished">Cambiar frase secreta</translation>
+ <translation type="unfinished">Cambiar frase de contraseña</translation>
</message>
<message>
<source>Confirm wallet encryption</source>
- <translation type="unfinished">Confirmar cifrado de billetera</translation>
+ <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">Atención: Si cifra su monedero y pierde la contraseña, perderá ¡&lt;b&gt;TODOS SUS BITCOINS&lt;/b&gt;!</translation>
+ <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">¿Está seguro que desea cifrar su monedero?</translation>
+ <translation type="unfinished">¿Seguro quieres encriptar la billetera?</translation>
</message>
<message>
<source>Wallet encrypted</source>
- <translation type="unfinished">Monedero cifrado</translation>
+ <translation type="unfinished">Billetera encriptada</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 frase de contraseña para la billetera&lt;br/&gt;. Utilice una frase de cont&lt;b&gt;raseñade diez o más caracteres&lt;/b&gt; aleatorios o och&lt;b&gt;o o más palab&lt;/b&gt;ras.</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>
- <translation type="unfinished">Ingrese la frase de contraseña antigua y la nueva frase de contraseña para la billetera</translation>
+ <translation type="unfinished">Ingresa la antigua frase de contraseña y la nueva frase de contraseña para la billetera.</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</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 billetera no puede proteger completamente tus bitcoins de ser robados por malware que infecte tu computadora.</translation>
+ <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 ser cifrada</translation>
+ <translation type="unfinished">Billetera para encriptar</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 billetera está a punto de encriptarse.</translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Tu monedero está ahora cifrado</translation>
+ <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 que haya realizado previamente de su archivo de monedero debe reemplazarse con el nuevo archivo de monedero cifrado. Por razones de seguridad, las copias de seguridad previas del archivo de monedero no cifradas serán inservibles en cuanto comience a usar el nuevo monedero cifrado.</translation>
+ <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">Ha fallado el cifrado del monedero</translation>
+ <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">Ha fallado el cifrado del monedero debido a un error interno. El monedero no ha sido cifrado.</translation>
+ <translation type="unfinished">El encriptado de la billetera falló debido a un error interno. La billetera no se encriptó.</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Las contraseñas no coinciden.</translation>
+ <translation type="unfinished">Las frases de contraseña proporcionadas no coinciden.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">Ha fallado el desbloqueo del monedero</translation>
+ <translation type="unfinished">Falló el desbloqueo de la billetera</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 el cifrado de la billetera 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 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>
+ <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 es correcto, 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">Se ha cambiado correctamente la contraseña del monedero.</translation>
+ <translation type="unfinished">La frase de contraseña de la billetera se cambió correctamente.</translation>
</message>
<message>
<source>Passphrase change failed</source>
@@ -238,7 +249,7 @@ 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">Aviso: ¡La tecla de bloqueo de mayúsculas está activada!</translation>
+ <translation type="unfinished">Advertencia: ¡Las mayúsculas están activadas!</translation>
</message>
</context>
<context>
@@ -256,11 +267,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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">El archivo de configuración %1 puede estar dañado o no ser válido.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Excepción fuera de control</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Se ha producido un error garrafal. %1Ya no podrá continuar de manera segura y abandonará.</translation>
+ <translation type="unfinished">Se produjo un error fatal. %1 ya no puede continuar de manera segura y se cerrará.</translation>
</message>
<message>
<source>Internal error</source>
@@ -268,7 +283,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">Un error interno ocurrió. %1 intentará continuar. Este es un error inesperado que puede ser reportado de las formas que se muestran debajo,</translation>
+ <translation type="unfinished">Se produjo un error interno. %1 intentará continuar de manera segura. Este es un error inesperado que se puede reportar como se describe a continuación.</translation>
</message>
</context>
<context>
@@ -281,17 +296,21 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ <translation type="unfinished">Se produjo un error fatal. Comprueba que el archivo de configuración soporte escritura o intenta ejecutar el programa con -nosettings.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 aún no se cerró de forma segura...</translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">"%1" integrado</translation>
+ </message>
+ <message>
<source>Default system font "%1"</source>
<translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
</message>
@@ -301,11 +320,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Monto</translation>
+ <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">Ingresar una dirección de Bitcoin (por ejemplo, %1)</translation>
</message>
<message>
<source>Unroutable</source>
@@ -319,7 +338,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Outbound</source>
<extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">Salida</translation>
+ <translation type="unfinished">Saliente</translation>
</message>
<message>
<source>Full Relay</source>
@@ -329,7 +348,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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 bloque</translation>
+ <translation type="unfinished">Retransmisión de bloques</translation>
</message>
<message>
<source>Address Fetch</source>
@@ -390,7 +409,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -399,7 +422,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show general overview of wallet</source>
- <translation type="unfinished">Mostrar visión general de la billetera</translation>
+ <translation type="unfinished">Muestra una vista general de la billetera</translation>
</message>
<message>
<source>&amp;Transactions</source>
@@ -407,15 +430,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Browse transaction history</source>
- <translation type="unfinished">Buscar historial de transacciones</translation>
+ <translation type="unfinished">Explora el historial de transacciones</translation>
</message>
<message>
<source>E&amp;xit</source>
- <translation type="unfinished">S&amp;alir</translation>
+ <translation type="unfinished">&amp;Salir</translation>
</message>
<message>
<source>Quit application</source>
- <translation type="unfinished">Quitar aplicación</translation>
+ <translation type="unfinished">Salir del programa</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;Acerca de %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Mostrar Información sobre %1</translation>
</message>
<message>
<source>About &amp;Qt</source>
@@ -423,27 +454,44 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show information about Qt</source>
- <translation type="unfinished">Mostrar información acerca de Qt</translation>
+ <translation type="unfinished">Mostrar información sobre Qt</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Modificar las opciones de configuración para %1</translation>
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Crear monedero nuevo</translation>
+ <translation type="unfinished">Crear una nueva billetera</translation>
</message>
<message>
<source>&amp;Minimize</source>
- <translation type="unfinished">Minimizar</translation>
+ <translation type="unfinished">&amp;Minimizar</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">Actividad de red deshabilitada.</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">Proxy &lt;b&gt;habilitado&lt;/b&gt;: %1</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 frase secreta usada para la encriptació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>
@@ -455,27 +503,39 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Cifrar monedero</translation>
+ <translation type="unfinished">&amp;Encriptar billetera…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">Encriptar las llaves privadas que pertenecen a tu billetera</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera...</translation>
+ </message>
+ <message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <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">Firma mensajes con tus direcciones Bitcoin para probar que eres dueño de ellas</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <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 mensajes para asegurar que estaban firmados con direcciones Bitcoin especificas</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 el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -483,15 +543,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Cerrar monedero...</translation>
+ <translation type="unfinished">Cerrar billetera...</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Crear monedero...</translation>
+ <translation type="unfinished">Crear billetera...</translation>
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">Cerrar todos los monederos...</translation>
+ <translation type="unfinished">Cerrar todas las billeteras...</translation>
</message>
<message>
<source>&amp;File</source>
@@ -511,7 +571,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -527,7 +587,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -586,35 +646,39 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Cargar PSBT 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 TBPF desde el &amp;portapapeles...</translation>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</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 del nodo</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de recepción</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Bitcoin: abrir URI</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Abrir monedero</translation>
+ <translation type="unfinished">Abrir billetera</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Abrir una cartera</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Cerrar cartera</translation>
</message>
<message>
<source>Restore Wallet…</source>
@@ -628,7 +692,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Cerrar todos los monederos</translation>
+ <translation type="unfinished">Cerrar todas las billeteras</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -639,20 +703,8 @@ Signing is only possible with addresses of the type 'legacy'.</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">Monederos no disponibles</translation>
+ <translation type="unfinished">No hay billeteras disponibles</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -672,15 +724,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre del monedero</translation>
+ <translation type="unfinished">Nombre de la billetera </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>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -688,20 +744,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">M&amp;ostrar</translation>
+ <translation type="unfinished">&amp;Mostrar</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 conexiones activas con la red Bitcoin</numerusform>
- <numerusform>%n conexiones activas con la red Bitcoin </numerusform>
+ <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de 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">Hacer clic para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -720,7 +776,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -728,7 +784,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
+ <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>
@@ -761,7 +817,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Label: %1
</source>
- <translation type="unfinished">Etiqueta: %1
+ <translation type="unfinished">Etiqueta %1
</translation>
</message>
<message>
@@ -784,7 +840,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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 clave HD está &lt;b&gt;deshabilitada&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -792,11 +848,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">La billetera está encriptada y desbloqueada recientemente</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt;encriptada&lt;/b&gt; y actualmente &lt;b&gt;desbloqueda&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">La billetera está encriptada y bloqueada recientemente</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt;encriptada&lt;/b&gt; y actualmente &lt;b&gt;bloqueda&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -807,14 +863,14 @@ 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">Unidad en la que se muestran las cantidades. 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>
@@ -822,7 +878,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Amount:</source>
- <translation type="unfinished">Monto:</translation>
+ <translation type="unfinished">Importe:</translation>
</message>
<message>
<source>Fee:</source>
@@ -894,7 +950,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">B&amp;loquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -944,6 +1000,11 @@ 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>
@@ -970,12 +1031,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -986,7 +1047,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
+ <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.
@@ -995,10 +1056,10 @@ If this wallet contains any solvable but not watched scripts, a different and ne
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.
+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 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>
+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>
@@ -1014,11 +1075,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
+ <translation type="unfinished">Los scripts solo de observación se migraron a una nueva billetera llamada "%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>
+ <translation type="unfinished">Los scripts solucionables pero no de observación se migraron a una nueva billetera llamada "%1".</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1032,22 +1093,22 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<context>
<name>OpenWalletActivity</name>
<message>
- <source>Open wallet warning</source>
- <translation type="unfinished">Advertencia sobre crear monedero</translation>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">Fallo al abrir billetera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera por defecto</translation>
+ <source>Open wallet warning</source>
+ <translation type="unfinished">Advertencia al abrir billetera</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 billetera</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 billetera &lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
</context>
<context>
@@ -1081,35 +1142,43 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<context>
<name>WalletController</name>
<message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Cerrar billetera</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>
- <translation type="unfinished">Cerrar todos los monederos</translation>
+ <translation type="unfinished">Cerrar todas las billeteras</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>
+ </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>
+ <translation type="unfinished">Escribe un nombre y, si quieres, activa las opciones avanzadas.</translation>
</message>
<message>
<source>Wallet Name</source>
- <translation type="unfinished">Nombre del monedero</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
<source>Wallet</source>
@@ -1117,7 +1186,19 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 billetera</translation>
+ </message>
+ <message>
+ <source>Advanced Options</source>
+ <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">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>
@@ -1125,11 +1206,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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">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 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>
@@ -1142,7 +1227,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1157,11 +1242,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 de la lista de direcciones. Esta puede ser modificada solo para el envío de direcciones.</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>
@@ -1181,22 +1266,30 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 válida.</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>
- <translation type="unfinished">No se pudo desbloquear el monedero.</translation>
+ <translation type="unfinished">No se pudo desbloquear la billetera.</translation>
</message>
<message>
<source>New key generation failed.</source>
- <translation type="unfinished">Ha fallado la generación de la nueva clave.</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>
@@ -1204,15 +1297,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 deseas 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">Ruta de acceso existente, pero 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>
@@ -1227,15 +1320,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>(de %n GB necesario)</numerusform>
+ <numerusform>(de %n GB necesarios)</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 necesario para completar la cadena)</numerusform>
+ <numerusform>(%n GB necesarios para completar la cadena)</numerusform>
</translation>
</message>
<message>
@@ -1243,8 +1336,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Elegir directorio de datos</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">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán 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án aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1260,27 +1357,35 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished">El monedero también se almacenará 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: Directorio de datos especificado "%1" no puede 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 esta la primera vez que se ejecuta el programa, puedes escoger donde %1 almacenará los 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">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">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>
@@ -1288,15 +1393,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 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>
- <translation type="unfinished">Usar el directorio de datos por defecto</translation>
+ <translation type="unfinished">Usar el directorio de datos predeterminado</translation>
</message>
<message>
<source>Use a custom data directory:</source>
- <translation type="unfinished">Usa un directorio de datos personalizado:</translation>
+ <translation type="unfinished">Usar un directorio de datos personalizado:</translation>
</message>
</context>
<context>
@@ -1315,38 +1420,69 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 apagues la computadora hasta que desaparezca esta ventana.</translation>
+ </message>
+</context>
+<context>
<name>ModalOverlay</name>
<message>
<source>Form</source>
- <translation type="unfinished">Desde</translation>
+ <translation type="unfinished">Formulario</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 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á si se intenta gastar bitcoins afectados por las transacciones que aún no se muestran.</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">Numero de bloques pendientes</translation>
+ <translation type="unfinished">Número de bloques restantes</translation>
</message>
<message>
<source>Unknown…</source>
<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>
<message>
+ <source>Progress</source>
+ <translation type="unfinished">Progreso</translation>
+ </message>
+ <message>
<source>Progress increase per hour</source>
- <translation type="unfinished">Incremento del progreso por hora</translation>
+ <translation type="unfinished">Avance del progreso por hora</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">Tiempo estimado restante hasta la sincronización</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <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 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>
@@ -1362,7 +1498,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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 portapapeles</translation>
+ <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
</message>
</context>
<context>
@@ -1372,16 +1508,28 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Opciones</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">&amp;Principal</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>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
- <translation type="unfinished">&amp;Iniciar %1 al iniciar el sistema</translation>
+ <translation type="unfinished">&amp;Iniciar %1 al iniciar sesión en el sistema</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">Al activar el modo pruning, 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>
+ <translation type="unfinished">Al activar el 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>Size of &amp;database cache</source>
+ <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>
@@ -1389,15 +1537,19 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 (ej. 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 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">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>
+ <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>
+ <translation type="unfinished">Fuente en la pestaña "Vista general":</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
@@ -1413,7 +1565,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Reset all client options to default.</source>
- <translation type="unfinished">Restablecer todas las opciones del cliente a las predeterminadas.</translation>
+ <translation type="unfinished">Restablecer todas las opciones del cliente a los valores predeterminados.</translation>
</message>
<message>
<source>&amp;Reset Options</source>
@@ -1439,7 +1591,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1448,7 +1600,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
+ <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>
@@ -1457,12 +1609,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>W&amp;allet</source>
- <translation type="unfinished">Billetera</translation>
+ <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>
+ <translation type="unfinished">Si se resta o no la comisión del importe por defecto.</translation>
</message>
<message>
<source>Subtract &amp;fee from amount by default</source>
@@ -1474,8 +1626,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Experto</translation>
</message>
<message>
+ <source>Enable coin &amp;control features</source>
+ <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 deshabilita 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 cómo se calcula su saldo.</translation>
+ <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>
@@ -1484,12 +1640,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1501,11 +1657,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 si el router admite UPnP y está activado.</translation>
+ <translation type="unfinished">Abrir automáticamente el puerto del cliente de Bitcoin en el router. Esto funciona solo cuando tu router es compatible con UPnP y está habilitado.</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 usando &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>
@@ -1516,16 +1672,24 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
</message>
<message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">Aceptar conexiones externas.</translation>
+ </message>
+ <message>
<source>Allow incomin&amp;g connections</source>
- <translation type="unfinished">Permitir conexiones entrantes</translation>
+ <translation type="unfinished">&amp;Permitir conexiones entrantes</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
- <translation type="unfinished">Conectar a la red de Bitcoin a través de un proxy SOCKS5.</translation>
+ <translation type="unfinished">Conectarse a la red de Bitcoin a través de un proxy SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">&amp;Conectarse a través del proxy SOCKS5 (proxy predeterminado):</translation>
</message>
<message>
<source>Proxy &amp;IP:</source>
- <translation type="unfinished">Dirección &amp;IP del proxy:</translation>
+ <translation type="unfinished">&amp;IP del proxy:</translation>
</message>
<message>
<source>&amp;Port:</source>
@@ -1533,11 +1697,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Port of the proxy (e.g. 9050)</source>
- <translation type="unfinished">Puerto del servidor proxy (ej. 9050)</translation>
+ <translation type="unfinished">Puerto del proxy (p. ej., 9050)</translation>
</message>
<message>
<source>Used for reaching peers via:</source>
- <translation type="unfinished">Utilizado para llegar a los compañeros a través de:</translation>
+ <translation type="unfinished">Usado para conectarse con pares a través de:</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -1553,35 +1717,35 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
- <translation type="unfinished">Minimizar la ventana a la bandeja de iconos del sistema.</translation>
+ <translation type="unfinished">Mostrar solo un ícono de bandeja después de minimizar la ventana.</translation>
</message>
<message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation type="unfinished">&amp;Minimizar a la bandeja en vez de a 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;Interfaz</translation>
+ <translation type="unfinished">&amp;Visualización</translation>
</message>
<message>
<source>User Interface &amp;language:</source>
- <translation type="unfinished">I&amp;dioma de la interfaz de usuario</translation>
+ <translation type="unfinished">&amp;Idioma de la interfaz de usuario:</translation>
</message>
<message>
<source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
- <translation type="unfinished">El idioma de la interfaz de usuario puede establecerse aquí. Esta configuración tendrá efecto después de reiniciar %1.</translation>
+ <translation type="unfinished">El idioma de la interfaz de usuario puede establecerse aquí. Esta configuración surtirá efecto después de reiniciar %1.</translation>
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
- <translation type="unfinished">Mostrar las cantidades en la &amp;unidad:</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>
@@ -1593,28 +1757,24 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Whether to show coin control features or not.</source>
- <translation type="unfinished">Mostrar o no características de control de moneda</translation>
+ <translation type="unfinished">Si se muestran o no las funcionalidades 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">Conectarse a la red Bitcoin a través de un proxy SOCKS5 independiente para los servicios onion 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 un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>&amp;OK</source>
- <translation type="unfinished">&amp;Aceptar</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>
@@ -1627,12 +1787,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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">Confirme el restablecimiento de las opciones</translation>
+ <translation type="unfinished">Confirmar restablecimiento de opciones</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">Reinicio del cliente para activar cambios.</translation>
+ <translation type="unfinished">Es necesario reiniciar el cliente para activar los cambios.</translation>
</message>
<message>
<source>Current settings will be backed up at "%1".</source>
@@ -1642,7 +1802,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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">El cliente será cluasurado. Quieres proceder?</translation>
+ <translation type="unfinished">El cliente se cerrará. ¿Quieres continuar?</translation>
</message>
<message>
<source>Configuration options</source>
@@ -1652,7 +1812,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1664,15 +1824,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The configuration file could not be opened.</source>
- <translation type="unfinished">El archivo de configuración no se pudo abrir.</translation>
+ <translation type="unfinished">No se pudo abrir el archivo de configuración.</translation>
</message>
<message>
<source>This change would require a client restart.</source>
- <translation type="unfinished">Este cambio requiere reinicio por parte del cliente.</translation>
+ <translation type="unfinished">Estos cambios requieren reiniciar el cliente.</translation>
</message>
<message>
<source>The supplied proxy address is invalid.</source>
- <translation type="unfinished">La dirección proxy indicada es inválida.</translation>
+ <translation type="unfinished">La dirección del proxy proporcionada es inválida.</translation>
</message>
</context>
<context>
@@ -1686,11 +1846,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<name>OverviewPage</name>
<message>
<source>Form</source>
- <translation type="unfinished">Desde</translation>
+ <translation type="unfinished">Formulario</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 Bitcoin después de que se haya establecido una conexión, pero este proceso aún no se ha completado.</translation>
+ <translation type="unfinished">La información mostrada puede estar desactualizada. La billetera 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 de observación:</translation>
</message>
<message>
<source>Available:</source>
@@ -1698,7 +1862,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Your current spendable balance</source>
- <translation type="unfinished">Su balance actual gastable</translation>
+ <translation type="unfinished">Tu saldo disponible para gastar actualmente</translation>
</message>
<message>
<source>Pending:</source>
@@ -1706,15 +1870,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 deben ser confirmadas, y que no cuentan con el balance gastable necesario</translation>
+ <translation type="unfinished">Total de transacciones que aún se deben confirmar y que no se contabilizan dentro del saldo disponible para gastar</translation>
</message>
<message>
<source>Immature:</source>
- <translation type="unfinished">No disponible:</translation>
+ <translation type="unfinished">Inmaduro:</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>
@@ -1722,15 +1886,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Your current total balance</source>
- <translation type="unfinished">Su balance actual total</translation>
+ <translation type="unfinished">Tu saldo total actual</translation>
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Tu saldo actual en solo ver direcciones</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>
@@ -1738,22 +1902,26 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 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 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 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 vista general. Para mostrar los valores, anule 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>
@@ -1789,7 +1957,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Could not sign any more inputs.</source>
- <translation type="unfinished">No se pudo firmar más entradas.</translation>
+ <translation type="unfinished">No se pudieron firmar más entradas.</translation>
</message>
<message>
<source>Signed %1 inputs, but more signatures are still required.</source>
@@ -1813,7 +1981,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
@@ -1826,7 +1994,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
@@ -1846,7 +2014,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Total Amount</source>
- <translation type="unfinished">Cantidad total</translation>
+ <translation type="unfinished">Importe total</translation>
</message>
<message>
<source>or</source>
@@ -1858,7 +2026,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">A la transacción le falta información sobre entradas.</translation>
+ <translation type="unfinished">Falta información sobre las entradas de la transacción.</translation>
</message>
<message>
<source>Transaction still needs signature(s).</source>
@@ -1880,16 +2048,20 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<source>Transaction is fully signed and ready for broadcast.</source>
<translation type="unfinished">La transacción se firmó completamente y está lista para transmitirse.</translation>
</message>
- </context>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">El estado de la transacción es desconocido.</translation>
+ </message>
+</context>
<context>
<name>PaymentServer</name>
<message>
<source>Payment request error</source>
- <translation type="unfinished">Error en petición de pago</translation>
+ <translation type="unfinished">Error en la solicitud de pago</translation>
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">No se pudo iniciar bitcoin: manejador de pago-al-clic</translation>
+ <translation type="unfinished">No se puede iniciar el controlador "bitcoin: click-to-pay"</translation>
</message>
<message>
<source>URI handling</source>
@@ -1897,7 +2069,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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.
@@ -1905,11 +2077,15 @@ Due to widespread security flaws in BIP70 it's strongly recommended that any mer
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 recibe este error, debe solicitar al comerciante que le proporcione un URI compatible con BIP21.</translation>
+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 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>
- <translation type="unfinished">Manejo del archivo de solicitud de pago</translation>
+ <translation type="unfinished">Gestión del archivo de solicitud de pago</translation>
</message>
</context>
<context>
@@ -1927,12 +2103,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
+ <translation type="unfinished">Dirección</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">Expedido</translation>
+ <translation type="unfinished">Enviado</translation>
</message>
<message>
<source>Received</source>
@@ -1942,7 +2123,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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">Direccion</translation>
+ <translation type="unfinished">Dirección</translation>
</message>
<message>
<source>Type</source>
@@ -1962,7 +2143,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Outbound</source>
<extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">Salida</translation>
+ <translation type="unfinished">Saliente</translation>
</message>
</context>
<context>
@@ -1973,15 +2154,15 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>&amp;Copy Image</source>
- <translation type="unfinished">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">El URI resultante es demasiado largo, así que trata de reducir el texto de la etiqueta o el mensaje.</translation>
</message>
<message>
<source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Error al codificar la URI en el código QR.</translation>
+ <translation type="unfinished">Fallo al codificar URI en código QR.</translation>
</message>
<message>
<source>QR code support not available.</source>
@@ -2009,23 +2190,23 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>&amp;Information</source>
- <translation type="unfinished">Información</translation>
+ <translation type="unfinished">&amp;Información</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, use la opción "%1".</translation>
+ <source>Datadir</source>
+ <translation type="unfinished">Directorio de datos</translation>
</message>
<message>
- <source>Blocksdir</source>
- <translation type="unfinished">Bloques dir</translation>
+ <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>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de bloques, use la opción "%1".</translation>
+ <translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de bloques, usa la opción "%1".</translation>
</message>
<message>
<source>Startup time</source>
- <translation type="unfinished">Hora de inicio</translation>
+ <translation type="unfinished">Tiempo de inicio</translation>
</message>
<message>
<source>Network</source>
@@ -2040,24 +2221,40 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
<message>
<source>Memory Pool</source>
- <translation type="unfinished">Grupo de memoria</translation>
+ <translation type="unfinished">Pool de memoria</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <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>
- <translation type="unfinished">Monedero:</translation>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <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>
@@ -2065,7 +2262,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Sent</source>
- <translation type="unfinished">Expedido</translation>
+ <translation type="unfinished">Enviado</translation>
</message>
<message>
<source>&amp;Peers</source>
@@ -2080,6 +2277,10 @@ 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>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2088,14 +2289,14 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
</message>
@@ -2105,13 +2306,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</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>
<translation type="unfinished">Encabezados sincronizados</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">Bloques sincronizados</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">Última transacción</translation>
</message>
@@ -2131,17 +2336,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">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>
@@ -2151,7 +2356,7 @@ 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 omitidas por limitación de volumen</translation>
+ <translation type="unfinished">Direcciones desestimadas por limitación de volumen</translation>
</message>
<message>
<source>User Agent</source>
@@ -2159,7 +2364,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>Current block height</source>
@@ -2167,15 +2372,19 @@ 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 en el directorio de datos actual. Esto puede tardar unos segundos para los archivos de registro grandes.</translation>
+ <translation type="unfinished">Abrir el archivo de registro de depuración %1 en el directorio de datos actual. Esto puede tardar unos segundos para los archivos de registro grandes.</translation>
</message>
<message>
<source>Decrease font size</source>
- <translation type="unfinished">Reducir el tamaño de la fuente</translation>
+ <translation type="unfinished">Disminuir tamaño de fuente</translation>
</message>
<message>
<source>Increase font size</source>
- <translation type="unfinished">Aumentar el tamaño de la fuente</translation>
+ <translation type="unfinished">Aumentar tamaño de fuente</translation>
+ </message>
+ <message>
+ <source>Permissions</source>
+ <translation type="unfinished">Permisos</translation>
</message>
<message>
<source>The direction and type of peer connection: %1</source>
@@ -2186,6 +2395,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</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 mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2195,13 +2408,17 @@ 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">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>
<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>
@@ -2220,21 +2437,29 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Last Receive</source>
- <translation type="unfinished">Ultima recepción</translation>
+ <translation type="unfinished">Última recepción</translation>
</message>
<message>
<source>Ping Time</source>
- <translation type="unfinished">Tiempo de Ping</translation>
+ <translation type="unfinished">Tiempo de ping</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">La duración de un ping actualmente pendiente.</translation>
</message>
<message>
<source>Ping Wait</source>
- <translation type="unfinished">Espera de Ping</translation>
+ <translation type="unfinished">Espera de ping</translation>
</message>
<message>
<source>Min Ping</source>
<translation type="unfinished">Ping mínimo</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation type="unfinished">Desfase temporal</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Hora del último bloque</translation>
</message>
@@ -2248,15 +2473,15 @@ 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>
- <translation type="unfinished">Total:</translation>
+ <translation type="unfinished">Totales</translation>
</message>
<message>
<source>Debug log file</source>
- <translation type="unfinished">Archivo de registro de depuración</translation>
+ <translation type="unfinished">Archivo del registro de depuración</translation>
</message>
<message>
<source>Clear console</source>
@@ -2308,7 +2533,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin encriptar</translation>
</message>
<message>
<source>v2: BIP324 encrypted transport protocol</source>
@@ -2325,7 +2550,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</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>
@@ -2333,35 +2558,55 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">&amp;Copiar dirección</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">&amp;Desconectar</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
- <translation type="unfinished">1 hora</translation>
+ <translation type="unfinished">1 &amp;hora</translation>
</message>
<message>
<source>1 d&amp;ay</source>
<translation type="unfinished">1 &amp;día</translation>
</message>
<message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 &amp;semana</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 &amp;año</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>
</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>
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
- <translation type="unfinished">Ejecutar comando sin monedero</translation>
+ <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>
+ <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.
@@ -2370,12 +2615,13 @@ 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.
+ <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 un resumen de los comandos disponibles. Para más información sobre cómo usar esta consola, escribe %6.
+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 comandos aquí, robando el contenido de sus monederos. 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>
@@ -2392,11 +2638,11 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Yes</source>
- <translation type="unfinished">Si</translation>
+ <translation type="unfinished">Sí</translation>
</message>
<message>
<source>To</source>
- <translation type="unfinished">Para</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>From</source>
@@ -2404,11 +2650,11 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Ban for</source>
- <translation type="unfinished">Bloqueo para</translation>
+ <translation type="unfinished">Prohibir por</translation>
</message>
<message>
<source>Never</source>
- <translation type="unfinished">nunca</translation>
+ <translation type="unfinished">Nunca</translation>
</message>
<message>
<source>Unknown</source>
@@ -2419,7 +2665,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Amount:</source>
- <translation type="unfinished">Monto:</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -2427,27 +2673,27 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>&amp;Message:</source>
- <translation type="unfinished">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 adjunto a la solicitud de pago, que será mostrado cuando la solicitud sea abierta. Nota: Este mensaje no será enviado con el pago a través de la red Bitcoin.</translation>
+ <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>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>
- <translation type="unfinished">Use este formulario para solicitar pagos. Todos los campos son &lt;b&gt; opcionales &lt;/ b&gt;.</translation>
+ <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. Deje esto vacío o en cero para no solicitar una cantidad específica.</translation>
+ <translation type="unfinished">Un importe opcional para solicitar. Déjalo vacío o ingresa cero para no solicitar un importe específico.</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">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>
@@ -2455,23 +2701,23 @@ Escribe %5 para ver un resumen de los comandos 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">Limpiar todos los campos del formulario</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Clear</source>
- <translation type="unfinished">Limpiar</translation>
+ <translation type="unfinished">Borrar</translation>
</message>
<message>
<source>Requested payments history</source>
- <translation type="unfinished">Historial de pagos solicitado</translation>
+ <translation type="unfinished">Historial de pagos solicitados</translation>
</message>
<message>
<source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Muestra la petición seleccionada (También doble clic)</translation>
+ <translation type="unfinished">Mostrar la solicitud seleccionada (equivale a hacer doble clic en una entrada)</translation>
</message>
<message>
<source>Show</source>
@@ -2479,7 +2725,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Remove the selected entries from the list</source>
- <translation type="unfinished">Borrar de la lista las direcciónes actualmente seleccionadas</translation>
+ <translation type="unfinished">Eliminar las entradas seleccionadas de la lista</translation>
</message>
<message>
<source>Remove</source>
@@ -2523,11 +2769,11 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Could not unlock wallet.</source>
- <translation type="unfinished">No se pudo desbloquear el monedero.</translation>
+ <translation type="unfinished">No se pudo desbloquear la billetera.</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>
+ <translation type="unfinished">No se pudo generar nueva dirección %1</translation>
</message>
</context>
<context>
@@ -2537,20 +2783,32 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
<translation type="unfinished">Solicitar pago a...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">Dirección:</translation>
+ </message>
+ <message>
<source>Amount:</source>
- <translation type="unfinished">Monto:</translation>
+ <translation type="unfinished">Importe:</translation>
+ </message>
+ <message>
+ <source>Label:</source>
+ <translation type="unfinished">Etiqueta:</translation>
</message>
<message>
<source>Message:</source>
<translation type="unfinished">Mensaje:</translation>
</message>
<message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">Copiar &amp;URI</translation>
</message>
<message>
<source>Copy &amp;Address</source>
- <translation type="unfinished">&amp;Copiar Dirección</translation>
+ <translation type="unfinished">Copiar &amp;dirección</translation>
</message>
<message>
<source>&amp;Verify</source>
@@ -2558,7 +2816,7 @@ Escribe %5 para ver un resumen de los comandos 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, por ejemplo, en la pantalla de una billetera de hardware</translation>
+ <translation type="unfinished">Verificar esta dirección, por ejemplo, en la pantalla de una billetera de hardware.</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2566,7 +2824,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Payment information</source>
- <translation type="unfinished">Información de pago</translation>
+ <translation type="unfinished">Información del pago</translation>
</message>
<message>
<source>Request payment to %1</source>
@@ -2581,7 +2839,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Label</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">Etiqueta</translation>
</message>
<message>
<source>Message</source>
@@ -2593,11 +2851,11 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>(no message)</source>
- <translation type="unfinished">(Ningun mensaje)</translation>
+ <translation type="unfinished">(sin mensaje)</translation>
</message>
<message>
<source>(no amount requested)</source>
- <translation type="unfinished">(sin importe solicitado)</translation>
+ <translation type="unfinished">(no se solicitó un importe)</translation>
</message>
<message>
<source>Requested</source>
@@ -2612,15 +2870,15 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Coin Control Features</source>
- <translation type="unfinished">Características de control de la moneda</translation>
+ <translation type="unfinished">Funciones de control de monedas</translation>
</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>
- <translation type="unfinished">Fondos insuficientes!</translation>
+ <translation type="unfinished">Fondos insuficientes</translation>
</message>
<message>
<source>Quantity:</source>
@@ -2628,7 +2886,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Amount:</source>
- <translation type="unfinished">Monto:</translation>
+ <translation type="unfinished">Importe:</translation>
</message>
<message>
<source>Fee:</source>
@@ -2636,7 +2894,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Después de tasas:</translation>
+ <translation type="unfinished">Después de la comisión:</translation>
</message>
<message>
<source>Change:</source>
@@ -2644,11 +2902,11 @@ Escribe %5 para ver un resumen de los comandos 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>
- <translation type="unfinished">Dirección propia</translation>
+ <translation type="unfinished">Dirección de cambio personalizada</translation>
</message>
<message>
<source>Transaction Fee:</source>
@@ -2656,11 +2914,19 @@ Escribe %5 para ver un resumen de los comandos 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>
- <translation type="unfinished">Advertencia: En este momento no se puede estimar la cuota.</translation>
+ <translation type="unfinished">Advertencia: En este momento no se puede estimar la comisión.</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">por kilobyte</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">Ocultar</translation>
</message>
<message>
<source>Recommended:</source>
@@ -2672,15 +2938,15 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Send to multiple recipients at once</source>
- <translation type="unfinished">Enviar a múltiples destinatarios de una vez</translation>
+ <translation type="unfinished">Enviar a múltiples destinatarios a la vez</translation>
</message>
<message>
<source>Add &amp;Recipient</source>
- <translation type="unfinished">Añadir &amp;destinatario</translation>
+ <translation type="unfinished">Agregar &amp;destinatario</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation type="unfinished">Limpiar todos los campos del formulario</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Inputs…</source>
@@ -2708,19 +2974,27 @@ 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">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">(La comisión inteligente no se ha inicializado todavía. Esto tarda normalmente algunos bloques…)</translation>
</message>
<message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">Objetivo de tiempo de confirmación:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <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>
- <translation type="unfinished">Limpiar &amp;todo</translation>
+ <translation type="unfinished">Borrar &amp;todo</translation>
</message>
<message>
<source>Balance:</source>
@@ -2759,22 +3033,34 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Copiar cambio</translation>
</message>
<message>
+ <source>%1 (%2 blocks)</source>
+ <translation type="unfinished">%1 (%2 bloques)</translation>
+ </message>
+ <message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
<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 billetera 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 -&gt; Monedero</translation>
+ <translation type="unfinished">Establecer la ruta al script del firmante externo en "Opciones -&gt; Billetera"</translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <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 (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</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>
+ <translation type="unfinished">%1 a '%2'</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2786,17 +3072,17 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -2810,7 +3096,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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>
@@ -2822,11 +3108,16 @@ 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>
+ <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">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>
+ <translation type="unfinished">%1 desde billetera "%2"</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
@@ -2836,12 +3127,12 @@ 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 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>
+ <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>
<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>
@@ -2849,11 +3140,11 @@ 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 remplazar-por-comisión, BIP-125.</translation>
+ <translation type="unfinished">No indica "Remplazar por comisión", BIP-125.</translation>
</message>
<message>
<source>Total Amount</source>
- <translation type="unfinished">Cantidad total</translation>
+ <translation type="unfinished">Importe total</translation>
</message>
<message>
<source>Unsigned Transaction</source>
@@ -2863,11 +3154,11 @@ 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>
@@ -2883,15 +3174,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">La cantidad por pagar tiene que ser mayor de 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">La cantidad 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 tasa 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>
@@ -2899,34 +3190,34 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Transaction creation failed!</source>
- <translation type="unfinished">¡Ha fallado la creación de la transacción!</translation>
+ <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>
+ <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 inválida</translation>
</message>
<message>
<source>Warning: Unknown change address</source>
- <translation type="unfinished">Alerta: Dirección de Bitcoin inválida</translation>
+ <translation type="unfinished">Advertencia: Dirección de cambio desconocida</translation>
</message>
<message>
<source>Confirm custom change address</source>
- <translation type="unfinished">Confirmar dirección de cambio personalizada</translation>
+ <translation type="unfinished">Confirmar la dirección de cambio personalizada</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">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 esta billetera. Una parte o la totalidad de los fondos en la billetera se enviará a esta dirección. ¿Seguro deseas continuar?</translation>
</message>
<message>
<source>(no label)</source>
@@ -2937,11 +3228,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation type="unfinished">Monto:</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>Pay &amp;To:</source>
- <translation type="unfinished">&amp;Pagar a:</translation>
+ <translation type="unfinished">Pagar &amp;a:</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -2949,25 +3240,33 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Choose previously used address</source>
- <translation type="unfinished">Escoger dirección previamente usada</translation>
+ <translation type="unfinished">Seleccionar 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>
- <translation type="unfinished">Pegar dirección desde portapapeles</translation>
+ <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
</message>
<message>
<source>Remove this entry</source>
- <translation type="unfinished">Eliminar esta transacción</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 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 se deducirá del importe que se envía. El destinatario recibirá menos bitcoins que los que ingreses en el campo del importe. Si se seleccionan varios destinatarios, la comisión se dividirá por igual.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">&amp;Restar la comisión del importe</translation>
+ </message>
+ <message>
<source>Use available balance</source>
<translation type="unfinished">Usar el saldo disponible</translation>
</message>
@@ -2977,11 +3276,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -2999,31 +3298,31 @@ 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>
</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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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 mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) 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 dirección previamente usada</translation>
+ <translation type="unfinished">Seleccionar dirección usada anteriormente</translation>
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">Pegar dirección desde portapapeles</translation>
+ <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
- <translation type="unfinished">Introduzca el mensaje que desea firmar aquí</translation>
+ <translation type="unfinished">Ingresar aquí el mensaje que deseas firmar</translation>
</message>
<message>
<source>Signature</source>
@@ -3035,7 +3334,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Firmar el mensaje para demostrar que se posee esta 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>
@@ -3043,19 +3342,23 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
<translation type="unfinished">&amp;Verificar mensaje</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">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 está en el mensaje firmado en sí, para evitar ser víctima de un engaño por ataque de intermediario. Ten en cuenta que esto solo demuestra que el firmante recibe con la 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">La dirección Bitcoin con la que se firmó 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>
@@ -3063,11 +3366,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The signature given when the message was signed</source>
- <translation type="unfinished">La firma proporcionada cuando el mensaje fue firmado</translation>
+ <translation type="unfinished">La firma que se dio cuando el mensaje se firmó</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Verificar 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>
@@ -3075,39 +3378,39 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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 ingresada es inválida.</translation>
</message>
<message>
<source>Please check the address and try again.</source>
- <translation type="unfinished">Verifique la dirección e inténtelo de nuevo.</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>
- <translation type="unfinished">La dirección introducida no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
- <translation type="unfinished">Se ha cancelado el desbloqueo del monedero. </translation>
+ <translation type="unfinished">Se canceló el desbloqueo de la billetera.</translation>
</message>
<message>
<source>No error</source>
- <translation type="unfinished">No hay error</translation>
+ <translation type="unfinished">Sin error </translation>
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation type="unfinished">No se dispone de la clave privada para la dirección introducida.</translation>
+ <translation type="unfinished">La clave privada para la dirección ingresada no está disponible.</translation>
</message>
<message>
<source>Message signing failed.</source>
- <translation type="unfinished">Ha fallado la firma del mensaje.</translation>
+ <translation type="unfinished">Error al firmar el mensaje.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -3115,19 +3418,19 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The signature could not be decoded.</source>
- <translation type="unfinished">No se puede decodificar la firma.</translation>
+ <translation type="unfinished">La firma no pudo decodificarse.</translation>
</message>
<message>
<source>Please check the signature and try again.</source>
- <translation type="unfinished">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">La verificación del mensaje ha fallado.</translation>
+ <translation type="unfinished">Falló la verificación del mensaje.</translation>
</message>
<message>
<source>Message verified.</source>
@@ -3138,16 +3441,21 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>SplashScreen</name>
<message>
<source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(presiona q para apagar y seguir luego)</translation>
+ <translation type="unfinished">(Presionar q para apagar y seguir luego)</translation>
</message>
<message>
<source>press q to shutdown</source>
- <translation type="unfinished">presiona q para apagar </translation>
+ <translation type="unfinished">Presionar q para apagar </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">Hay un conflicto con una transacción con %1 confirmaciones</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/sin confirmar, en el pool de memoria</translation>
@@ -3165,7 +3473,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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/no confirmado</translation>
+ <translation type="unfinished">%1/sin confirmar</translation>
</message>
<message>
<source>%1 confirmations</source>
@@ -3182,7 +3490,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Source</source>
- <translation type="unfinished">Fuente</translation>
+ <translation type="unfinished">Origen</translation>
</message>
<message>
<source>Generated</source>
@@ -3198,13 +3506,17 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>To</source>
- <translation type="unfinished">Para</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>own address</source>
<translation type="unfinished">dirección propia</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
+ </message>
+ <message>
<source>label</source>
<translation type="unfinished">etiqueta</translation>
</message>
@@ -3229,7 +3541,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Total debit</source>
- <translation type="unfinished">Total enviado</translation>
+ <translation type="unfinished">Débito total</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation type="unfinished">Crédito total</translation>
</message>
<message>
<source>Transaction fee</source>
@@ -3237,7 +3553,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Net amount</source>
- <translation type="unfinished">Cantidad neta</translation>
+ <translation type="unfinished">Importe neto</translation>
</message>
<message>
<source>Message</source>
@@ -3249,11 +3565,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Transaction ID</source>
- <translation type="unfinished">ID</translation>
+ <translation type="unfinished">Identificador 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>
@@ -3261,7 +3577,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Output index</source>
- <translation type="unfinished">Indice de salida</translation>
+ <translation type="unfinished">Ãndice de salida</translation>
</message>
<message>
<source>%1 (Certificate was not verified)</source>
@@ -3269,11 +3585,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Merchant</source>
- <translation type="unfinished">Vendedor</translation>
+ <translation type="unfinished">Comerciante</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">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>
+ <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>
@@ -3285,7 +3601,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Inputs</source>
- <translation type="unfinished">entradas</translation>
+ <translation type="unfinished">Entradas</translation>
</message>
<message>
<source>Amount</source>
@@ -3304,9 +3620,13 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>TransactionDescDialog</name>
<message>
<source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Esta ventana muestra información detallada sobre la transacción</translation>
+ <translation type="unfinished">En este panel se muestra una descripción detallada de la transacción</translation>
+ </message>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">Detalles para %1</translation>
</message>
- </context>
+</context>
<context>
<name>TransactionTableModel</name>
<message>
@@ -3319,43 +3639,59 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Label</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">Etiqueta</translation>
+ </message>
+ <message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">Sin confirmar</translation>
</message>
<message>
<source>Abandoned</source>
<translation type="unfinished">Abandonada</translation>
</message>
<message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">Confirmando (%1 de %2 confirmaciones recomendadas)</translation>
+ </message>
+ <message>
<source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">Confirmado (%1 confirmaciones)</translation>
+ <translation type="unfinished">Confirmada (%1 confirmaciones)</translation>
+ </message>
+ <message>
+ <source>Conflicted</source>
+ <translation type="unfinished">En conflicto</translation>
</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>
- <translation type="unfinished">Generado pero no aceptado</translation>
+ <translation type="unfinished">Generada pero no aceptada</translation>
</message>
<message>
<source>Received with</source>
- <translation type="unfinished">Recibido con</translation>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Received from</source>
- <translation type="unfinished">Recibidos de</translation>
+ <translation type="unfinished">Recibida de</translation>
</message>
<message>
<source>Sent to</source>
- <translation type="unfinished">Enviado a</translation>
+ <translation type="unfinished">Enviada a</translation>
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>(n/a)</source>
- <translation type="unfinished">(nd)</translation>
+ <translation type="unfinished">(n/d)</translation>
</message>
<message>
<source>(no label)</source>
@@ -3363,11 +3699,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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 mouse 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 en que 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>
@@ -3375,7 +3711,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 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>
@@ -3383,7 +3719,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Cantidad retirada o añadida al saldo.</translation>
+ <translation type="unfinished">Importe restado del saldo o sumado a este.</translation>
</message>
</context>
<context>
@@ -3414,15 +3750,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Received with</source>
- <translation type="unfinished">Recibido con</translation>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Sent to</source>
- <translation type="unfinished">Enviado a</translation>
+ <translation type="unfinished">Enviada a</translation>
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
</message>
<message>
<source>Other</source>
@@ -3430,11 +3766,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">Ingresa la dirección, el identificador de transacción o la etiqueta para 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>
- <translation type="unfinished">Cantidad mínima</translation>
+ <translation type="unfinished">Importe mínimo</translation>
</message>
<message>
<source>Range…</source>
@@ -3454,11 +3790,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Copiar &amp;ID de transacción</translation>
+ <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;raw</translation>
+ <translation type="unfinished">Copiar transacción &amp;sin procesar</translation>
</message>
<message>
<source>Copy full transaction &amp;details</source>
@@ -3496,7 +3832,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmado</translation>
+ <translation type="unfinished">Confirmada</translation>
+ </message>
+ <message>
+ <source>Watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>Date</source>
@@ -3508,11 +3848,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Label</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">Etiqueta</translation>
</message>
<message>
<source>Address</source>
- <translation type="unfinished">Direccion</translation>
+ <translation type="unfinished">Dirección</translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <translation type="unfinished">Identificador</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -3520,15 +3864,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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 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>
- <translation type="unfinished">Exportación finalizada</translation>
+ <translation type="unfinished">Exportación correcta</translation>
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">La transacción ha sido guardada en %1.</translation>
+ <translation type="unfinished">El historial de transacciones se guardó correctamente en %1.</translation>
</message>
<message>
<source>Range:</source>
@@ -3536,7 +3880,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>to</source>
- <translation type="unfinished">para</translation>
+ <translation type="unfinished">a</translation>
</message>
</context>
<context>
@@ -3546,28 +3890,32 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<translation type="unfinished">No se cargó ninguna billetera.
-Ir a Archivo &gt; Abrir billetera para cargar una.
-- OR -</translation>
+Ir a "Archivo &gt; Abrir billetera" para cargar una.
+- O -</translation>
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Crear monedero nuevo</translation>
+ <translation type="unfinished">Crear una nueva billetera</translation>
</message>
<message>
<source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">No se puede decodificar PSBT desde el portapapeles (Base64 inválido)</translation>
+ <translation type="unfinished">No se puede decodificar la TBPF desde el portapapeles (Base64 inválida)</translation>
+ </message>
+ <message>
+ <source>Load Transaction Data</source>
+ <translation type="unfinished">Cargar datos de la transacción</translation>
</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>
@@ -3578,18 +3926,30 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>Fee bump error</source>
- <translation type="unfinished">Error de incremento de cuota</translation>
+ <translation type="unfinished">Error de incremento de comisión</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">Fallo al incrementar la comisión de transacción</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">¿Desea incrementar la cuota?</translation>
+ <translation type="unfinished">¿Deseas incrementar la comisión?</translation>
+ </message>
+ <message>
+ <source>Current fee:</source>
+ <translation type="unfinished">Comisión actual:</translation>
</message>
<message>
<source>Increase:</source>
<translation type="unfinished">Incremento:</translation>
</message>
<message>
+ <source>New fee:</source>
+ <translation type="unfinished">Nueva comisión:</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">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>
@@ -3603,28 +3963,27 @@ 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>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
- <translation type="unfinished">No se ha podido firmar la transacción.</translation>
+ <translation type="unfinished">No se puede firmar la transacción.</translation>
</message>
<message>
<source>Could not commit transaction</source>
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera por defecto</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -3635,11 +3994,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exportar los datos en la pestaña actual a un archivo</translation>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
</message>
<message>
<source>Backup Wallet</source>
- <translation type="unfinished">Respaldo de monedero</translation>
+ <translation type="unfinished">Realizar copia de seguridad de la billetera</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -3648,19 +4007,19 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>Backup Failed</source>
- <translation type="unfinished">Ha fallado el respaldo</translation>
+ <translation type="unfinished">Copia de seguridad fallida</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 en %1.</translation>
+ <translation type="unfinished">Ocurrió un error al intentar guardar los datos de la billetera 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 seguridad 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 de la billetera se guardaron correctamente en %1.</translation>
</message>
<message>
<source>Cancel</source>
@@ -3675,11 +4034,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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 de la billetera de bitcoin para rescatar o restaurar una copia de seguridad.</translation>
+ <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 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>
+ <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>
@@ -3702,28 +4061,32 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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; 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. 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! 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>
+ <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>
<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>
+ <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 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>
- <translation type="unfinished">Error: las billeteras heredadas solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32".</translation>
+ <translation type="unfinished">Error: Las billeteras "legacy" 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>
@@ -3735,7 +4098,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <translation type="unfinished">El archivo peers.dat (%s) es inválido o está dañado. 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>
@@ -3754,16 +4117,16 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>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">Verifica que la fecha y hora de la computadora 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">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 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 de poda no es compatible con -reindex-chainstate. Usa en su lugar un -reindex completo.</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>
@@ -3771,7 +4134,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3783,7 +4146,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3791,7 +4154,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
@@ -3799,15 +4162,15 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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">Impuesto por transacción que pagarás cuando la estimación de impuesto 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>
@@ -3819,7 +4182,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3831,11 +4194,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
+ <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>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
@@ -3843,7 +4206,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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">Atención: ¡Parece que no estamos completamente de acuerdo con nuestros pares! Podría necesitar una actualización, u otros nodos podrían necesitarla.</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>
@@ -3855,19 +4218,15 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <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 direccion: '%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>
@@ -3878,12 +4237,8 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <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>
+ <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>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -3895,7 +4250,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3914,6 +4269,12 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se pudo eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</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>
@@ -3922,6 +4283,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/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>
@@ -3930,6 +4299,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</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>
@@ -3946,12 +4323,20 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas de la billetera supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</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>
+ <translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe 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>
+ <translation type="unfinished">El monto 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>
@@ -3963,14 +4348,14 @@ 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
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 la billetera basada en descriptores. Cargando billetera%s
Es posible que la billetera haya sido manipulada o creada con malas intenciones.
</translation>
@@ -3988,6 +4373,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora de la computadora parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj de la computadora, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4000,12 +4389,36 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</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 obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se encontraron datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
<message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <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>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se encontró un bloque corrupto que indica un posible fallo del hardware.</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>
@@ -4025,13 +4438,17 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Done loading</source>
- <translation type="unfinished">Carga lista</translation>
+ <translation type="unfinished">Carga completa</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>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</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>
@@ -4045,7 +4462,11 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error initializing wallet database environment %s!</source>
- <translation type="unfinished">Error al inicializar el entorno de la base de datos del monedero %s</translation>
+ <translation type="unfinished">Error al inicializar el entorno de la base de datos de la billetera %s.</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <translation type="unfinished">Error al cargar %s</translation>
</message>
<message>
<source>Error loading %s: Private keys can only be disabled during creation</source>
@@ -4053,19 +4474,19 @@ No se puede restaurar la copia de seguridad de la billetera.</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: billetera dañada</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: la billetera 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>
@@ -4085,7 +4506,7 @@ No se puede restaurar la copia de seguridad 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>
+ <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>
@@ -4105,11 +4526,11 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
@@ -4129,15 +4550,15 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Error: Esta billetera ya es de descriptores</translation>
+ <translation type="unfinished">Error: Esta billetera ya está basada en 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>
+ <translation type="unfinished">Error: No se pueden 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>
+ <translation type="unfinished">Error: No se puede realizar una copia de seguridad de la billetera</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
@@ -4149,7 +4570,7 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <translation type="unfinished">Error: No se pudo leer el registro del mejor localizador de bloques de la billetera.</translation>
</message>
<message>
<source>Error: Unable to remove watchonly address book data</source>
@@ -4161,24 +4582,35 @@ No se puede restaurar la copia de seguridad de la 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>
+ <translation type="unfinished">Error: No se pudo escribir el registro del mejor localizador de bloques de la billetera solucionable.</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>
+ <translation type="unfinished">Error: No se pudo escribir el registro del mejor localizador de bloques de la billetera 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 la billetera 1%s
- </translation>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera %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 connect best block (%s).</source>
+ <translation type="unfinished">No se pudo conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se pudo desconectar el bloque.</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>
+ <translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
+ </message>
+ <message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se pudo leer el bloque.</translation>
</message>
<message>
<source>Failed to rescan the wallet during initialization</source>
@@ -4186,15 +4618,31 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Failed to start indexes, shutting down..</source>
- <translation type="unfinished">Es erróneo al iniciar indizados, se apaga...</translation>
+ <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>Failed to write block.</source>
+ <translation type="unfinished">No se pudo escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
- <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ <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>
@@ -4210,15 +4658,19 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">Incorrecto o bloque de génesis no encontrado. Datadir equivocada para la red?</translation>
+ <translation type="unfinished">El bloque génesis es incorrecto o no se encontró. ¿El directorio de datos es equivocado para la red?</translation>
+ </message>
+ <message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <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>
- <translation type="unfinished">No se encontró o ya se gastó la entrada</translation>
+ <translation type="unfinished">La entrada no se encontró o ya se gastó</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>
@@ -4226,15 +4678,15 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <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 de -onion o dominio '%s' invá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 de -proxy o dominio ' %s' invá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>
@@ -4249,16 +4701,24 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%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 netmask specified in -whitelist: '%s'</source>
+ <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">Fallo en la escucha para conexiones entrantes (la escucha devolvió el error %s)</translation>
+ <translation type="unfinished">Fallo al escuchar conexiones entrantes (la escucha devolvió el error %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -4266,7 +4726,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>
@@ -4277,28 +4737,40 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
- <translation type="unfinished">Falta la cantidad</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 la transacción</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>
+ </message>
+ <message>
<source>No addresses available</source>
<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>
+ <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>
+ <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>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
@@ -4310,7 +4782,11 @@ 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>
+ <translation type="unfinished">Reduciendo -maxconnections de %d a %d, debido a limitaciones del sistema.</translation>
</message>
<message>
<source>Replaying blocks…</source>
@@ -4341,8 +4817,20 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante devolvió un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
- <translation type="unfinished">Transacción falló</translation>
+ <translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
<message>
<source>Specified -walletdir "%s" does not exist</source>
@@ -4369,8 +4857,20 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</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>
@@ -4378,15 +4878,27 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">El monto de la transacción es demasiado pequeño para pagar la comisión</translation>
+ <translation type="unfinished">El importe de la transacción es muy pequeño para pagar la comisión</translation>
+ </message>
+ <message>
+ <source>The wallet will avoid paying less than the minimum relay fee.</source>
+ <translation type="unfinished">La billetera evitará pagar menos que la comisión mínima de retransmisión.</translation>
+ </message>
+ <message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta direcció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>
+ <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 tarifa a pagar si realizas una transacción.</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>
@@ -4394,11 +4906,11 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Transaction amount too small</source>
- <translation type="unfinished">Transacción muy pequeña</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 montos de la transacción no debe ser negativo</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>
@@ -4406,7 +4918,7 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
@@ -4414,11 +4926,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Transaction too large</source>
- <translation type="unfinished">Transacción muy 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>
+ <translation type="unfinished">Transacción demasiado grande</translation>
</message>
<message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
@@ -4453,6 +4961,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">No se puede analizar -maxuploadtarget: "%s"</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <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>
<translation type="unfinished">No se puede descargar la billetera antes de la migración</translation>
</message>
@@ -4470,23 +4982,27 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">La red especificada en -onlynet '%s' es 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">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
+ <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>
+ <translation type="unfinished">Error al crear el archivo de la billetera: %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>
+ <translation type="unfinished">acceptstalefeeestimates no se admite en la cadena %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
@@ -4494,11 +5010,11 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <translation type="unfinished">Error: No se puede agregar la transacción solo de observación %s a la billetera solo de observación</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
- <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ <translation type="unfinished">Error: No se pudieron eliminar las transacciones solo de observación</translation>
</message>
<message>
<source>User Agent comment (%s) contains unsafe characters.</source>
diff --git a/src/qt/locale/bitcoin_es_MX.ts b/src/qt/locale/bitcoin_es_MX.ts
index ee6865bbd7..c487b7b32f 100644
--- a/src/qt/locale/bitcoin_es_MX.ts
+++ b/src/qt/locale/bitcoin_es_MX.ts
@@ -3,11 +3,12 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">0xB006A7c1B9639BE87461Ee9 0xB006A7c1B9639BE87461Ee9</translation>
+ <translation type="unfinished">Right-click to edit address or label
+Click-derecho para editar direccion o nivel</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">0xB006A7c1B9639BE87461Ee9 0xB006A7c1B9639BE87461Ee9</translation>
+ <translation type="unfinished">Crea una nueva dirección </translation>
</message>
<message>
<source>&amp;New</source>
@@ -15,7 +16,75 @@
</message>
<message>
<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>
+ <translation type="unfinished">Copie la direccion seleccionada actualmente en el portapapeles del sistema</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">&amp;copia</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">Borre la direccion seleccionada actualmente de la lista</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">introduzca la dirección o etiqueta para buscar</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Exportar </translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Borrar</translation>
+ </message>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Escoja la direccion a la que va enviar monedas tambien</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">Eliga la direccion para recibir monedas con</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">Esta es tu direccion para enviar pagos con Bitcoin. Siempre revisa la cantidad y la direccion correcta de monedas antes de enviar.</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">Esta es la direccion de Bitcoin para recibir pagos. Usa el botton ‘Crea nueva direccion de pagos’ en la pestaña crear nueva direccion.
+la entrada solo es posible con las direcciones del tipo ‘legacy’</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation type="unfinished">&amp;Copiar dirección </translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation type="unfinished">Copiar &amp;Etiqueta</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">&amp;Editar </translation>
+ </message>
+ <message>
+ <source>Export Address List</source>
+ <translation type="unfinished">Exportar la lista de direccion</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 de comas</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">Se ha producido un error al intentar guardar la lista de direcciones en %1. Por favor, inténtelo de nuevo.</translation>
</message>
<message>
<source>Sending addresses - %1</source>
@@ -23,25 +92,100 @@
</message>
<message>
<source>Receiving addresses - %1</source>
- <translation type="unfinished">Recepción de direcciones - %1</translation>
+ <translation type="unfinished">Recibiendo direcciones - %1</translation>
</message>
- </context>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Error en la transportación.</translation>
+ </message>
+</context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta.</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Dirección </translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(Sin etiqueta)</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation type="unfinished">Diálogo de frase de contraseña</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation type="unfinished">Introduzca la frase de contraseña</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation type="unfinished">Nueva frase de contraseña</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation type="unfinished">Repetir nueva frase de contraseña</translation>
+ </message>
+ <message>
+ <source>Show passphrase</source>
+ <translation type="unfinished">Mostrar frase de contraseña</translation>
+ </message>
+ <message>
<source>Encrypt wallet</source>
- <translation type="unfinished">Encrypt wallet jesus daniel</translation>
+ <translation type="unfinished">cartera encriptada</translation>
+ </message>
+ <message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">Esta operación necesita la frase de contraseña de su billetera para desbloquear la billetera.</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">Cartera desbloqueda</translation>
+ </message>
+ <message>
+ <source>Change passphrase</source>
+ <translation type="unfinished">Cambiar frase de contraseña</translation>
+ </message>
+ <message>
+ <source>Confirm wallet encryption</source>
+ <translation type="unfinished">Confirmar el cifrado de la cartera</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 cifras tu billetera y pierdes tu frase de contraseña,podrias 1 PERDER TODS TUS BITCOINS 1 !</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">¿Estás seguro de que quieres cifrar tu cartera?</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation type="unfinished">Cartera encriptada</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">Introduzca la frase de contraseña antigua y la nueva frase de contraseña para la cartera.</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</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">Recuerde que el cifrado de su billetera no puede proteger completamente sus bitcoins de ser robados por el malware que infecta su ordenador.</translation>
</message>
</context>
<context>
<name>QObject</name>
<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>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 todavía no ha terminado de forma segura...</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
@@ -85,33 +229,160 @@
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Cambiar la contraseña usada para la encriptación de la cartera</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">Cifre las claves privadas que pertenecen a su billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <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">Firme mensajes con sus direcciones de Bitcoin para demostrar que los posee</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <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">Verifique los mensajes para asegurarse de que se firmaron con direcciones de Bitcoin especificadas.</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Cargar PSBT desde el archivo...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Abrir &amp;URI…</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Cerrar Billetera</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Crear Billetera</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Cerrar todas las carteras</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Archivo</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Configuraciones</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Ayuda</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Pestañas</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Sincronizando cabeceras (%1%) ...</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Sincronizando con la red...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Indexando bloques en disco...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Procesando bloques en disco...</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 bloque procesado del historial de transacciones.</numerusform>
+ <numerusform>%n bloques procesados del historial de transacciones.</numerusform>
</translation>
</message>
<message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Cargar PSBT desde el &amp;portapapeles...</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Abrir Cartera</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Abrir una cartera</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Cerrar cartera</translation>
</message>
<message>
- <source>Migrate a wallet</source>
- <translation type="unfinished">Migrar una billetera</translation>
+ <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>No wallets available</source>
+ <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>
</message>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Cargar copia de seguridad de billetera</translation>
+ <translation type="unfinished">Cargar copia de seguridad del monedero</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>
</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 billetera</translation>
+ <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>&amp;Hide</source>
@@ -119,7 +390,7 @@
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">M&amp;ostrar</translation>
+ <translation type="unfinished">&amp;Mostrar</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -130,157 +401,127 @@
</translation>
</message>
<message>
- <source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <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>
</message>
<message>
- <source>Error creating wallet</source>
- <translation type="unfinished">Error al crear billetera</translation>
+ <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 pares</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>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Desactivar la actividad de la red</translation>
</message>
<message>
- <source>Warning: %1</source>
- <translation type="unfinished">Advertencia: %1</translation>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Habilitar actividad de red</translation>
</message>
<message>
- <source>Date: %1
-</source>
- <translation type="unfinished">Fecha: %1
-</translation>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
- <source>Amount: %1
-</source>
- <translation type="unfinished">Importe: %1
-</translation>
+ <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>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
<message>
- <source>Wallet: %1
-</source>
- <translation type="unfinished">Billetera: %1
-</translation>
+ <source>After Fee:</source>
+ <translation type="unfinished">Después de la comisión:</translation>
</message>
<message>
- <source>Type: %1
-</source>
- <translation type="unfinished">Tipo: %1
-</translation>
+ <source>Change:</source>
+ <translation type="unfinished">Cambio:</translation>
</message>
<message>
- <source>Label: %1
-</source>
- <translation type="unfinished">Etiqueta: %1
-</translation>
+ <source>(un)select all</source>
+ <translation type="unfinished">(des)marcar todos</translation>
</message>
<message>
- <source>Address: %1
-</source>
- <translation type="unfinished">Dirección: %1
-</translation>
+ <source>Tree mode</source>
+ <translation type="unfinished">Modo arbol</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation type="unfinished">Transacción enviada</translation>
+ <source>List mode</source>
+ <translation type="unfinished">Modo de lista</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation type="unfinished">Transacción recibida</translation>
+ <source>Amount</source>
+ <translation type="unfinished">Importe</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>
+ <source>Received with label</source>
+ <translation type="unfinished">Recibido con etiqueta</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">La billetera está &lt;b&gt;cifrada&lt;/b&gt; y actualmente &lt;b&gt;desbloqueda&lt;/b&gt;</translation>
+ <source>Received with address</source>
+ <translation type="unfinished">Recibido con etiqueta</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">La billetera está &lt;b&gt;cifrada&lt;/b&gt; y actualmente &lt;b&gt;bloqueda&lt;/b&gt;</translation>
- </message>
- </context>
-<context>
- <name>CoinControlDialog</name>
- <message>
- <source>Coin Selection</source>
- <translation type="unfinished">Selección de monedas</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">Cantidad:</translation>
+ <source>Date</source>
+ <translation type="unfinished">Fecha</translation>
</message>
<message>
- <source>Amount:</source>
- <translation type="unfinished">Importe:</translation>
+ <source>Confirmations</source>
+ <translation type="unfinished">Confirmaciones</translation>
</message>
<message>
- <source>Fee:</source>
- <translation type="unfinished">Comisión:</translation>
+ <source>Confirmed</source>
+ <translation type="unfinished">Confirmada</translation>
</message>
- </context>
-<context>
- <name>MigrateWalletActivity</name>
<message>
- <source>Migrate wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <source>Copy amount</source>
+ <translation type="unfinished">Copiar importe</translation>
</message>
<message>
- <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>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Copiar dirección</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>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Copiar &amp;etiqueta</translation>
</message>
<message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Copiar &amp;importe</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>
+ <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>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">&amp;Bloquear importe no gastado</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>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">&amp;Desbloquear importe no gastado</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>
+ <source>Copy quantity</source>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
- <source>Migration failed</source>
- <translation type="unfinished">Migración errónea</translation>
+ <source>Copy fee</source>
+ <translation type="unfinished">Tarifa de copia</translation>
</message>
<message>
- <source>Migration Successful</source>
- <translation type="unfinished">Migración correcta</translation>
+ <source>Copy after fee</source>
+ <translation type="unfinished">Copiar después de la tarifa</translation>
</message>
-</context>
-<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>
+ <source>Copy bytes</source>
+ <translation type="unfinished">Copiar bytes</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>
+ <source>Copy change</source>
+ <translation type="unfinished">Copiar cambio</translation>
</message>
</context>
<context>
@@ -316,66 +557,48 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
</context>
<context>
- <name>OptionsDialog</name>
- <message>
- <source>Font in the Overview tab: </source>
- <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
- </message>
- </context>
-<context>
- <name>PSBTOperationsDialog</name>
- <message>
- <source>Sends %1 to %2</source>
- <translation type="unfinished">Envía %1 a %2</translation>
- </message>
- </context>
-<context>
<name>RPCConsole</name>
<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>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</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>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
</message>
<message>
- <source>Session ID</source>
- <translation type="unfinished">Identificador de sesión</translation>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</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>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</translation>
</message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
<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>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta.</translation>
</message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
<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>
+ <source>Copy quantity</source>
+ <translation type="unfinished">Copiar cantidad</translation>
</message>
<message>
- <source>Node window - [%1]</source>
- <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ <source>Copy amount</source>
+ <translation type="unfinished">Copiar importe</translation>
</message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
<message>
- <source>Quantity:</source>
- <translation type="unfinished">Cantidad:</translation>
+ <source>Copy after fee</source>
+ <translation type="unfinished">Copiar después de la tarifa</translation>
</message>
<message>
- <source>%1 from wallet '%2'</source>
- <translation type="unfinished">%1 desde monedero '%2'</translation>
+ <source>Copy change</source>
+ <translation type="unfinished">Copiar cambio</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
@@ -386,6 +609,17 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
</context>
<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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 mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) 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 entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
+ </message>
+ </context>
+<context>
<name>TransactionDesc</name>
<message numerus="yes">
<source>matures in %n more block(s)</source>
@@ -395,64 +629,187 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</translation>
</message>
<message>
- <source>%1 (Certificate was not verified)</source>
- <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
+ <source>Amount</source>
+ <translation type="unfinished">Importe</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta.</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">Archivo separado de comas</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta.</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Dirección </translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Error en la transportación.</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletModel</name>
+ <message>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
+ </message>
+ <message>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Exportar </translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Datos del monedero </translation>
</message>
</context>
<context>
<name>bitcoin-core</name>
<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>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se ha podido eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</translation>
+ </message>
+ <message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/O.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Ha fallado el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/O.</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas del monedero supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora del ordenador parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj del ordenador, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</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 obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se han encontrado datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se ha encontrado un bloque corrupto que indica un posible fallo del hardware.</translation>
+ </message>
+ <message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">No se ha podido conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se ha podido desconectar el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se ha podido leer el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">No se ha podido escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</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>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
</message>
<message>
- <source>Error starting db txn for wallet transactions removal</source>
- <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</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>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</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>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</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>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la direcció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 la billetera 1%s
- </translation>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %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>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante ha devuelto un error: %s</translation>
</message>
<message>
- <source>Failure removing transaction: %s</source>
- <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</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>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
</message>
<message>
- <source>Wallet file creation failed: %s</source>
- <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %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>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta dirección.</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions. </source>
- <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
</message>
</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 2edd75a5da..75fe65e2b2 100644
--- a/src/qt/locale/bitcoin_es_SV.ts
+++ b/src/qt/locale/bitcoin_es_SV.ts
@@ -11,11 +11,11 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">Es Nuevo</translation>
+ <translation type="unfinished">&amp;Nueva</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copia la dirección actualmente seleccionada al portapapeles del sistema</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -27,41 +27,45 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Borrar de la lista la dirección seleccionada</translation>
+ <translation type="unfinished">Eliminar la dirección seleccionada de la lista</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Introduce una dirección o etiqueta para buscar</translation>
+ <translation type="unfinished">Ingresar una dirección o etiqueta para 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>
+ <translation type="unfinished">&amp;Exportar</translation>
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">&amp;Eliminar</translation>
+ <translation type="unfinished">&amp;Borrar</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Escoja la dirección a la que se enviarán monedas</translation>
+ <translation type="unfinished">Elige la dirección a la que se enviarán monedas</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Escoja la dirección donde quiere recibir monedas</translation>
+ <translation type="unfinished">Elige la dirección en la que se recibirán monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
- <translation type="unfinished">&amp;Escoger</translation>
+ <translation type="unfinished">&amp;Seleccionar</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>
+ <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 sus direcciones de Bitcoin para recibir los pagos.
-Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir para crear una nueva direccion. Firmar es posible solo con la direccion del tipo "legado"</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>
@@ -69,7 +73,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Copy &amp;Label</source>
- <translation type="unfinished">Copiar y etiquetar</translation>
+ <translation type="unfinished">Copiar &amp;etiqueta</translation>
</message>
<message>
<source>&amp;Edit</source>
@@ -77,7 +81,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Exportar la Lista de Direcciones</translation>
+ <translation type="unfinished">Exportar lista de direcciones</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -85,9 +89,17 @@ 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>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">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">Recepción de direcciones - %1
-</translation>
+ <translation type="unfinished">Direcciones de recepción - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -98,7 +110,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<name>AddressTableModel</name>
<message>
<source>Label</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">Etiqueta</translation>
</message>
<message>
<source>Address</source>
@@ -112,36 +124,44 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation type="unfinished">Diálogo de frase de contraseña</translation>
+ </message>
+ <message>
<source>Enter passphrase</source>
- <translation type="unfinished">Introduce contraseña actual</translation>
+ <translation type="unfinished">Ingresar la frase de contraseña</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Nueva contraseña</translation>
+ <translation type="unfinished">Nueva frase de contraseña</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Repita la nueva contraseña</translation>
+ <translation type="unfinished">Repetir la nueva frase de contraseña</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Mostrar contraseña</translation>
+ <translation type="unfinished">Mostrar la frase de contraseña</translation>
</message>
<message>
<source>Encrypt wallet</source>
- <translation type="unfinished">Encriptar la billetera</translation>
+ <translation type="unfinished">Encriptar billetera</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Esta operación necesita su contraseña de billetera para desbloquearla.</translation>
+ <translation type="unfinished">Esta operación requiere la frase de contraseña de la billetera para desbloquearla.</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">Desbloquear billetera</translation>
</message>
<message>
<source>Change passphrase</source>
- <translation type="unfinished">Cambia 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 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>
@@ -149,63 +169,75 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</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 quieres encriptar la billetera?</translation>
</message>
<message>
<source>Wallet encrypted</source>
- <translation type="unfinished">Billetera codificada</translation>
+ <translation type="unfinished">Billetera encriptada</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 la billetera. &lt;br/&gt;Por favor utiliza 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">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>
- <translation type="unfinished">Introduce la contraseña antigua y la nueva para el monedero.</translation>
+ <translation type="unfinished">Ingresa la antigua frase de contraseña y la nueva frase de contraseña para la billetera.</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</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 billetera no garantiza total protección de robo de tus bitcoins si tu ordenador es infectado con malware.</translation>
+ <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 cifrar</translation>
+ <translation type="unfinished">Billetera para encriptar</translation>
</message>
<message>
<source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Tu billetera esta por ser encriptada</translation>
+ <translation type="unfinished">Tu billetera está a punto de encriptarse.</translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Tu monedero está ahora cifrado</translation>
+ <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 respaldo anterior que hayas hecho del archivo de tu billetera debe ser reemplazado por el nuevo archivo encriptado que has generado. Por razones de seguridad, todos los respaldos realizados anteriormente serán inutilizables al momento de que utilices tu nueva billetera encriptada.</translation>
+ <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">Ha fallado el cifrado del monedero</translation>
+ <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">La encriptación de la billetera falló debido a un error interno. La billetera no se encriptó.</translation>
+ <translation type="unfinished">El encriptado de la billetera falló debido a un error interno. La billetera no se encriptó.</translation>
+ </message>
+ <message>
+ <source>The supplied passphrases do not match.</source>
+ <translation type="unfinished">Las frases de contraseña proporcionadas no coinciden.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">Ha fallado el desbloqueo del monedero</translation>
+ <translation type="unfinished">Falló el desbloqueo de la billetera</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera fue incorrecta.</translation>
+ <translation type="unfinished">La frase de contraseña introducida para el cifrado de la billetera 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 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>
+ <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 es correcto, 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 billetera ha sido cambiada.</translation>
+ <translation type="unfinished">La frase de contraseña de la billetera se cambió correctamente.</translation>
</message>
<message>
<source>Passphrase change failed</source>
@@ -215,23 +247,35 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<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>
+ <message>
+ <source>Warning: The Caps Lock key is on!</source>
+ <translation type="unfinished">Advertencia: ¡Las mayúsculas están activadas!</translation>
+ </message>
+</context>
<context>
<name>BanTableModel</name>
<message>
+ <source>IP/Netmask</source>
+ <translation type="unfinished">IP/Máscara de red</translation>
+ </message>
+ <message>
<source>Banned Until</source>
- <translation type="unfinished">Bloqueado hasta</translation>
+ <translation type="unfinished">Prohibido hasta</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">El archivo de configuración %1 puede estar dañado o no ser válido.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Excepción fuera de control</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Se ha producido un error garrafal. %1Ya no podrá continuar de manera segura y abandonará.</translation>
+ <translation type="unfinished">Se produjo un error fatal. %1 ya no puede continuar de manera segura y se cerrará.</translation>
</message>
<message>
<source>Internal error</source>
@@ -239,7 +283,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</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">Un error interno ocurrió. %1 intentará continuar. Este es un error inesperado que puede ser reportado de las formas que se muestran debajo,</translation>
+ <translation type="unfinished">Se produjo un error interno. %1 intentará continuar de manera segura. Este es un error inesperado que se puede reportar como se describe a continuación.</translation>
</message>
</context>
<context>
@@ -252,11 +296,19 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<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>
+ <translation type="unfinished">Se produjo un error fatal. Comprueba que el archivo de configuración soporte escritura o intenta ejecutar el programa con -nosettings.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 todavía no ha terminado de forma segura...</translation>
+ <translation type="unfinished">%1 aún no se cerró de forma segura...</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">desconocido</translation>
+ </message>
+ <message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">"%1" integrado</translation>
</message>
<message>
<source>Default system font "%1"</source>
@@ -268,11 +320,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Monto</translation>
+ <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">Ingresar una dirección de Bitcoin (por ejemplo, %1)</translation>
</message>
<message>
<source>Unroutable</source>
@@ -286,7 +338,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<message>
<source>Outbound</source>
<extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">Salida</translation>
+ <translation type="unfinished">Saliente</translation>
</message>
<message>
<source>Full Relay</source>
@@ -296,12 +348,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<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 bloque</translation>
- </message>
- <message>
- <source>Feeler</source>
- <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Sensor</translation>
+ <translation type="unfinished">Retransmisión de bloques</translation>
</message>
<message>
<source>Address Fetch</source>
@@ -309,10 +356,6 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Recuperación de dirección</translation>
</message>
<message>
- <source>%1 h</source>
- <translation type="unfinished">%1 d</translation>
- </message>
- <message>
<source>None</source>
<translation type="unfinished">Ninguno</translation>
</message>
@@ -362,28 +405,93 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<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>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
+ <source>&amp;Overview</source>
+ <translation type="unfinished">&amp;Vista general</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation type="unfinished">Muestra una vista general de la billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation type="unfinished">&amp;Transacciones</translation>
+ </message>
+ <message>
+ <source>Browse transaction history</source>
+ <translation type="unfinished">Explora el historial de transacciones</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished">&amp;Salir</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation type="unfinished">Salir del programa</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;Acerca de %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Mostrar Información sobre %1</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <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>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Modificar las opciones de configuración para %1</translation>
+ </message>
+ <message>
<source>Create a new wallet</source>
- <translation type="unfinished">Crear monedero nuevo</translation>
+ <translation type="unfinished">Crear una nueva billetera</translation>
</message>
<message>
<source>&amp;Minimize</source>
<translation type="unfinished">&amp;Minimizar</translation>
</message>
<message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">Actividad de red deshabilitada.</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">Proxy &lt;b&gt;habilitado&lt;/b&gt;: %1</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <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 monedero 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 el cifrado del monedero</translation>
+ <translation type="unfinished">Cambiar la frase de contraseña utilizada para encriptar la billetera</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -395,27 +503,35 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Cifrar monedero</translation>
+ <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 tu monedero</translation>
+ <translation type="unfinished">Encriptar las llaves privadas que pertenecen a tu billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera...</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <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 un mensaje para provar que usted es dueño de esta dirección</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>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Verificar mensaje...</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 el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -423,31 +539,23 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Cerrar monedero...</translation>
+ <translation type="unfinished">Cerrar billetera...</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Crear monedero...</translation>
+ <translation type="unfinished">Crear billetera...</translation>
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">Cerrar todos los monederos...</translation>
- </message>
- <message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;Archivo</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <translation type="unfinished">&amp;Configuración</translation>
+ <translation type="unfinished">Cerrar todas las billeteras...</translation>
</message>
<message>
- <source>Tabs toolbar</source>
- <translation type="unfinished">Barra de pestañas</translation>
+ <source>&amp;Help</source>
+ <translation type="unfinished">A&amp;yuda</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -463,31 +571,29 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con 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>
+ <translation type="unfinished">Solicitar pagos (genera código QR y URI's de Bitcoin)</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>
+ <translation type="unfinished">Editar la lista de las direcciones y etiquetas almacenadas</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>
+ <translation type="unfinished">Muestra la lista de direcciones de recepción y etiquetas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">opciones de la &amp;Linea de comandos</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>%n bloque procesado del historial de transacciones.</numerusform>
+ <numerusform>%n bloques procesados del historial de transacciones.</numerusform>
</translation>
</message>
<message>
@@ -495,20 +601,20 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<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>
+ <source>Last received block was generated %1 ago.</source>
+ <translation type="unfinished">El último bloque recibido fue generado hace %1</translation>
</message>
<message>
- <source>Warning</source>
- <translation type="unfinished">Aviso</translation>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">Las transacciones posteriores aún no son visibles.</translation>
</message>
<message>
- <source>Information</source>
- <translation type="unfinished">Información </translation>
+ <source>Warning</source>
+ <translation type="unfinished">Advertencia</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">Actualizado al dia </translation>
+ <translation type="unfinished">Actualizado al día </translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -516,35 +622,39 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Cargar PSBT 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 TBPF desde el &amp;portapapeles...</translation>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</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 del nodo</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de recepción</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Bitcoin: abrir URI</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Abrir monedero</translation>
+ <translation type="unfinished">Abrir billetera</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Abrir una cartera</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Cerrar cartera</translation>
</message>
<message>
<source>Restore Wallet…</source>
@@ -558,7 +668,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Cerrar todos los monederos</translation>
+ <translation type="unfinished">Cerrar todas las billeteras</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -569,20 +679,8 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<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">Monederos no disponibles</translation>
+ <translation type="unfinished">No hay billeteras disponibles</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -602,15 +700,19 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre del monedero</translation>
+ <translation type="unfinished">Nombre de la billetera </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>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -618,20 +720,20 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">M&amp;ostrar</translation>
+ <translation type="unfinished">&amp;Mostrar</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 conexiones activas con la red Bitcoin</numerusform>
- <numerusform>%n conexiones activas con la red Bitcoin </numerusform>
+ <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de 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">Hacer clic para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -650,7 +752,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -658,7 +760,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</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>
+ <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>
@@ -691,7 +793,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<message>
<source>Label: %1
</source>
- <translation type="unfinished">Etiqueta: %1
+ <translation type="unfinished">Etiqueta %1
</translation>
</message>
<message>
@@ -706,7 +808,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</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>
@@ -714,7 +816,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</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 clave HD está &lt;b&gt;deshabilitada&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -722,11 +824,11 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</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">La billetera está &lt;b&gt; encriptada &lt;/ b&gt; y actualmente &lt;b&gt; desbloqueada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt;encriptada&lt;/b&gt; y actualmente &lt;b&gt;desbloqueda&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">La billetera está encriptada y bloqueada recientemente</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt;encriptada&lt;/b&gt; y actualmente &lt;b&gt;bloqueda&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -737,7 +839,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<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 las cantidades. 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>
@@ -763,14 +865,42 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<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>
@@ -815,6 +945,14 @@ 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>
@@ -830,10 +968,19 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<source>change from %1 (%2)</source>
<translation type="unfinished">Cambio desde %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(cambio)</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">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>
@@ -860,12 +1007,12 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<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>
@@ -876,7 +1023,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</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>
+ <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.
@@ -885,10 +1032,10 @@ If this wallet contains any solvable but not watched scripts, a different and ne
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.
+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 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>
+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>
@@ -904,11 +1051,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
+ <translation type="unfinished">Los scripts solo de observación se migraron a una nueva billetera llamada "%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>
+ <translation type="unfinished">Los scripts solucionables pero no de observación se migraron a una nueva billetera llamada "%1".</translation>
</message>
<message>
<source>Migration failed</source>
@@ -922,22 +1069,22 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<context>
<name>OpenWalletActivity</name>
<message>
- <source>Open wallet warning</source>
- <translation type="unfinished">Advertencia sobre crear monedero</translation>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">Fallo al abrir billetera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera por defecto</translation>
+ <source>Open wallet warning</source>
+ <translation type="unfinished">Advertencia al abrir billetera</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 billetera</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 billetera &lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
</context>
<context>
@@ -945,12 +1092,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">Restaurar monedero</translation>
+ <translation type="unfinished">Restaurar billetera</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 monedero &lt;b&gt;%1&lt;/b&gt;…</translation>
+ <translation type="unfinished">Restaurando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
</message>
<message>
<source>Restore wallet failed</source>
@@ -971,39 +1118,63 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<context>
<name>WalletController</name>
<message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Cerrar billetera</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>
- <translation type="unfinished">Cerrar todos los monederos</translation>
+ <translation type="unfinished">Cerrar todas las billeteras</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>
+ </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>
+ <translation type="unfinished">Escribe un nombre y, si quieres, activa las opciones avanzadas.</translation>
</message>
<message>
<source>Wallet Name</source>
- <translation type="unfinished">Nombre del monedero</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <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 billetera</translation>
+ </message>
+ <message>
+ <source>Advanced Options</source>
+ <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">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>
@@ -1011,11 +1182,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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">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 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>
@@ -1028,42 +1203,62 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
<name>EditAddressDialog</name>
<message>
+ <source>Edit Address</source>
+ <translation type="unfinished">Editar dirección</translation>
+ </message>
+ <message>
<source>&amp;Label</source>
- <translation type="unfinished">Y etiqueta</translation>
+ <translation type="unfinished">&amp;Etiqueta</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 está en la lista de direcciones. Esto solo se puede modificar para enviar direcciones.</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>
- <translation type="unfinished">Y dirección</translation>
+ <translation type="unfinished">&amp;Dirección</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>
<translation type="unfinished">Editar dirección de recepción</translation>
</message>
<message>
+ <source>Edit sending address</source>
+ <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>
+ <translation type="unfinished">No se pudo desbloquear la billetera.</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>
@@ -1074,15 +1269,19 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
- <translation type="unfinished">El directorio ya existe. Añada %1 si pretende crear aquí un directorio nuevo.</translation>
+ <translation type="unfinished">El directorio ya existe. Agrega %1 si deseas crear un nuevo directorio aquí.</translation>
+ </message>
+ <message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">Ruta de acceso existente, pero 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>
@@ -1097,15 +1296,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>(de %n GB necesario)</numerusform>
+ <numerusform>(de %n GB necesarios)</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 necesario para completar la cadena)</numerusform>
+ <numerusform>(%n GB necesarios para completar la cadena)</numerusform>
</translation>
</message>
<message>
@@ -1113,8 +1312,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Elegir directorio de datos</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">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán 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án aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1130,23 +1333,35 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished">El monedero también se almacenará 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">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 esta la primera vez que se ejecuta el programa, puedes escoger donde %1 almacenará los 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">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">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>
@@ -1154,20 +1369,24 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 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>
- <translation type="unfinished">Usa el directorio de datos predeterminado</translation>
+ <translation type="unfinished">Usar el directorio de datos predeterminado</translation>
</message>
<message>
<source>Use a custom data directory:</source>
- <translation type="unfinished">Usa un directorio de datos personalizado:</translation>
+ <translation type="unfinished">Usar un directorio de datos personalizado:</translation>
</message>
</context>
<context>
<name>HelpMessageDialog</name>
<message>
+ <source>version</source>
+ <translation type="unfinished">versión</translation>
+ </message>
+ <message>
<source>About %1</source>
<translation type="unfinished">Acerca de %1</translation>
</message>
@@ -1177,6 +1396,17 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 apagues la computadora hasta que desaparezca esta ventana.</translation>
+ </message>
+</context>
+<context>
<name>ModalOverlay</name>
<message>
<source>Form</source>
@@ -1184,31 +1414,51 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 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á si se intenta gastar bitcoins afectados por las transacciones que aún no se muestran.</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">Numero de bloques pendientes</translation>
+ <translation type="unfinished">Número de bloques restantes</translation>
</message>
<message>
<source>Unknown…</source>
<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>
<message>
+ <source>Progress</source>
+ <translation type="unfinished">Progreso</translation>
+ </message>
+ <message>
<source>Progress increase per hour</source>
- <translation type="unfinished">Incremento del progreso por hora</translation>
+ <translation type="unfinished">Avance del progreso por hora</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">Tiempo estimado restante hasta la sincronización</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <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 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>
@@ -1238,16 +1488,24 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">&amp;Principal</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>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
- <translation type="unfinished">&amp;Iniciar %1 al iniciar el sistema</translation>
+ <translation type="unfinished">&amp;Iniciar %1 al iniciar sesión en el sistema</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">Al activar el modo pruning, 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>
+ <translation type="unfinished">Al activar el 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>Size of &amp;database cache</source>
+ <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>
@@ -1255,15 +1513,19 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 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">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>
+ <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>
+ <translation type="unfinished">Fuente en la pestaña "Vista general":</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
@@ -1286,6 +1548,10 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">&amp;Restablecer opciones</translation>
</message>
<message>
+ <source>&amp;Network</source>
+ <translation type="unfinished">&amp;Red</translation>
+ </message>
+ <message>
<source>Prune &amp;block storage to</source>
<translation type="unfinished">Podar el almacenamiento de &amp;bloques a</translation>
</message>
@@ -1301,7 +1567,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1310,7 +1576,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
+ <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>
@@ -1324,7 +1590,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
+ <translation type="unfinished">Si se resta o no la comisión del importe por defecto.</translation>
</message>
<message>
<source>Subtract &amp;fee from amount by default</source>
@@ -1332,8 +1598,16 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Restar &amp;comisión del importe por defecto</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">Experto</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <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 deshabilita 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 cómo se calcula su saldo.</translation>
+ <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>
@@ -1342,12 +1616,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1359,7 +1633,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 de Bitcoin en el router. Esto funciona solo cuando tu router es compatible con UPnP y está habilitado.</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">Asignar puerto usando &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>
@@ -1370,24 +1648,36 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
</message>
<message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">Aceptar conexiones externas.</translation>
+ </message>
+ <message>
<source>Allow incomin&amp;g connections</source>
- <translation type="unfinished">Permitir conexiones entrantes</translation>
+ <translation type="unfinished">&amp;Permitir conexiones entrantes</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
- <translation type="unfinished">Conectar a la red de Bitcoin a través de un proxy SOCKS5.</translation>
+ <translation type="unfinished">Conectarse a la red de Bitcoin a través de un proxy SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">&amp;Conectarse a través del proxy SOCKS5 (proxy predeterminado):</translation>
+ </message>
+ <message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">&amp;IP del proxy:</translation>
</message>
<message>
<source>&amp;Port:</source>
- <translation type="unfinished">Puerto:</translation>
+ <translation type="unfinished">&amp;Puerto:</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>
- <translation type="unfinished">Utilizado para llegar a los compañeros a través de:</translation>
+ <translation type="unfinished">Usado para conectarse con pares a través de:</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -1399,15 +1689,23 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>&amp;Show tray icon</source>
- <translation type="unfinished">Mostrar la &amp;bandeja del sistema.</translation>
+ <translation type="unfinished">&amp;Mostrar el ícono de la bandeja</translation>
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
- <translation type="unfinished">Muestra solo un ícono en la bandeja después de minimizar la ventana</translation>
+ <translation type="unfinished">Mostrar solo un ícono de bandeja después de minimizar la ventana.</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize to the tray instead of the taskbar</source>
+ <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">Minimice al cerrar</translation>
+ <translation type="unfinished">&amp;Minimizar al cerrar</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">&amp;Visualización</translation>
</message>
<message>
<source>User Interface &amp;language:</source>
@@ -1415,15 +1713,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
- <translation type="unfinished">El idioma de la interfaz de usuario puede establecerse aquí. Esta configuración tendrá efecto después de reiniciar %1.</translation>
+ <translation type="unfinished">El idioma de la interfaz de usuario puede establecerse aquí. Esta configuración surtirá efecto después de reiniciar %1.</translation>
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
- <translation type="unfinished">&amp;Unidad en la que mostrar cantitades:</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>
@@ -1431,7 +1729,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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">Si se muestran o no las funcionalidades 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">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>
@@ -1439,12 +1745,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>&amp;Cancel</source>
- <translation type="unfinished">Cancelar</translation>
+ <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>
@@ -1457,7 +1763,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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">Confirmar reestablecimiento de las opciones</translation>
+ <translation type="unfinished">Confirmar restablecimiento de opciones</translation>
</message>
<message>
<source>Client restart required to activate changes.</source>
@@ -1467,12 +1773,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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 ajustes actuales se guardarán en «%1».</translation>
+ <translation type="unfinished">Se realizará una copia de seguridad de la configuración actual en "%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">El cliente será cluasurado. Quieres proceder?</translation>
+ <translation type="unfinished">El cliente se cerrará. ¿Quieres continuar?</translation>
</message>
<message>
<source>Configuration options</source>
@@ -1482,7 +1788,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1494,14 +1800,22 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The configuration file could not be opened.</source>
- <translation type="unfinished">El archivo de configuración no se pudo abrir.</translation>
+ <translation type="unfinished">No se pudo abrir el archivo de configuración.</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">Estos cambios requieren reiniciar el cliente.</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">La dirección del proxy proporcionada es inválida.</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
<source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">No se puede leer el ajuste «%1», %2.</translation>
+ <translation type="unfinished">No se puede leer la configuración "%1", %2.</translation>
</message>
</context>
<context>
@@ -1512,7 +1826,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 Bitcoin después de que se haya establecido una conexión, pero este proceso aún no se ha completado.</translation>
+ <translation type="unfinished">La información mostrada puede estar desactualizada. La billetera 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 de observación:</translation>
</message>
<message>
<source>Available:</source>
@@ -1520,7 +1838,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Your current spendable balance</source>
- <translation type="unfinished">Su balance actual gastable</translation>
+ <translation type="unfinished">Tu saldo disponible para gastar actualmente</translation>
</message>
<message>
<source>Pending:</source>
@@ -1528,15 +1846,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 se deben confirmar y que no se contabilizan dentro del saldo disponible para gastar</translation>
</message>
<message>
<source>Immature:</source>
- <translation type="unfinished">No disponible:</translation>
+ <translation type="unfinished">Inmaduro:</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>
@@ -1544,15 +1862,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Your current total balance</source>
- <translation type="unfinished">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">Tu saldo actual en solo ver direcciones</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>
@@ -1560,30 +1878,34 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 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 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 vista general. Para mostrar los valores, anule 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>
- <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>
@@ -1599,7 +1921,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 al cargar la transacción: %1</translation>
</message>
<message>
<source>Failed to sign transaction: %1</source>
@@ -1610,22 +1932,34 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">No se pueden firmar entradas mientras la billetera está bloqueada.</translation>
</message>
<message>
+ <source>Could not sign any more inputs.</source>
+ <translation type="unfinished">No se pudieron firmar más entradas.</translation>
+ </message>
+ <message>
<source>Signed %1 inputs, but more signatures are still required.</source>
- <translation type="unfinished">Se han firmado %1 entradas, pero aún se requieren más firmas.</translation>
+ <translation type="unfinished">Se firmaron %1 entradas, pero aún se requieren más firmas.</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 firmó correctamente y está lista para transmitirse.</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">Error desconocido al procesar la transacción.</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 transmitió correctamente! Identificador de transacción: %1</translation>
</message>
<message>
<source>Transaction broadcast failed: %1</source>
<translation type="unfinished">Error al transmitir la transacción: %1</translation>
</message>
<message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">TBPF copiada al portapapeles.</translation>
+ </message>
+ <message>
<source>Save Transaction Data</source>
<translation type="unfinished">Guardar datos de la transacción</translation>
</message>
@@ -1636,7 +1970,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
@@ -1644,19 +1978,19 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>own address</source>
- <translation type="unfinished">dirección personal</translation>
+ <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 puede calcular la comisión o el importe total de la transacción.</translation>
</message>
<message>
<source>Pays transaction fee: </source>
- <translation type="unfinished">Pagar comisión de transacción:</translation>
+ <translation type="unfinished">Paga comisión de transacción:</translation>
</message>
<message>
<source>Total Amount</source>
- <translation type="unfinished">Cantidad total</translation>
+ <translation type="unfinished">Importe total</translation>
</message>
<message>
<source>or</source>
@@ -1664,17 +1998,37 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Transaction has %1 unsigned inputs.</source>
- <translation type="unfinished">La transacción tiene %1 entradas no firmadas.</translation>
+ <translation type="unfinished">La transacción tiene %1 entradas sin firmar.</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">Falta información sobre las entradas de la transacción.</translation>
+ </message>
+ <message>
+ <source>Transaction still needs signature(s).</source>
+ <translation type="unfinished">La transacción aún necesita firma(s).</translation>
</message>
<message>
<source>(But no wallet is loaded.)</source>
<translation type="unfinished">(Pero no se cargó ninguna billetera).</translation>
</message>
- </context>
+ <message>
+ <source>(But this wallet cannot sign transactions.)</source>
+ <translation type="unfinished">(Pero esta billetera no puede firmar transacciones).</translation>
+ </message>
+ <message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(Pero esta billetera 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 firmó completamente y está lista para transmitirse.</translation>
+ </message>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">El estado de la transacción es desconocido.</translation>
+ </message>
+</context>
<context>
<name>PaymentServer</name>
<message>
@@ -1682,20 +2036,32 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Error en la solicitud de pago</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">No se puede iniciar el controlador "bitcoin: click-to-pay"</translation>
+ </message>
+ <message>
+ <source>URI handling</source>
+ <translation type="unfinished">Gestión de URI</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 soporta 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 billetera.
+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 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>
- <translation type="unfinished">Manejo del archivo de solicitud de pago</translation>
+ <translation type="unfinished">Gestión del archivo de solicitud de pago</translation>
</message>
</context>
<context>
@@ -1713,12 +2079,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
+ <translation type="unfinished">Dirección</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">Expedido</translation>
+ <translation type="unfinished">Enviado</translation>
</message>
<message>
<source>Received</source>
@@ -1748,7 +2119,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Outbound</source>
<extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">Salida</translation>
+ <translation type="unfinished">Saliente</translation>
</message>
</context>
<context>
@@ -1758,8 +2129,16 @@ 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>
+ <translation type="unfinished">El URI resultante es demasiado largo, así que trata 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>
@@ -1782,24 +2161,28 @@ 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>
<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>
+ <source>Datadir</source>
+ <translation type="unfinished">Directorio de datos</translation>
</message>
<message>
- <source>Blocksdir</source>
- <translation type="unfinished">Bloques dir</translation>
+ <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>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 ubicación no predeterminada del directorio de bloques, usa la opción "%1".</translation>
</message>
<message>
<source>Startup time</source>
- <translation type="unfinished">Hora de inicio</translation>
+ <translation type="unfinished">Tiempo de inicio</translation>
</message>
<message>
<source>Network</source>
@@ -1814,24 +2197,40 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
<message>
<source>Memory Pool</source>
- <translation type="unfinished">Grupo de memoria</translation>
+ <translation type="unfinished">Pool de memoria</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <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>
- <translation type="unfinished">Monedero:</translation>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <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>
@@ -1839,7 +2238,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Sent</source>
- <translation type="unfinished">Expedido</translation>
+ <translation type="unfinished">Enviado</translation>
</message>
<message>
<source>&amp;Peers</source>
@@ -1854,6 +2253,10 @@ 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>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -1862,14 +2265,14 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
</message>
@@ -1879,19 +2282,27 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</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>
<translation type="unfinished">Encabezados sincronizados</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">Bloques sincronizados</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">Última transacción</translation>
</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>
</message>
<message>
<source>Whether we relay addresses to this peer.</source>
@@ -1901,17 +2312,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 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 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 se desestimaron (no se procesaron) debido a la limitación de volumen.</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -1921,7 +2332,7 @@ 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 omitidas por limitación de volumen</translation>
+ <translation type="unfinished">Direcciones desestimadas por limitación de volumen</translation>
</message>
<message>
<source>User Agent</source>
@@ -1929,7 +2340,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>Current block height</source>
@@ -1937,15 +2348,19 @@ 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 en el directorio de datos actual. Esto puede tardar unos segundos para los archivos de registro grandes.</translation>
+ <translation type="unfinished">Abrir el archivo de registro de depuración %1 en el directorio de datos actual. Esto puede tardar unos segundos para los archivos de registro grandes.</translation>
</message>
<message>
<source>Decrease font size</source>
- <translation type="unfinished">Reducir el tamaño de la fuente</translation>
+ <translation type="unfinished">Disminuir tamaño de fuente</translation>
</message>
<message>
<source>Increase font size</source>
- <translation type="unfinished">Aumentar el tamaño de la fuente</translation>
+ <translation type="unfinished">Aumentar tamaño de fuente</translation>
+ </message>
+ <message>
+ <source>Permissions</source>
+ <translation type="unfinished">Permisos</translation>
</message>
<message>
<source>The direction and type of peer connection: %1</source>
@@ -1956,8 +2371,12 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</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 mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
<message>
<source>Services</source>
@@ -1965,13 +2384,17 @@ 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">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>
<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>
@@ -1990,27 +2413,35 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Last Receive</source>
- <translation type="unfinished">Ultima recepción</translation>
+ <translation type="unfinished">Última recepción</translation>
</message>
<message>
<source>Ping Time</source>
- <translation type="unfinished">Tiempo de Ping</translation>
+ <translation type="unfinished">Tiempo de ping</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">La duración de un ping actualmente pendiente.</translation>
</message>
<message>
<source>Ping Wait</source>
- <translation type="unfinished">Espera de Ping</translation>
+ <translation type="unfinished">Espera de ping</translation>
</message>
<message>
<source>Min Ping</source>
<translation type="unfinished">Ping mínimo</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation type="unfinished">Desfase temporal</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Hora del último bloque</translation>
</message>
<message>
<source>&amp;Open</source>
- <translation type="unfinished">Abierto</translation>
+ <translation type="unfinished">&amp;Abrir</translation>
</message>
<message>
<source>&amp;Console</source>
@@ -2018,7 +2449,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>
@@ -2026,11 +2457,11 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Debug log file</source>
- <translation type="unfinished">Archivo de registro de depuración</translation>
+ <translation type="unfinished">Archivo del registro de depuración</translation>
</message>
<message>
<source>Clear console</source>
- <translation type="unfinished">Limpiar Consola</translation>
+ <translation type="unfinished">Borrar consola</translation>
</message>
<message>
<source>In:</source>
@@ -2038,17 +2469,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Out:</source>
- <translation type="unfinished">Fuera:</translation>
+ <translation type="unfinished">Salida:</translation>
</message>
<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>
@@ -2063,7 +2494,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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">Feeler saliente: de corta duración, para probar direcciones</translation>
</message>
<message>
<source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
@@ -2078,7 +2509,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin encriptar</translation>
</message>
<message>
<source>v2: BIP324 encrypted transport protocol</source>
@@ -2095,7 +2526,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</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>
@@ -2103,35 +2534,55 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">&amp;Copiar dirección</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">&amp;Desconectar</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
- <translation type="unfinished">1 hora</translation>
+ <translation type="unfinished">1 &amp;hora</translation>
</message>
<message>
<source>1 d&amp;ay</source>
<translation type="unfinished">1 &amp;día</translation>
</message>
<message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 &amp;semana</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 &amp;año</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>
</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>
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
- <translation type="unfinished">Ejecutar comando sin monedero</translation>
+ <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>
+ <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.
@@ -2140,12 +2591,13 @@ 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.
+ <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 un resumen de los comandos disponibles. Para más información sobre cómo usar esta consola, escribe %6.
+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 comandos aquí, robando el contenido de sus monederos. 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>
@@ -2162,11 +2614,11 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Yes</source>
- <translation type="unfinished">Si</translation>
+ <translation type="unfinished">Sí</translation>
</message>
<message>
<source>To</source>
- <translation type="unfinished">Para</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>From</source>
@@ -2174,11 +2626,11 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Ban for</source>
- <translation type="unfinished">Bloqueo para</translation>
+ <translation type="unfinished">Prohibir por</translation>
</message>
<message>
<source>Never</source>
- <translation type="unfinished">nunca</translation>
+ <translation type="unfinished">Nunca</translation>
</message>
<message>
<source>Unknown</source>
@@ -2192,28 +2644,32 @@ 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>
<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 adjunto a la solicitud de pago, que será mostrado cuando la solicitud sea abierta. Nota: Este mensaje no será enviado con el pago a través de la red Bitcoin.</translation>
+ <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>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>
- <translation type="unfinished">Use este formulario para solicitar pagos. Todos los campos son &lt;b&gt; opcionales &lt;/ b&gt;.</translation>
+ <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. Deje esto vacío o en cero para no solicitar una cantidad específica.</translation>
+ <translation type="unfinished">Un importe opcional para solicitar. Déjalo vacío o ingresa cero para no solicitar un importe específico.</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">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>
@@ -2221,29 +2677,37 @@ Escribe %5 para ver un resumen de los comandos 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">Borre todos los campos del formulario.</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Clear</source>
- <translation type="unfinished">Aclarar</translation>
+ <translation type="unfinished">Borrar</translation>
</message>
<message>
<source>Requested payments history</source>
- <translation type="unfinished">Historial de pagos solicitado</translation>
+ <translation type="unfinished">Historial de pagos solicitados</translation>
</message>
<message>
<source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Muestra la petición seleccionada (También doble clic)</translation>
+ <translation type="unfinished">Mostrar la solicitud seleccionada (equivale a hacer doble clic en una entrada)</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>
@@ -2280,8 +2744,12 @@ 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 la billetera.</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>
+ <translation type="unfinished">No se pudo generar nueva dirección %1</translation>
</message>
</context>
<context>
@@ -2291,16 +2759,32 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
<translation type="unfinished">Solicitar pago a...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">Dirección:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation type="unfinished">Importe:</translation>
</message>
<message>
+ <source>Label:</source>
+ <translation type="unfinished">Etiqueta:</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">Mensaje:</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">Copiar &amp;URI</translation>
</message>
<message>
<source>Copy &amp;Address</source>
- <translation type="unfinished">&amp;Copia dirección</translation>
+ <translation type="unfinished">Copiar &amp;dirección</translation>
</message>
<message>
<source>&amp;Verify</source>
@@ -2308,18 +2792,34 @@ Escribe %5 para ver un resumen de los comandos 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, por ejemplo, en la pantalla de una billetera de hardware</translation>
+ <translation type="unfinished">Verificar esta dirección, por ejemplo, en la pantalla de una billetera de hardware.</translation>
</message>
<message>
<source>&amp;Save Image…</source>
<translation type="unfinished">&amp;Guardar imagen...</translation>
</message>
- </context>
+ <message>
+ <source>Payment information</source>
+ <translation type="unfinished">Información del pago</translation>
+ </message>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">Solicitar pago a %1</translation>
+ </message>
+</context>
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">Fecha</translation>
+ </message>
+ <message>
<source>Label</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">Etiqueta</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">Mensaje</translation>
</message>
<message>
<source>(no label)</source>
@@ -2331,7 +2831,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>(no amount requested)</source>
- <translation type="unfinished">(sin importe solicitado)</translation>
+ <translation type="unfinished">(no se solicitó un importe)</translation>
</message>
<message>
<source>Requested</source>
@@ -2346,11 +2846,15 @@ Escribe %5 para ver un resumen de los comandos 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>
+ <translation type="unfinished">seleccionado automáticamente</translation>
</message>
<message>
<source>Insufficient funds!</source>
- <translation type="unfinished">Fondos insuficientes!</translation>
+ <translation type="unfinished">Fondos insuficientes</translation>
</message>
<message>
<source>Quantity:</source>
@@ -2369,20 +2873,36 @@ 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>
+ <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>
+ <translation type="unfinished">Dirección de cambio personalizada</translation>
</message>
<message>
<source>Transaction Fee:</source>
- <translation type="unfinished">Comisión transacción:</translation>
+ <translation type="unfinished">Comisión de transacción:</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">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>
- <translation type="unfinished">Advertencia: En este momento no se puede estimar la cuota.</translation>
+ <translation type="unfinished">Advertencia: En este momento no se puede estimar la comisión.</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">por kilobyte</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">Ocultar</translation>
</message>
<message>
<source>Recommended:</source>
@@ -2394,11 +2914,15 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</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>
+ <translation type="unfinished">Agregar &amp;destinatario</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation type="unfinished">Borre todos los campos del formulario.</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Inputs…</source>
@@ -2422,23 +2946,31 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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">(La comisión inteligente no se ha inicializado todavía. Esto tarda normalmente algunos bloques…)</translation>
</message>
<message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">Objetivo de tiempo de confirmación:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <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>
- <translation type="unfinished">Limpiar &amp;todo</translation>
+ <translation type="unfinished">Borrar &amp;todo</translation>
</message>
<message>
<source>Balance:</source>
@@ -2446,7 +2978,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Confirm the send action</source>
- <translation type="unfinished">Confirma el envio</translation>
+ <translation type="unfinished">Confirmar el envío</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">&amp;Enviar</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -2454,33 +2990,53 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy amount</source>
- <translation type="unfinished">Copiar cantidad</translation>
+ <translation type="unfinished">Copiar importe</translation>
</message>
<message>
<source>Copy fee</source>
- <translation type="unfinished">Tarifa de copia</translation>
+ <translation type="unfinished">Copiar comisión</translation>
</message>
<message>
<source>Copy after fee</source>
<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 (%2 blocks)</source>
+ <translation type="unfinished">%1 (%2 bloques)</translation>
+ </message>
+ <message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
<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 billetera 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 -&gt; Monedero</translation>
+ <translation type="unfinished">Establecer la ruta al script del firmante externo en "Opciones -&gt; Billetera"</translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <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 (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</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>
+ <translation type="unfinished">%1 a '%2'</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2492,17 +3048,17 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -2516,7 +3072,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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>
@@ -2528,11 +3084,16 @@ 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>
+ <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">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>
+ <translation type="unfinished">%1 desde billetera "%2"</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
@@ -2542,38 +3103,42 @@ 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 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>
+ <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>
<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 indica remplazar-por-comisión, BIP-125.</translation>
+ <translation type="unfinished">No indica "Remplazar por comisión", BIP-125.</translation>
</message>
<message>
<source>Total Amount</source>
- <translation type="unfinished">Cantidad total</translation>
+ <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 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 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 envío de monedas</translation>
</message>
<message>
<source>Watch-only balance:</source>
@@ -2585,7 +3150,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">La cantidad por pagar tiene que 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>
@@ -2593,38 +3158,42 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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 tasa 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">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>
+ <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 inválida</translation>
</message>
<message>
<source>Warning: Unknown change address</source>
- <translation type="unfinished">Peligro: Dirección de cambio desconocida</translation>
+ <translation type="unfinished">Advertencia: Dirección de cambio desconocida</translation>
</message>
<message>
<source>Confirm custom change address</source>
- <translation type="unfinished">Confirmar dirección de cambio personalizada</translation>
+ <translation type="unfinished">Confirmar la dirección de cambio personalizada</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">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 esta billetera. Una parte o la totalidad de los fondos en la billetera se enviará a esta dirección. ¿Seguro deseas continuar?</translation>
</message>
<message>
<source>(no label)</source>
@@ -2635,11 +3204,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation type="unfinished">Ca&amp;ntidad:</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>Pay &amp;To:</source>
- <translation type="unfinished">&amp;Pagar a:</translation>
+ <translation type="unfinished">Pagar &amp;a:</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;Etiqueta:</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -2647,7 +3220,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -2662,16 +3235,28 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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 se deducirá del importe que se envía. El destinatario recibirá menos bitcoins que los que ingreses en el campo del importe. Si se seleccionan varios destinatarios, la comisión se dividirá por igual.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">&amp;Restar la comisión del importe</translation>
+ </message>
+ <message>
<source>Use available balance</source>
<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>
<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>
@@ -2689,19 +3274,19 @@ 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>
- <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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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 mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) 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>
@@ -2712,6 +3297,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Pegar dirección desde el portapapeles</translation>
</message>
<message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">Ingresar aquí el mensaje que deseas firmar</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">Firma</translation>
</message>
@@ -2721,27 +3310,31 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
- <translation type="unfinished">Firmar Mensaje</translation>
+ <translation type="unfinished">Firmar &amp;mensaje</translation>
</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>
- <translation type="unfinished">&amp;Firmar Mensaje</translation>
+ <translation type="unfinished">&amp;Verificar mensaje</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">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 está en el mensaje firmado en sí, para evitar ser víctima de un engaño por ataque de intermediario. Ten en cuenta que esto solo demuestra que el firmante recibe con la 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">La dirección Bitcoin con la que se firmó 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>
@@ -2749,39 +3342,51 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The signature given when the message was signed</source>
- <translation type="unfinished">La firma proporcionada cuando el mensaje fue firmado</translation>
+ <translation type="unfinished">La firma que se dio cuando el mensaje se firmó</translation>
</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>
<translation type="unfinished">Verificar &amp;mensaje</translation>
</message>
<message>
+ <source>Reset all verify message fields</source>
+ <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 ingresada es invá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 legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">La dirección introducida no corresponde a una clave.</translation>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">Se canceló el desbloqueo de la billetera.</translation>
</message>
<message>
<source>No error</source>
- <translation type="unfinished">No hay error</translation>
+ <translation type="unfinished">Sin error </translation>
+ </message>
+ <message>
+ <source>Private key for the entered address is not available.</source>
+ <translation type="unfinished">La clave privada para la dirección ingresada no está disponible.</translation>
</message>
<message>
<source>Message signing failed.</source>
- <translation type="unfinished">Ha fallado la firma del mensaje.</translation>
+ <translation type="unfinished">Error al firmar el mensaje.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -2793,30 +3398,43 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Please check the signature and try again.</source>
- <translation type="unfinished">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>
- </context>
+ <message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">Falló la verificación del mensaje.</translation>
+ </message>
+ <message>
+ <source>Message verified.</source>
+ <translation type="unfinished">Mensaje verificado.</translation>
+ </message>
+</context>
<context>
<name>SplashScreen</name>
<message>
<source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(presione la tecla q para apagar y continuar después)</translation>
+ <translation type="unfinished">(Presionar q para apagar y seguir luego)</translation>
</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>
<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">Hay un conflicto con una transacción con %1 confirmaciones</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/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>
@@ -2836,33 +3454,57 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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">confirmaciones %1</translation>
+ <translation type="unfinished">%1 confirmaciones</translation>
</message>
<message>
<source>Status</source>
<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>
+ <translation type="unfinished">Origen</translation>
+ </message>
+ <message>
+ <source>Generated</source>
+ <translation type="unfinished">Generado</translation>
</message>
<message>
<source>From</source>
<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>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>own address</source>
- <translation type="unfinished">dirección personal</translation>
+ <translation type="unfinished">dirección propia</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
+ </message>
+ <message>
+ <source>label</source>
+ <translation type="unfinished">etiqueta</translation>
+ </message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">Crédito</translation>
</message>
<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>
@@ -2870,16 +3512,32 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">no aceptada</translation>
</message>
<message>
+ <source>Debit</source>
+ <translation type="unfinished">Débito</translation>
+ </message>
+ <message>
<source>Total debit</source>
- <translation type="unfinished">Total enviado</translation>
+ <translation type="unfinished">Débito total</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation type="unfinished">Crédito total</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>Net amount</source>
- <translation type="unfinished">Cantidad total</translation>
+ <translation type="unfinished">Importe neto</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>
@@ -2887,7 +3545,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -2895,7 +3553,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Output index</source>
- <translation type="unfinished">Indice de salida</translation>
+ <translation type="unfinished">Ãndice de salida</translation>
</message>
<message>
<source>%1 (Certificate was not verified)</source>
@@ -2903,11 +3561,19 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Merchant</source>
- <translation type="unfinished">Vendedor</translation>
+ <translation type="unfinished">Comerciante</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">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>
+ <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>
+ <translation type="unfinished">Información de depuración</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">Transacción</translation>
</message>
<message>
<source>Inputs</source>
@@ -2921,35 +3587,59 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<source>true</source>
<translation type="unfinished">verdadero</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">falso</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
<source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Este panel muestra una descripción detallada de la transacción</translation>
+ <translation type="unfinished">En este panel se muestra una descripción detallada de la transacción</translation>
+ </message>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">Detalles para %1</translation>
</message>
- </context>
+</context>
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">Fecha</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">Tipo</translation>
</message>
<message>
<source>Label</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">Etiqueta</translation>
+ </message>
+ <message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">Sin confirmar</translation>
</message>
<message>
<source>Abandoned</source>
<translation type="unfinished">Abandonada</translation>
</message>
<message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">Confirmando (%1 de %2 confirmaciones recomendadas)</translation>
+ </message>
+ <message>
<source>Confirmed (%1 confirmations)</source>
<translation type="unfinished">Confirmada (%1 confirmaciones)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">En conflicto</translation>
+ </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>
@@ -2957,11 +3647,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Received with</source>
- <translation type="unfinished">Recibido con</translation>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Received from</source>
- <translation type="unfinished">Recibido de</translation>
+ <translation type="unfinished">Recibida de</translation>
</message>
<message>
<source>Sent to</source>
@@ -2969,17 +3659,41 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">(n/d)</translation>
</message>
<message>
<source>(no label)</source>
<translation type="unfinished">(sin etiqueta)</translation>
</message>
<message>
+ <source>Transaction status. Hover over this field to show number of confirmations.</source>
+ <translation type="unfinished">Estado de la transacción. Pasa el mouse 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 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 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">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 restado del saldo o sumado a este.</translation>
</message>
@@ -2987,6 +3701,14 @@ 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>
@@ -2996,11 +3718,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Last month</source>
- <translation type="unfinished">El mes pasado </translation>
+ <translation type="unfinished">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>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Sent to</source>
@@ -3008,7 +3734,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
</message>
<message>
<source>Other</source>
@@ -3016,7 +3742,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -3040,11 +3766,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Copiar &amp;ID de la transacción</translation>
+ <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;raw</translation>
+ <translation type="unfinished">Copiar transacción &amp;sin procesar</translation>
</message>
<message>
<source>Copy full transaction &amp;details</source>
@@ -3085,32 +3811,44 @@ 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>Watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Fecha</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">Tipo</translation>
</message>
<message>
<source>Label</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">Etiqueta</translation>
</message>
<message>
<source>Address</source>
<translation type="unfinished">Dirección</translation>
</message>
<message>
+ <source>ID</source>
+ <translation type="unfinished">Identificador</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<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 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>
- <translation type="unfinished">Exportación satisfactoria</translation>
+ <translation type="unfinished">Exportación correcta</translation>
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">El historial de transacciones ha sido guardado exitosamente en %1</translation>
+ <translation type="unfinished">El historial de transacciones se guardó correctamente en %1.</translation>
</message>
<message>
<source>Range:</source>
@@ -3128,22 +3866,34 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<translation type="unfinished">No se cargó ninguna billetera.
-Ir a Archivo &gt; Abrir billetera para cargar una.
-- OR -</translation>
+Ir a "Archivo &gt; Abrir billetera" para cargar una.
+- O -</translation>
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Crear monedero nuevo</translation>
+ <translation type="unfinished">Crear una nueva billetera</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>
+ <translation type="unfinished">Cargar datos de la transacción</translation>
</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>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <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 TBPF</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -3152,20 +3902,32 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>Fee bump error</source>
- <translation type="unfinished">Error de incremento de cuota</translation>
+ <translation type="unfinished">Error de incremento de comisión</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">Fallo al incrementar la comisión de transacción</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">¿Desea incrementar la cuota?</translation>
+ <translation type="unfinished">¿Deseas incrementar la comisión?</translation>
+ </message>
+ <message>
+ <source>Current fee:</source>
+ <translation type="unfinished">Comisión actual:</translation>
</message>
<message>
<source>Increase:</source>
<translation type="unfinished">Incremento:</translation>
</message>
<message>
+ <source>New fee:</source>
+ <translation type="unfinished">Nueva comisión:</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">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>
@@ -3173,43 +3935,46 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>Can't draft transaction.</source>
- <translation type="unfinished">No se pudo preparar la transacción.</translation>
+ <translation type="unfinished">No se puede crear un borrador de la transacción.</translation>
</message>
<message>
<source>PSBT copied</source>
- <translation type="unfinished">TBPF copiada </translation>
+ <translation type="unfinished">TBPF copiada</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
- <translation type="unfinished">No se ha podido firmar la transacción.</translation>
+ <translation type="unfinished">No se puede firmar la transacción.</translation>
</message>
<message>
<source>Could not commit transaction</source>
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera por defecto</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
<name>WalletView</name>
<message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Exportar</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>Backup Wallet</source>
- <translation type="unfinished">Respaldo de monedero</translation>
+ <translation type="unfinished">Realizar copia de seguridad de la billetera</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -3222,11 +3987,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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">Ocurrió un error al intentar guardar los datos de la billetera en %1.</translation>
</message>
<message>
<source>Backup Successful</source>
- <translation type="unfinished">Respaldo exitoso</translation>
+ <translation type="unfinished">Copia de seguridad correcta</translation>
</message>
<message>
<source>The wallet data was successfully saved to %1.</source>
@@ -3245,11 +4010,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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 salvar o restaurar una copia de seguridad.</translation>
+ <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 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>
+ <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>
@@ -3260,6 +4025,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede pasar de la versión %i a la versión anterior %i. La versión de la billetera 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 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 una billetera dividida 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>
@@ -3268,28 +4037,32 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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; 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. 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! 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 billetera.</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 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>
- <translation type="unfinished">Error: las billeteras heredadas solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32".</translation>
+ <translation type="unfinished">Error: Las billeteras "legacy" 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>
@@ -3301,7 +4074,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <translation type="unfinished">El archivo peers.dat (%s) es inválido o está dañado. 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>
@@ -3309,25 +4082,25 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se proporcionó ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
+ <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ó ningún archivo de volcado. Para usar dump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
+ <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;filename&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">Verifica que la fecha y hora de la computadora sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
+ <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>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<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 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 de poda es incompatible con -reindex-chainstate. Usa en su lugar un -reindex completo.</translation>
</message>
@@ -3337,11 +4110,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
+ <translation type="unfinished">SQLiteDatabase: versión desconocida del esquema de la billetera sqlite %d. Solo se admite la versión %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>
@@ -3349,7 +4122,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3365,27 +4138,27 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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">Impuesto por transacción que pagarás cuando la estimación de impuesto 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 pudieron reproducir bloques. Tendrás que reconstruir la base de datos usando -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">Se proporcionó un formato de billetera desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
+ <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>
+ <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>
@@ -3397,11 +4170,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
+ <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>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
@@ -3409,7 +4182,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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: ¡Al parecer no estamos completamente de acuerdo con nuestros pares! Es posible que tengas que actualizarte, o que los demás nodos tengan que hacerlo.</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>
@@ -3421,19 +4194,15 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <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 direccion: '%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>
@@ -3444,10 +4213,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <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">El valor establecido para %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
@@ -3461,7 +4226,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3480,6 +4245,12 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se pudo eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</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>
@@ -3488,6 +4259,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/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>
@@ -3496,6 +4275,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</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>
@@ -3512,12 +4299,20 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Falló el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas de la billetera supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</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>
+ <translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe 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>
+ <translation type="unfinished">El monto 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>
@@ -3529,14 +4324,14 @@ 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
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 la billetera basada en descriptores. Cargando billetera%s
Es posible que la billetera haya sido manipulada o creada con malas intenciones.
</translation>
@@ -3554,6 +4349,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora de la computadora parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj de la computadora, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3566,10 +4365,38 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</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 obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se encontraron datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
<message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <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>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se encontró un bloque corrupto que indica un posible fallo del hardware.</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>
+ <message>
<source>Could not find asmap file %s</source>
<translation type="unfinished">No se pudo encontrar el archivo asmap %s</translation>
</message>
@@ -3582,10 +4409,22 @@ 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>Do you want to rebuild the block database now?</source>
+ <translation type="unfinished">¿Quieres reconstruir la base de datos de bloques ahora?</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation type="unfinished">Carga completa</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>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</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>
@@ -3594,16 +4433,36 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al crear %s</translation>
</message>
<message>
+ <source>Error initializing block database</source>
+ <translation type="unfinished">Error al inicializar la base de datos de bloques</translation>
+ </message>
+ <message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">Error al inicializar el entorno de la base de datos de la billetera %s.</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <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 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: billetera dañada</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: la billetera requiere una versión más reciente de %s</translation>
+ </message>
+ <message>
+ <source>Error loading block database</source>
+ <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 la base de datos de bloques</translation>
</message>
<message>
<source>Error reading configuration file: %s</source>
@@ -3623,7 +4482,7 @@ No se puede restaurar la copia de seguridad 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>
+ <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>
@@ -3643,11 +4502,11 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
@@ -3667,15 +4526,15 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Error: Esta billetera ya es de descriptores</translation>
+ <translation type="unfinished">Error: Esta billetera ya está basada en 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>
+ <translation type="unfinished">Error: No se pueden 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>
+ <translation type="unfinished">Error: No se puede realizar una copia de seguridad de la billetera</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
@@ -3687,7 +4546,7 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <translation type="unfinished">Error: No se pudo leer el registro del mejor localizador de bloques de la billetera.</translation>
</message>
<message>
<source>Error: Unable to remove watchonly address book data</source>
@@ -3699,36 +4558,67 @@ No se puede restaurar la copia de seguridad de la 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>
+ <translation type="unfinished">Error: No se pudo escribir el registro del mejor localizador de bloques de la billetera solucionable.</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>
+ <translation type="unfinished">Error: No se pudo escribir el registro del mejor localizador de bloques de la billetera 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 la billetera 1%s
- </translation>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera %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 connect best block (%s).</source>
+ <translation type="unfinished">No se pudo conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se pudo desconectar el bloque.</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>
+ <message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se pudo leer el bloque.</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>
+ <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>Failed to write block.</source>
+ <translation type="unfinished">No se pudo escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
- <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ <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>
@@ -3744,27 +4634,35 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">Incorrecto o bloque de génesis no encontrado. ¿datadir equivocada para la red?</translation>
+ <translation type="unfinished">El bloque génesis es incorrecto o no se encontró. ¿El directorio de datos es equivocado para la red?</translation>
+ </message>
+ <message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <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>
- <translation type="unfinished">No se encontró o ya se gastó la entrada</translation>
+ <translation type="unfinished">La entrada no se encontró o ya se gastó</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>
+ <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>
+ <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 de -onion o dominio '%s' invá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 de -proxy o dominio ' %s' invá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>
@@ -3779,16 +4677,24 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%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 netmask specified in -whitelist: '%s'</source>
+ <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">Fallo en la escucha para conexiones entrantes (la escucha devolvió el error %s)</translation>
+ <translation type="unfinished">Fallo al escuchar conexiones entrantes (la escucha devolvió el error %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -3796,7 +4702,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>
@@ -3807,24 +4713,40 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
- <translation type="unfinished">Falta la cantidad</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 la transacción</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>
+ </message>
+ <message>
<source>No addresses available</source>
<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>
+ <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>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
@@ -3836,7 +4758,11 @@ 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>
+ <translation type="unfinished">Reduciendo -maxconnections de %d a %d, debido a limitaciones del sistema.</translation>
</message>
<message>
<source>Replaying blocks…</source>
@@ -3867,8 +4793,20 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante devolvió un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
- <translation type="unfinished">Firma de transacción fallida</translation>
+ <translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
<message>
<source>Specified -walletdir "%s" does not exist</source>
@@ -3895,8 +4833,20 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</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>
@@ -3904,15 +4854,27 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">El monto de la transacción es demasiado pequeño para pagar la comisión</translation>
+ <translation type="unfinished">El importe de la transacción es muy pequeño para pagar la comisión</translation>
+ </message>
+ <message>
+ <source>The wallet will avoid paying less than the minimum relay fee.</source>
+ <translation type="unfinished">La billetera evitará pagar menos que la comisión mínima de retransmisión.</translation>
+ </message>
+ <message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta direcció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>
+ <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 por transacción a pagar si realiza una transacción.</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>
@@ -3924,7 +4886,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Transaction amounts must not be negative</source>
- <translation type="unfinished">Los montos de la transacción no debe ser negativo</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>
@@ -3932,7 +4894,7 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
@@ -3943,10 +4905,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<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>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">No se puede establecer un enlace a %s en esta computadora (bind devolvió el error %s)</translation>
</message>
@@ -3979,6 +4937,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">No se puede analizar -maxuploadtarget: "%s"</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <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>
<translation type="unfinished">No se puede descargar la billetera antes de la migración</translation>
</message>
@@ -3996,23 +4958,27 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">La red especificada en -onlynet '%s' es 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">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
+ <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>
+ <translation type="unfinished">Error al crear el archivo de la billetera: %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>
+ <translation type="unfinished">acceptstalefeeestimates no se admite en la cadena %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
@@ -4020,11 +4986,11 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <translation type="unfinished">Error: No se puede agregar la transacción solo de observación %s a la billetera solo de observación</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
- <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ <translation type="unfinished">Error: No se pudieron eliminar las transacciones solo de observación</translation>
</message>
<message>
<source>User Agent comment (%s) contains unsafe characters.</source>
@@ -4044,7 +5010,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Settings file could not be read</source>
- <translation type="unfinished">El archivo de configuración no puede leerse</translation>
+ <translation type="unfinished">El archivo de configuración no se puede leer</translation>
</message>
<message>
<source>Settings file could not be written</source>
diff --git a/src/qt/locale/bitcoin_es_VE.ts b/src/qt/locale/bitcoin_es_VE.ts
index 139fc7b42e..5ffa866afd 100644
--- a/src/qt/locale/bitcoin_es_VE.ts
+++ b/src/qt/locale/bitcoin_es_VE.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Haga clic con el botón derecho para editar una dirección o etiqueta</translation>
+ <translation type="unfinished">Hacer clic derecho para editar la dirección o etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -11,11 +11,11 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">&amp;Nuevo</translation>
+ <translation type="unfinished">&amp;Nueva</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copiar la dirección seleccionada al portapapeles del sistema</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</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">Borrar de la lista la dirección seleccionada</translation>
+ <translation type="unfinished">Eliminar la dirección seleccionada de la lista</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Introduzca una dirección o etiqueta que buscar</translation>
+ <translation type="unfinished">Ingresar una dirección o etiqueta para 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>
@@ -43,37 +43,37 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">&amp;Eliminar</translation>
+ <translation type="unfinished">&amp;Borrar</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Escoja la dirección a la que se enviarán monedas</translation>
+ <translation type="unfinished">Elige la dirección a la que se enviarán monedas</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Escoja la dirección donde quiere recibir monedas</translation>
+ <translation type="unfinished">Elige la dirección en la que se recibirán monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
- <translation type="unfinished">Escoger</translation>
+ <translation type="unfinished">&amp;Seleccionar</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>
+ <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">Lista de tus direcciones de Bitcoin para recibir pagos. Para la creacion de una nueva direccion seleccione en la pestana "recibir" la opcion "Crear nueva direccion"
-Registrarse solo es posible utilizando una direccion tipo "Legal"</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>
- <translation type="unfinished">Copiar dirección</translation>
+ <translation type="unfinished">&amp;Copiar dirección</translation>
</message>
<message>
<source>Copy &amp;Label</source>
- <translation type="unfinished">Copiar &amp;Etiqueta</translation>
+ <translation type="unfinished">Copiar &amp;etiqueta</translation>
</message>
<message>
<source>&amp;Edit</source>
@@ -81,7 +81,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Exportar la Lista de Direcciones</translation>
+ <translation type="unfinished">Exportar lista de direcciones</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -91,7 +91,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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 la lista de direcciones a %1. Por favor trate de nuevo.</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>
@@ -103,7 +103,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">La exportación falló</translation>
+ <translation type="unfinished">Error al exportar</translation>
</message>
</context>
<context>
@@ -125,19 +125,19 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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">Introducir contraseña</translation>
+ <translation type="unfinished">Ingresar la frase de contraseña</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Nueva contraseña</translation>
+ <translation type="unfinished">Nueva frase de contraseña</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Repita la nueva contraseña</translation>
+ <translation type="unfinished">Repetir la nueva frase de contraseña</translation>
</message>
<message>
<source>Show passphrase</source>
@@ -145,35 +145,35 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Encrypt wallet</source>
- <translation type="unfinished">Cifrar monedero</translation>
+ <translation type="unfinished">Encriptar billetera</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Esta operación requiere su contraseña para desbloquear el monedero.</translation>
+ <translation type="unfinished">Esta operación requiere la frase de contraseña de la billetera para desbloquearla.</translation>
</message>
<message>
<source>Unlock wallet</source>
- <translation type="unfinished">Desbloquear monedero</translation>
+ <translation type="unfinished">Desbloquear billetera</translation>
</message>
<message>
<source>Change passphrase</source>
- <translation type="unfinished">Cambiar frase secreta</translation>
+ <translation type="unfinished">Cambiar frase de contraseña</translation>
</message>
<message>
<source>Confirm wallet encryption</source>
- <translation type="unfinished">Confirme cifrado del monedero</translation>
+ <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">Atención: Si cifra su monedero y pierde la contraseña, perderá ¡&lt;b&gt;TODOS SUS BITCOINS&lt;/b&gt;!</translation>
+ <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">¿Está seguro que desea cifrar su monedero?</translation>
+ <translation type="unfinished">¿Seguro quieres encriptar la billetera?</translation>
</message>
<message>
<source>Wallet encrypted</source>
- <translation type="unfinished">Monedero cifrado</translation>
+ <translation type="unfinished">Billetera encriptada</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>
@@ -181,55 +181,63 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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">Ingresa la antigua frase de contraseña y la nueva frase de contraseña para la billetera.</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Atrás</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 billetera no garantiza total protección de robo de tus bitcoins si tu ordenador es infectado con malware.</translation>
+ <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 a ser cifrada</translation>
+ <translation type="unfinished">Billetera para encriptar</translation>
</message>
<message>
<source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Tu billetera esta por ser encriptada</translation>
+ <translation type="unfinished">Tu billetera está a punto de encriptarse.</translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Su billetera está ahora cifrada</translation>
+ <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: Algunas copias de seguridad que hayas hecho de tu archivo de billetera deberían ser reemplazadas con la billetera encriptada generada recientemente. Por razones de seguridad, las copias de seguridad previas del archivo de billetera sin cifrar serán inútiles tan pronto uses la nueva billetera encriptada.</translation>
+ <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">Encriptado de monedero fallido</translation>
+ <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">Encriptación de billetera fallida debido a un error interno. Tu billetera no fue encriptada.</translation>
+ <translation type="unfinished">El encriptado de la billetera falló debido a un error interno. La billetera no se encriptó.</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Las frases secretas introducidas no concuerdan.</translation>
+ <translation type="unfinished">Las frases de contraseña proporcionadas no coinciden.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">Desbloqueo de billetera fallido</translation>
+ <translation type="unfinished">Falló el desbloqueo de la billetera</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">La frase secreta introducida para la desencriptación de la billetera fué incorrecta.</translation>
+ <translation type="unfinished">La frase de contraseña introducida para el cifrado de la billetera 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 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>
+ <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 es correcto, 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 frase secreta de la billetera fué cambiada exitosamente.</translation>
+ <translation type="unfinished">La frase de contraseña de la billetera se cambió correctamente.</translation>
</message>
<message>
<source>Passphrase change failed</source>
@@ -241,25 +249,33 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">Aviso: El bloqueo de mayúsculas está activado.</translation>
+ <translation type="unfinished">Advertencia: ¡Las mayúsculas están activadas!</translation>
</message>
</context>
<context>
<name>BanTableModel</name>
<message>
+ <source>IP/Netmask</source>
+ <translation type="unfinished">IP/Máscara de red</translation>
+ </message>
+ <message>
<source>Banned Until</source>
- <translation type="unfinished">Bloqueado hasta</translation>
+ <translation type="unfinished">Prohibido hasta</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">El archivo de configuración %1 puede estar dañado o no ser válido.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Excepción fuera de control</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Se ha producido un error garrafal. %1Ya no podrá continuar de manera segura y abandonará.</translation>
+ <translation type="unfinished">Se produjo un error fatal. %1 ya no puede continuar de manera segura y se cerrará.</translation>
</message>
<message>
<source>Internal error</source>
@@ -267,7 +283,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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">Un error interno ocurrió. %1 intentará continuar. Este es un error inesperado que puede ser reportado de las formas que se muestran debajo,</translation>
+ <translation type="unfinished">Se produjo un error interno. %1 intentará continuar de manera segura. Este es un error inesperado que se puede reportar como se describe a continuación.</translation>
</message>
</context>
<context>
@@ -280,17 +296,21 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<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>
+ <translation type="unfinished">Se produjo un error fatal. Comprueba que el archivo de configuración soporte escritura o intenta ejecutar el programa con -nosettings.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 aún no salió de forma segura...</translation>
+ <translation type="unfinished">%1 aún no se cerró de forma segura...</translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">"%1" integrado</translation>
+ </message>
+ <message>
<source>Default system font "%1"</source>
<translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
</message>
@@ -300,11 +320,11 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Cantidad</translation>
+ <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">Ingresar una dirección de Bitcoin (por ejemplo, %1)</translation>
</message>
<message>
<source>Unroutable</source>
@@ -318,7 +338,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<message>
<source>Outbound</source>
<extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">Salida</translation>
+ <translation type="unfinished">Saliente</translation>
</message>
<message>
<source>Full Relay</source>
@@ -328,7 +348,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<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 bloque</translation>
+ <translation type="unfinished">Retransmisión de bloques</translation>
</message>
<message>
<source>Address Fetch</source>
@@ -389,7 +409,11 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<numerusform>%n años</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">billetera por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -398,7 +422,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Show general overview of wallet</source>
- <translation type="unfinished">Mostrar vista general del monedero</translation>
+ <translation type="unfinished">Muestra una vista general de la billetera</translation>
</message>
<message>
<source>&amp;Transactions</source>
@@ -406,7 +430,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Browse transaction history</source>
- <translation type="unfinished">Examinar el historial de transacciones</translation>
+ <translation type="unfinished">Explora el historial de transacciones</translation>
</message>
<message>
<source>E&amp;xit</source>
@@ -414,7 +438,15 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Quit application</source>
- <translation type="unfinished">Salir de la aplicación</translation>
+ <translation type="unfinished">Salir del programa</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;Acerca de %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Mostrar Información sobre %1</translation>
</message>
<message>
<source>About &amp;Qt</source>
@@ -422,7 +454,11 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Show information about Qt</source>
- <translation type="unfinished">Mostrar información acerca de Qt</translation>
+ <translation type="unfinished">Mostrar información sobre Qt</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Modificar las opciones de configuración para %1</translation>
</message>
<message>
<source>Create a new wallet</source>
@@ -433,21 +469,29 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">&amp;Minimizar</translation>
</message>
<message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
<source>Network activity disabled.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">Actividad de red deshabilitada.</translation>
</message>
<message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">Proxy &lt;b&gt;habilitado&lt;/b&gt;: %1</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">Copia de seguridad del monedero 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 el cifrado del monedero</translation>
+ <translation type="unfinished">Cambiar la frase de contraseña utilizada para encriptar la billetera</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -459,27 +503,39 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Cifrar monedero</translation>
+ <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 llaves privadas que pertenecen a tu billetera</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera...</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase de contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar contraseña...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <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 demostrar la propiedad</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <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 mensajes comprobando que están firmados con direcciones 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 el archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -487,15 +543,15 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Cerrar monedero...</translation>
+ <translation type="unfinished">Cerrar billetera...</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Crear monedero...</translation>
+ <translation type="unfinished">Crear billetera...</translation>
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">Cerrar todos los monederos...</translation>
+ <translation type="unfinished">Cerrar todas las billeteras...</translation>
</message>
<message>
<source>&amp;File</source>
@@ -515,7 +571,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Sincronizando cabeceras (1%1%)</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -531,7 +587,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
+ <translation type="unfinished">Conectando con pares...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -590,39 +646,39 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Cargar PSBT 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 TBPF desde el &amp;portapapeles...</translation>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</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 del nodo</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Direcciones de envío</translation>
+ <translation type="unfinished">Direcciones de &amp;envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de recepción</translation>
+ <translation type="unfinished">Direcciones de &amp;recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Bitcoin: abrir URI</translation>
+ <translation type="unfinished">Abrir un bitcoin: URI</translation>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Abrir monedero</translation>
+ <translation type="unfinished">Abrir billetera</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Abrir una cartera</translation>
</message>
<message>
<source>Close wallet</source>
- <translation type="unfinished">Cerrar monedero</translation>
+ <translation type="unfinished">Cerrar billetera</translation>
</message>
<message>
<source>Restore Wallet…</source>
@@ -636,7 +692,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Cerrar todos los monederos</translation>
+ <translation type="unfinished">Cerrar todas las billeteras</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -647,20 +703,8 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<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">Monederos no disponibles</translation>
+ <translation type="unfinished">No hay billeteras disponibles</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -680,15 +724,19 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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 del monedero</translation>
+ <translation type="unfinished">Nombre de la billetera </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>
+ <translation type="unfinished">Cliente %1 </translation>
</message>
<message>
<source>&amp;Hide</source>
@@ -696,20 +744,20 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">M&amp;ostrar</translation>
+ <translation type="unfinished">&amp;Mostrar</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 conexiones activas con la red Bitcoin</numerusform>
- <numerusform>%n conexiones activas con la red Bitcoin </numerusform>
+ <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiónes activas con la red de 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">Hacer clic para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -728,7 +776,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
@@ -736,7 +784,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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>
+ <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>
@@ -769,7 +817,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<message>
<source>Label: %1
</source>
- <translation type="unfinished">Etiqueta: %1
+ <translation type="unfinished">Etiqueta %1
</translation>
</message>
<message>
@@ -792,7 +840,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 clave HD está &lt;b&gt;deshabilitada&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -800,11 +848,11 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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">El monedero está &lt;b&gt;cifrado&lt;/b&gt; y actualmente &lt;b&gt;desbloqueado&lt;/b&gt;</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt;encriptada&lt;/b&gt; y actualmente &lt;b&gt;desbloqueda&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">El monedero está &lt;b&gt;cifrado&lt;/b&gt; y actualmente &lt;b&gt;bloqueado&lt;/b&gt;</translation>
+ <translation type="unfinished">La billetera está &lt;b&gt;encriptada&lt;/b&gt; y actualmente &lt;b&gt;bloqueda&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -815,14 +863,14 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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 las cantidades. 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>
@@ -830,11 +878,11 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Amount:</source>
- <translation type="unfinished">Cuantía:</translation>
+ <translation type="unfinished">Importe:</translation>
</message>
<message>
<source>Fee:</source>
- <translation type="unfinished">Tasa:</translation>
+ <translation type="unfinished">Comisión:</translation>
</message>
<message>
<source>After Fee:</source>
@@ -902,7 +950,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">B&amp;loquear importe no gastado</translation>
+ <translation type="unfinished">B&amp;loquear no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -952,6 +1000,11 @@ 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>
@@ -978,12 +1031,12 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</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>
@@ -1003,10 +1056,10 @@ If this wallet contains any solvable but not watched scripts, a different and ne
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.
+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 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>
+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>
@@ -1022,11 +1075,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
+ <translation type="unfinished">Los scripts solo de observación se migraron a una nueva billetera llamada "%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>
+ <translation type="unfinished">Los scripts solucionables pero no de observación se migraron a una nueva billetera llamada "%1".</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1040,22 +1093,22 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<context>
<name>OpenWalletActivity</name>
<message>
- <source>Open wallet warning</source>
- <translation type="unfinished">Advertencia sobre crear monedero</translation>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">Fallo al abrir billetera</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera por defecto</translation>
+ <source>Open wallet warning</source>
+ <translation type="unfinished">Advertencia al abrir billetera</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 billetera</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 billetera &lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
</context>
<context>
@@ -1090,46 +1143,62 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<name>WalletController</name>
<message>
<source>Close wallet</source>
- <translation type="unfinished">Cerrar monedero</translation>
+ <translation type="unfinished">Cerrar billetera</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>
- <translation type="unfinished">Cerrar todos los monederos</translation>
+ <translation type="unfinished">Cerrar todas las billeteras</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>
+ </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>
+ <translation type="unfinished">Escribe un nombre y, si quieres, activa las opciones avanzadas.</translation>
</message>
<message>
<source>Wallet Name</source>
- <translation type="unfinished">Nombre del monedero</translation>
+ <translation type="unfinished">Nombre de la billetera </translation>
</message>
<message>
<source>Wallet</source>
- <translation type="unfinished">Monedero</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 billetera</translation>
+ </message>
+ <message>
+ <source>Advanced Options</source>
+ <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">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>
@@ -1137,11 +1206,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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">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 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>
@@ -1154,14 +1227,14 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
<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>
@@ -1169,11 +1242,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 de la lista 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>
@@ -1185,7 +1258,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Edit receiving address</source>
- <translation type="unfinished">Editar dirección de envío</translation>
+ <translation type="unfinished">Editar dirección de recepción</translation>
</message>
<message>
<source>Edit sending address</source>
@@ -1193,7 +1266,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 válida.</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>
@@ -1201,7 +1282,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>New key generation failed.</source>
- <translation type="unfinished">Creación de la nueva llave fallida</translation>
+ <translation type="unfinished">Error al generar clave nueva.</translation>
</message>
</context>
<context>
@@ -1216,11 +1297,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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. Añada %1 si pretende crear aquí un directorio nuevo.</translation>
+ <translation type="unfinished">El directorio ya existe. Agrega %1 si deseas 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">Ruta de acceso existente, pero no es un directorio.</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1239,15 +1320,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>(de %n GB necesario)</numerusform>
+ <numerusform>(de %n GB necesarios)</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 necesario para completar la cadena)</numerusform>
+ <numerusform>(%n GB necesarios para completar la cadena)</numerusform>
</translation>
</message>
<message>
@@ -1255,8 +1336,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Elegir directorio de datos</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">Se almacenarán al menos %1 GB de datos en este directorio, que aumentarán 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án aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1272,27 +1357,35 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished">El monedero también se almacenará 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: Directorio de datos especificado "%1" no puede 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 esta la primera vez que se ejecuta el programa, puedes escoger donde %1 almacenará los 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">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">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>
@@ -1300,15 +1393,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 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>
- <translation type="unfinished">Utilizar el directorio de datos predeterminado</translation>
+ <translation type="unfinished">Usar el directorio de datos predeterminado</translation>
</message>
<message>
<source>Use a custom data directory:</source>
- <translation type="unfinished">Utilice un directorio de datos personalizado:</translation>
+ <translation type="unfinished">Usar un directorio de datos personalizado:</translation>
</message>
</context>
<context>
@@ -1323,42 +1416,73 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Command-line options</source>
- <translation type="unfinished">Opciones de la línea de órdenes</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 apagues la computadora hasta que desaparezca esta ventana.</translation>
</message>
</context>
<context>
<name>ModalOverlay</name>
<message>
<source>Form</source>
- <translation type="unfinished">Desde</translation>
+ <translation type="unfinished">Formulario</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 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á si se intenta gastar bitcoins afectados por las transacciones que aún no se muestran.</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">Numero de bloques pendientes</translation>
+ <translation type="unfinished">Número de bloques restantes</translation>
</message>
<message>
<source>Unknown…</source>
<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>
<message>
+ <source>Progress</source>
+ <translation type="unfinished">Progreso</translation>
+ </message>
+ <message>
<source>Progress increase per hour</source>
- <translation type="unfinished">Incremento del progreso por hora</translation>
+ <translation type="unfinished">Avance del progreso por hora</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">Tiempo estimado restante hasta la sincronización</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <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 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>
@@ -1374,7 +1498,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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 portapapeles</translation>
+ <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
</message>
</context>
<context>
@@ -1388,16 +1512,24 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">&amp;Principal</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>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
- <translation type="unfinished">&amp;Iniciar %1 al iniciar el sistema</translation>
+ <translation type="unfinished">&amp;Iniciar %1 al iniciar sesión en el sistema</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">Al activar el modo pruning, 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>
+ <translation type="unfinished">Al activar el 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>Size of &amp;database cache</source>
+ <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>
@@ -1405,15 +1537,19 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 (ej. 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 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">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>
+ <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>
+ <translation type="unfinished">Fuente en la pestaña "Vista general":</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
@@ -1429,7 +1565,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Reset all client options to default.</source>
- <translation type="unfinished">Restablecer todas las opciones del cliente a las predeterminadas.</translation>
+ <translation type="unfinished">Restablecer todas las opciones del cliente a los valores predeterminados.</translation>
</message>
<message>
<source>&amp;Reset Options</source>
@@ -1455,7 +1591,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1464,7 +1600,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
+ <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>
@@ -1473,12 +1609,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>W&amp;allet</source>
- <translation type="unfinished">Monedero</translation>
+ <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>
+ <translation type="unfinished">Si se resta o no la comisión del importe por defecto.</translation>
</message>
<message>
<source>Subtract &amp;fee from amount by default</source>
@@ -1490,8 +1626,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Experto</translation>
</message>
<message>
+ <source>Enable coin &amp;control features</source>
+ <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 deshabilita 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 cómo se calcula su saldo.</translation>
+ <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>
@@ -1500,12 +1640,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1517,11 +1657,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 si el router admite UPnP y está activado.</translation>
+ <translation type="unfinished">Abrir automáticamente el puerto del cliente de Bitcoin en el router. Esto funciona solo cuando tu router es compatible con UPnP y está habilitado.</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 usando &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>
@@ -1532,16 +1672,24 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
</message>
<message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">Aceptar conexiones externas.</translation>
+ </message>
+ <message>
<source>Allow incomin&amp;g connections</source>
- <translation type="unfinished">Permitir conexiones entrantes</translation>
+ <translation type="unfinished">&amp;Permitir conexiones entrantes</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
- <translation type="unfinished">Conectar a la red de Bitcoin a través de un proxy SOCKS5.</translation>
+ <translation type="unfinished">Conectarse a la red de Bitcoin a través de un proxy SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">&amp;Conectarse a través del proxy SOCKS5 (proxy predeterminado):</translation>
</message>
<message>
<source>Proxy &amp;IP:</source>
- <translation type="unfinished">Dirección &amp;IP del proxy:</translation>
+ <translation type="unfinished">&amp;IP del proxy:</translation>
</message>
<message>
<source>&amp;Port:</source>
@@ -1549,11 +1697,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Port of the proxy (e.g. 9050)</source>
- <translation type="unfinished">Puerto del servidor proxy (ej. 9050)</translation>
+ <translation type="unfinished">Puerto del proxy (p. ej., 9050)</translation>
</message>
<message>
<source>Used for reaching peers via:</source>
- <translation type="unfinished">Utilizado para llegar a los compañeros a través de:</translation>
+ <translation type="unfinished">Usado para conectarse con pares a través de:</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -1569,35 +1717,35 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
- <translation type="unfinished">Minimizar la ventana a la bandeja de iconos del sistema.</translation>
+ <translation type="unfinished">Mostrar solo un ícono de bandeja después de minimizar la ventana.</translation>
</message>
<message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation type="unfinished">&amp;Minimizar a la bandeja en vez de a 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;Interfaz</translation>
+ <translation type="unfinished">&amp;Visualización</translation>
</message>
<message>
<source>User Interface &amp;language:</source>
- <translation type="unfinished">I&amp;dioma de la interfaz de usuario</translation>
+ <translation type="unfinished">&amp;Idioma de la interfaz de usuario:</translation>
</message>
<message>
<source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
- <translation type="unfinished">El idioma de la interfaz de usuario puede establecerse aquí. Esta configuración tendrá efecto después de reiniciar %1.</translation>
+ <translation type="unfinished">El idioma de la interfaz de usuario puede establecerse aquí. Esta configuración surtirá efecto después de reiniciar %1.</translation>
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
- <translation type="unfinished">Mostrar las cantidades en la &amp;unidad:</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>
@@ -1609,28 +1757,24 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Whether to show coin control features or not.</source>
- <translation type="unfinished">Mostrar o no características de control de moneda</translation>
+ <translation type="unfinished">Si se muestran o no las funcionalidades 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">Conectarse a la red Bitcoin a través de un proxy SOCKS5 independiente para los servicios onion 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 un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>&amp;OK</source>
- <translation type="unfinished">&amp;Aceptar</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>
@@ -1643,12 +1787,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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">Confirme el restablecimiento de las opciones</translation>
+ <translation type="unfinished">Confirmar restablecimiento de opciones</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">Reinicio del cliente para activar cambios.</translation>
+ <translation type="unfinished">Es necesario reiniciar el cliente para activar los cambios.</translation>
</message>
<message>
<source>Current settings will be backed up at "%1".</source>
@@ -1658,7 +1802,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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">El cliente será cluasurado. Quieres proceder?</translation>
+ <translation type="unfinished">El cliente se cerrará. ¿Quieres continuar?</translation>
</message>
<message>
<source>Configuration options</source>
@@ -1668,7 +1812,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<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>
@@ -1680,15 +1824,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The configuration file could not be opened.</source>
- <translation type="unfinished">El archivo de configuración no se pudo abrir.</translation>
+ <translation type="unfinished">No se pudo abrir el archivo de configuración.</translation>
</message>
<message>
<source>This change would require a client restart.</source>
- <translation type="unfinished">Este cambio requiere reinicio por parte del cliente.</translation>
+ <translation type="unfinished">Estos cambios requieren reiniciar el cliente.</translation>
</message>
<message>
<source>The supplied proxy address is invalid.</source>
- <translation type="unfinished">La dirección proxy indicada es inválida.</translation>
+ <translation type="unfinished">La dirección del proxy proporcionada es inválida.</translation>
</message>
</context>
<context>
@@ -1702,11 +1846,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<name>OverviewPage</name>
<message>
<source>Form</source>
- <translation type="unfinished">Desde</translation>
+ <translation type="unfinished">Formulario</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 Bitcoin después de que se haya establecido una conexión, pero este proceso aún no se ha completado.</translation>
+ <translation type="unfinished">La información mostrada puede estar desactualizada. La billetera 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 de observación:</translation>
</message>
<message>
<source>Available:</source>
@@ -1714,7 +1862,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Your current spendable balance</source>
- <translation type="unfinished">Su balance actual gastable</translation>
+ <translation type="unfinished">Tu saldo disponible para gastar actualmente</translation>
</message>
<message>
<source>Pending:</source>
@@ -1722,15 +1870,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 deben ser confirmadas, y que no cuentan con el balance gastable necesario</translation>
+ <translation type="unfinished">Total de transacciones que aún se deben confirmar y que no se contabilizan dentro del saldo disponible para gastar</translation>
</message>
<message>
<source>Immature:</source>
- <translation type="unfinished">No disponible:</translation>
+ <translation type="unfinished">Inmaduro:</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>
@@ -1738,15 +1886,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Your current total balance</source>
- <translation type="unfinished">Su balance actual total</translation>
+ <translation type="unfinished">Tu saldo total actual</translation>
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Tu saldo actual en solo ver direcciones</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>
@@ -1754,22 +1902,26 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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 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 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 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 vista general. Para mostrar los valores, anule 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>
@@ -1805,7 +1957,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Could not sign any more inputs.</source>
- <translation type="unfinished">No se pudo firmar más entradas.</translation>
+ <translation type="unfinished">No se pudieron firmar más entradas.</translation>
</message>
<message>
<source>Signed %1 inputs, but more signatures are still required.</source>
@@ -1829,7 +1981,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
@@ -1842,7 +1994,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</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>
@@ -1850,7 +2002,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>own address</source>
- <translation type="unfinished">dirección personal</translation>
+ <translation type="unfinished">dirección propia</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -1862,7 +2014,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Total Amount</source>
- <translation type="unfinished">Cantidad total</translation>
+ <translation type="unfinished">Importe total</translation>
</message>
<message>
<source>or</source>
@@ -1874,7 +2026,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">A la transacción le falta información sobre entradas.</translation>
+ <translation type="unfinished">Falta información sobre las entradas de la transacción.</translation>
</message>
<message>
<source>Transaction still needs signature(s).</source>
@@ -1896,7 +2048,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<source>Transaction is fully signed and ready for broadcast.</source>
<translation type="unfinished">La transacción se firmó completamente y está lista para transmitirse.</translation>
</message>
- </context>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">El estado de la transacción es desconocido.</translation>
+ </message>
+</context>
<context>
<name>PaymentServer</name>
<message>
@@ -1904,8 +2060,16 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Error en la solicitud de pago</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">No se puede iniciar el controlador "bitcoin: click-to-pay"</translation>
+ </message>
+ <message>
+ <source>URI handling</source>
+ <translation type="unfinished">Gestión de URI</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.
@@ -1913,11 +2077,15 @@ Due to widespread security flaws in BIP70 it's strongly recommended that any mer
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 recibe este error, debe solicitar al comerciante que le proporcione un URI compatible con BIP21.</translation>
+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 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>
- <translation type="unfinished">Manejo del archivo de solicitud de pago</translation>
+ <translation type="unfinished">Gestión del archivo de solicitud de pago</translation>
</message>
</context>
<context>
@@ -1935,12 +2103,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
+ <translation type="unfinished">Dirección</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">Expedido</translation>
+ <translation type="unfinished">Enviado</translation>
</message>
<message>
<source>Received</source>
@@ -1970,7 +2143,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Outbound</source>
<extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">Salida</translation>
+ <translation type="unfinished">Saliente</translation>
</message>
</context>
<context>
@@ -1980,8 +2153,16 @@ 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>
+ <translation type="unfinished">El URI resultante es demasiado largo, así que trata 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>
@@ -2009,23 +2190,23 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>&amp;Information</source>
- <translation type="unfinished">Información</translation>
+ <translation type="unfinished">&amp;Información</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, use la opción "%1".</translation>
+ <source>Datadir</source>
+ <translation type="unfinished">Directorio de datos</translation>
</message>
<message>
- <source>Blocksdir</source>
- <translation type="unfinished">Bloques dir</translation>
+ <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>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de bloques, use la opción "%1".</translation>
+ <translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de bloques, usa la opción "%1".</translation>
</message>
<message>
<source>Startup time</source>
- <translation type="unfinished">Hora de inicio</translation>
+ <translation type="unfinished">Tiempo de inicio</translation>
</message>
<message>
<source>Network</source>
@@ -2040,24 +2221,40 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Número de conexiones</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Direcciones locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Direcciones de red que tu nodo Bitcoin usa actualmente para comunicarse con otros nodos.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Cadena de bloques</translation>
</message>
<message>
<source>Memory Pool</source>
- <translation type="unfinished">Grupo de memoria</translation>
+ <translation type="unfinished">Pool de memoria</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <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>
- <translation type="unfinished">Monedero:</translation>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <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>
@@ -2065,7 +2262,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Sent</source>
- <translation type="unfinished">Expedido</translation>
+ <translation type="unfinished">Enviado</translation>
</message>
<message>
<source>&amp;Peers</source>
@@ -2080,6 +2277,10 @@ 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>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalles de pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
@@ -2088,14 +2289,14 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
</message>
@@ -2105,13 +2306,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</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>
<translation type="unfinished">Encabezados sincronizados</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">Bloques sincronizados</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">Última transacción</translation>
</message>
@@ -2131,17 +2336,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">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>
@@ -2151,7 +2356,7 @@ 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 omitidas por limitación de volumen</translation>
+ <translation type="unfinished">Direcciones desestimadas por limitación de volumen</translation>
</message>
<message>
<source>User Agent</source>
@@ -2159,7 +2364,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Ventana de nodo</translation>
+ <translation type="unfinished">Ventana del nodo</translation>
</message>
<message>
<source>Current block height</source>
@@ -2167,15 +2372,19 @@ 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 en el directorio de datos actual. Esto puede tardar unos segundos para los archivos de registro grandes.</translation>
+ <translation type="unfinished">Abrir el archivo de registro de depuración %1 en el directorio de datos actual. Esto puede tardar unos segundos para los archivos de registro grandes.</translation>
</message>
<message>
<source>Decrease font size</source>
- <translation type="unfinished">Reducir el tamaño de la fuente</translation>
+ <translation type="unfinished">Disminuir tamaño de fuente</translation>
</message>
<message>
<source>Increase font size</source>
- <translation type="unfinished">Aumentar el tamaño de la fuente</translation>
+ <translation type="unfinished">Aumentar tamaño de fuente</translation>
+ </message>
+ <message>
+ <source>Permissions</source>
+ <translation type="unfinished">Permisos</translation>
</message>
<message>
<source>The direction and type of peer connection: %1</source>
@@ -2186,6 +2395,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Dirección/Tipo</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">La cadena del identificador de sesión BIP324 en formato hexadecimal.</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 mediante el cual está conectado este par: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
@@ -2195,13 +2408,17 @@ 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">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>
<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>
@@ -2220,21 +2437,29 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Last Receive</source>
- <translation type="unfinished">Ultima recepción</translation>
+ <translation type="unfinished">Última recepción</translation>
</message>
<message>
<source>Ping Time</source>
- <translation type="unfinished">Tiempo de Ping</translation>
+ <translation type="unfinished">Tiempo de ping</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">La duración de un ping actualmente pendiente.</translation>
</message>
<message>
<source>Ping Wait</source>
- <translation type="unfinished">Espera de Ping</translation>
+ <translation type="unfinished">Espera de ping</translation>
</message>
<message>
<source>Min Ping</source>
<translation type="unfinished">Ping mínimo</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation type="unfinished">Desfase temporal</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Hora del último bloque</translation>
</message>
@@ -2248,15 +2473,15 @@ 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>
- <translation type="unfinished">Total:</translation>
+ <translation type="unfinished">Totales</translation>
</message>
<message>
<source>Debug log file</source>
- <translation type="unfinished">Archivo de registro de depuración</translation>
+ <translation type="unfinished">Archivo del registro de depuración</translation>
</message>
<message>
<source>Clear console</source>
@@ -2264,11 +2489,11 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>In:</source>
- <translation type="unfinished">Dentro:</translation>
+ <translation type="unfinished">Entrada:</translation>
</message>
<message>
<source>Out:</source>
- <translation type="unfinished">Fuera:</translation>
+ <translation type="unfinished">Salida:</translation>
</message>
<message>
<source>Inbound: initiated by peer</source>
@@ -2308,7 +2533,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<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>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin encriptar</translation>
</message>
<message>
<source>v2: BIP324 encrypted transport protocol</source>
@@ -2325,7 +2550,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</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>
@@ -2333,35 +2558,55 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">&amp;Copiar dirección</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">&amp;Desconectar</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
- <translation type="unfinished">1 hora</translation>
+ <translation type="unfinished">1 &amp;hora</translation>
</message>
<message>
<source>1 d&amp;ay</source>
<translation type="unfinished">1 &amp;día</translation>
</message>
<message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 &amp;semana</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 &amp;año</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>
</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>
<translation type="unfinished">Actividad de red desactivada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
- <translation type="unfinished">Ejecutar comando sin monedero</translation>
+ <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>
+ <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.
@@ -2370,12 +2615,13 @@ 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.
+ <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 un resumen de los comandos disponibles. Para más información sobre cómo usar esta consola, escribe %6.
+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 comandos aquí, robando el contenido de sus monederos. 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>
@@ -2392,11 +2638,11 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Yes</source>
- <translation type="unfinished">Si</translation>
+ <translation type="unfinished">Sí</translation>
</message>
<message>
<source>To</source>
- <translation type="unfinished">Para</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>From</source>
@@ -2404,11 +2650,11 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Ban for</source>
- <translation type="unfinished">Bloqueo para</translation>
+ <translation type="unfinished">Prohibir por</translation>
</message>
<message>
<source>Never</source>
- <translation type="unfinished">nunca</translation>
+ <translation type="unfinished">Nunca</translation>
</message>
<message>
<source>Unknown</source>
@@ -2419,7 +2665,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Amount:</source>
- <translation type="unfinished">Cantidad</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -2427,27 +2673,27 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>&amp;Message:</source>
- <translation type="unfinished">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 adjunto a la solicitud de pago, que será mostrado cuando la solicitud sea abierta. Nota: Este mensaje no será enviado con el pago a través de la red Bitcoin.</translation>
+ <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>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>
- <translation type="unfinished">Use este formulario para solicitar pagos. Todos los campos son &lt;b&gt;opcionales&lt;/b&gt;.</translation>
+ <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. Deje esto vacío o en cero para no solicitar una cantidad específica.</translation>
+ <translation type="unfinished">Un importe opcional para solicitar. Déjalo vacío o ingresa cero para no solicitar un importe específico.</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">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>
@@ -2455,23 +2701,23 @@ Escribe %5 para ver un resumen de los comandos 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">Limpiar todos los campos del formulario</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Clear</source>
- <translation type="unfinished">Limpiar</translation>
+ <translation type="unfinished">Borrar</translation>
</message>
<message>
<source>Requested payments history</source>
- <translation type="unfinished">Historial de pagos solicitado</translation>
+ <translation type="unfinished">Historial de pagos solicitados</translation>
</message>
<message>
<source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Muestra la petición seleccionada (También doble clic)</translation>
+ <translation type="unfinished">Mostrar la solicitud seleccionada (equivale a hacer doble clic en una entrada)</translation>
</message>
<message>
<source>Show</source>
@@ -2479,7 +2725,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Remove the selected entries from the list</source>
- <translation type="unfinished">Borrar de la lista las direcciónes actualmente seleccionadas</translation>
+ <translation type="unfinished">Eliminar las entradas seleccionadas de la lista</translation>
</message>
<message>
<source>Remove</source>
@@ -2527,7 +2773,7 @@ Escribe %5 para ver un resumen de los comandos 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 pudo generar nueva dirección %1</translation>
</message>
</context>
<context>
@@ -2537,20 +2783,32 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
<translation type="unfinished">Solicitar pago a...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">Dirección:</translation>
+ </message>
+ <message>
<source>Amount:</source>
- <translation type="unfinished">Cuantía:</translation>
+ <translation type="unfinished">Importe:</translation>
+ </message>
+ <message>
+ <source>Label:</source>
+ <translation type="unfinished">Etiqueta:</translation>
</message>
<message>
<source>Message:</source>
<translation type="unfinished">Mensaje:</translation>
</message>
<message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Billetera:</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">Copiar &amp;URI</translation>
</message>
<message>
<source>Copy &amp;Address</source>
- <translation type="unfinished">Copiar &amp;Dirección</translation>
+ <translation type="unfinished">Copiar &amp;dirección</translation>
</message>
<message>
<source>&amp;Verify</source>
@@ -2558,13 +2816,21 @@ Escribe %5 para ver un resumen de los comandos 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, por ejemplo, en la pantalla de una billetera de hardware</translation>
+ <translation type="unfinished">Verificar esta dirección, por ejemplo, en la pantalla de una billetera de hardware.</translation>
</message>
<message>
<source>&amp;Save Image…</source>
<translation type="unfinished">&amp;Guardar imagen...</translation>
</message>
- </context>
+ <message>
+ <source>Payment information</source>
+ <translation type="unfinished">Información del pago</translation>
+ </message>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">Solicitar pago a %1</translation>
+ </message>
+</context>
<context>
<name>RecentRequestsTableModel</name>
<message>
@@ -2576,6 +2842,10 @@ 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>
@@ -2585,7 +2855,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>(no amount requested)</source>
- <translation type="unfinished">(sin importe solicitado)</translation>
+ <translation type="unfinished">(no se solicitó un importe)</translation>
</message>
<message>
<source>Requested</source>
@@ -2600,15 +2870,15 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Coin Control Features</source>
- <translation type="unfinished">Características de control de la moneda</translation>
+ <translation type="unfinished">Funciones de control de monedas</translation>
</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>
- <translation type="unfinished">Fondos insuficientes!</translation>
+ <translation type="unfinished">Fondos insuficientes</translation>
</message>
<message>
<source>Quantity:</source>
@@ -2616,15 +2886,15 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Amount:</source>
- <translation type="unfinished">Cuantía:</translation>
+ <translation type="unfinished">Importe:</translation>
</message>
<message>
<source>Fee:</source>
- <translation type="unfinished">Tasa:</translation>
+ <translation type="unfinished">Comisión:</translation>
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Después de tasas:</translation>
+ <translation type="unfinished">Después de la comisión:</translation>
</message>
<message>
<source>Change:</source>
@@ -2632,11 +2902,11 @@ Escribe %5 para ver un resumen de los comandos 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>
- <translation type="unfinished">Dirección propia</translation>
+ <translation type="unfinished">Dirección de cambio personalizada</translation>
</message>
<message>
<source>Transaction Fee:</source>
@@ -2644,11 +2914,19 @@ Escribe %5 para ver un resumen de los comandos 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>
- <translation type="unfinished">Advertencia: En este momento no se puede estimar la cuota.</translation>
+ <translation type="unfinished">Advertencia: En este momento no se puede estimar la comisión.</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">por kilobyte</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">Ocultar</translation>
</message>
<message>
<source>Recommended:</source>
@@ -2660,15 +2938,15 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaciÃ
</message>
<message>
<source>Send to multiple recipients at once</source>
- <translation type="unfinished">Enviar a múltiples destinatarios de una vez</translation>
+ <translation type="unfinished">Enviar a múltiples destinatarios a la vez</translation>
</message>
<message>
<source>Add &amp;Recipient</source>
- <translation type="unfinished">Añadir &amp;destinatario</translation>
+ <translation type="unfinished">Agregar &amp;destinatario</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation type="unfinished">Limpiar todos los campos del formulario</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Inputs…</source>
@@ -2696,19 +2974,27 @@ 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">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">(La comisión inteligente no se ha inicializado todavía. Esto tarda normalmente algunos bloques…)</translation>
</message>
<message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">Objetivo de tiempo de confirmación:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <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>
- <translation type="unfinished">Limpiar &amp;todo</translation>
+ <translation type="unfinished">Borrar &amp;todo</translation>
</message>
<message>
<source>Balance:</source>
@@ -2747,22 +3033,34 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Copiar cambio</translation>
</message>
<message>
+ <source>%1 (%2 blocks)</source>
+ <translation type="unfinished">%1 (%2 bloques)</translation>
+ </message>
+ <message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
<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 billetera 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 -&gt; Monedero</translation>
+ <translation type="unfinished">Establecer la ruta al script del firmante externo en "Opciones -&gt; Billetera"</translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <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 (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</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>
+ <translation type="unfinished">%1 a '%2'</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2774,17 +3072,17 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -2798,7 +3096,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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>
@@ -2810,11 +3108,16 @@ 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>
+ <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">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>
+ <translation type="unfinished">%1 desde billetera "%2"</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
@@ -2824,12 +3127,12 @@ 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 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>
+ <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>
<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>
@@ -2837,25 +3140,29 @@ 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 remplazar-por-comisión, BIP-125.</translation>
+ <translation type="unfinished">No indica "Remplazar por comisión", BIP-125.</translation>
</message>
<message>
<source>Total Amount</source>
- <translation type="unfinished">Cantidad total</translation>
+ <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 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 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 envío de monedas</translation>
</message>
<message>
<source>Watch-only balance:</source>
@@ -2867,7 +3174,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">La cantidad por pagar tiene que 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>
@@ -2875,38 +3182,42 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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 tasa 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">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>
+ <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 inválida</translation>
</message>
<message>
<source>Warning: Unknown change address</source>
- <translation type="unfinished">Peligro: Dirección de cambio desconocida</translation>
+ <translation type="unfinished">Advertencia: Dirección de cambio desconocida</translation>
</message>
<message>
<source>Confirm custom change address</source>
- <translation type="unfinished">Confirmar dirección de cambio personalizada</translation>
+ <translation type="unfinished">Confirmar la dirección de cambio personalizada</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">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 esta billetera. Una parte o la totalidad de los fondos en la billetera se enviará a esta dirección. ¿Seguro deseas continuar?</translation>
</message>
<message>
<source>(no label)</source>
@@ -2917,11 +3228,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation type="unfinished">Ca&amp;ntidad:</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>Pay &amp;To:</source>
- <translation type="unfinished">&amp;Pagar a:</translation>
+ <translation type="unfinished">Pagar &amp;a:</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -2929,25 +3240,33 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Choose previously used address</source>
- <translation type="unfinished">Escoger dirección previamente usada</translation>
+ <translation type="unfinished">Seleccionar 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>
- <translation type="unfinished">Pegar dirección desde portapapeles</translation>
+ <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
</message>
<message>
<source>Remove this entry</source>
- <translation type="unfinished">Eliminar esta transacción</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 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 se deducirá del importe que se envía. El destinatario recibirá menos bitcoins que los que ingreses en el campo del importe. Si se seleccionan varios destinatarios, la comisión se dividirá por igual.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">&amp;Restar la comisión del importe</translation>
+ </message>
+ <message>
<source>Use available balance</source>
<translation type="unfinished">Usar el saldo disponible</translation>
</message>
@@ -2957,11 +3276,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -2979,31 +3298,31 @@ 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>
</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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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 mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) 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 dirección previamente usada</translation>
+ <translation type="unfinished">Seleccionar dirección usada anteriormente</translation>
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">Pegar dirección desde portapapeles</translation>
+ <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
- <translation type="unfinished">Introduzca el mensaje que desea firmar aquí</translation>
+ <translation type="unfinished">Ingresar aquí el mensaje que deseas firmar</translation>
</message>
<message>
<source>Signature</source>
@@ -3015,7 +3334,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Firmar el mensaje para demostrar que se posee esta 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>
@@ -3023,19 +3342,23 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
<translation type="unfinished">&amp;Verificar mensaje</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">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 está en el mensaje firmado en sí, para evitar ser víctima de un engaño por ataque de intermediario. Ten en cuenta que esto solo demuestra que el firmante recibe con la 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">La dirección Bitcoin con la que se firmó 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>
@@ -3043,11 +3366,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The signature given when the message was signed</source>
- <translation type="unfinished">La firma proporcionada cuando el mensaje fue firmado</translation>
+ <translation type="unfinished">La firma que se dio cuando el mensaje se firmó</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Verificar 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>
@@ -3055,31 +3378,39 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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 ingresada es invá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>
- <translation type="unfinished">La dirección introducida no corresponde a una clave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo.</translation>
+ </message>
+ <message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">Se canceló el desbloqueo de la billetera.</translation>
</message>
<message>
<source>No error</source>
- <translation type="unfinished">No hay error</translation>
+ <translation type="unfinished">Sin error </translation>
+ </message>
+ <message>
+ <source>Private key for the entered address is not available.</source>
+ <translation type="unfinished">La clave privada para la dirección ingresada no está disponible.</translation>
</message>
<message>
<source>Message signing failed.</source>
- <translation type="unfinished">Ha fallado la firma del mensaje.</translation>
+ <translation type="unfinished">Error al firmar el mensaje.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -3091,27 +3422,40 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Please check the signature and try again.</source>
- <translation type="unfinished">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>
</message>
- </context>
+ <message>
+ <source>Message verified.</source>
+ <translation type="unfinished">Mensaje verificado.</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>
+ <translation type="unfinished">(Presionar q para apagar y seguir luego)</translation>
</message>
<message>
<source>press q to shutdown</source>
- <translation type="unfinished">presiona q para apagar </translation>
+ <translation type="unfinished">Presionar q para apagar </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">Hay un conflicto con una transacción con %1 confirmaciones</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/sin confirmar, en el pool de memoria</translation>
@@ -3134,7 +3478,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<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">confirmaciones %1</translation>
+ <translation type="unfinished">%1 confirmaciones</translation>
</message>
<message>
<source>Status</source>
@@ -3146,7 +3490,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Source</source>
- <translation type="unfinished">Fuente</translation>
+ <translation type="unfinished">Origen</translation>
+ </message>
+ <message>
+ <source>Generated</source>
+ <translation type="unfinished">Generado</translation>
</message>
<message>
<source>From</source>
@@ -3158,11 +3506,23 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>To</source>
- <translation type="unfinished">Para</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>own address</source>
- <translation type="unfinished">dirección personal</translation>
+ <translation type="unfinished">dirección propia</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
+ </message>
+ <message>
+ <source>label</source>
+ <translation type="unfinished">etiqueta</translation>
+ </message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">Crédito</translation>
</message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
@@ -3176,8 +3536,16 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">no aceptada</translation>
</message>
<message>
+ <source>Debit</source>
+ <translation type="unfinished">Débito</translation>
+ </message>
+ <message>
<source>Total debit</source>
- <translation type="unfinished">Total enviado</translation>
+ <translation type="unfinished">Débito total</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation type="unfinished">Crédito total</translation>
</message>
<message>
<source>Transaction fee</source>
@@ -3185,7 +3553,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Net amount</source>
- <translation type="unfinished">Cantidad total</translation>
+ <translation type="unfinished">Importe neto</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>
@@ -3193,7 +3569,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</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>
@@ -3201,7 +3577,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Output index</source>
- <translation type="unfinished">Indice de salida</translation>
+ <translation type="unfinished">Ãndice de salida</translation>
</message>
<message>
<source>%1 (Certificate was not verified)</source>
@@ -3209,13 +3585,17 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Merchant</source>
- <translation type="unfinished">Vendedor</translation>
+ <translation type="unfinished">Comerciante</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">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>
+ <translation type="unfinished">Información de depuración</translation>
+ </message>
+ <message>
<source>Transaction</source>
<translation type="unfinished">Transacción</translation>
</message>
@@ -3231,14 +3611,22 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<source>true</source>
<translation type="unfinished">verdadero</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">falso</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
<source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Esta ventana muestra información detallada sobre la transacción</translation>
+ <translation type="unfinished">En este panel se muestra una descripción detallada de la transacción</translation>
+ </message>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">Detalles para %1</translation>
</message>
- </context>
+</context>
<context>
<name>TransactionTableModel</name>
<message>
@@ -3254,16 +3642,28 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Etiqueta</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">Sin confirmar</translation>
+ </message>
+ <message>
<source>Abandoned</source>
<translation type="unfinished">Abandonada</translation>
</message>
<message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">Confirmando (%1 de %2 confirmaciones recomendadas)</translation>
+ </message>
+ <message>
<source>Confirmed (%1 confirmations)</source>
<translation type="unfinished">Confirmada (%1 confirmaciones)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">En conflicto</translation>
+ </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>
@@ -3271,11 +3671,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Received with</source>
- <translation type="unfinished">Recibido con</translation>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Received from</source>
- <translation type="unfinished">Recibido de</translation>
+ <translation type="unfinished">Recibida de</translation>
</message>
<message>
<source>Sent to</source>
@@ -3283,19 +3683,35 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">(n/d)</translation>
</message>
<message>
<source>(no label)</source>
<translation type="unfinished">(sin etiqueta)</translation>
</message>
<message>
+ <source>Transaction status. Hover over this field to show number of confirmations.</source>
+ <translation type="unfinished">Estado de la transacción. Pasa el mouse 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 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>
+ <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>
@@ -3309,6 +3725,14 @@ 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>
@@ -3318,11 +3742,15 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Last month</source>
- <translation type="unfinished">El mes pasado </translation>
+ <translation type="unfinished">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>
+ <translation type="unfinished">Recibida con</translation>
</message>
<message>
<source>Sent to</source>
@@ -3330,7 +3758,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Mined</source>
- <translation type="unfinished">Minado</translation>
+ <translation type="unfinished">Minada</translation>
</message>
<message>
<source>Other</source>
@@ -3338,7 +3766,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">Ingresa la dirección, el identificador de transacción o la etiqueta para 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>
@@ -3362,11 +3790,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Copiar &amp;ID de transacción</translation>
+ <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;raw</translation>
+ <translation type="unfinished">Copiar transacción &amp;sin procesar</translation>
</message>
<message>
<source>Copy full transaction &amp;details</source>
@@ -3404,7 +3832,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmado</translation>
+ <translation type="unfinished">Confirmada</translation>
+ </message>
+ <message>
+ <source>Watch-only</source>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>Date</source>
@@ -3423,8 +3855,12 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Dirección</translation>
</message>
<message>
+ <source>ID</source>
+ <translation type="unfinished">Identificador</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
- <translation type="unfinished">La exportación falló</translation>
+ <translation type="unfinished">Error al exportar</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
@@ -3432,11 +3868,11 @@ 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 satisfactoria</translation>
+ <translation type="unfinished">Exportación correcta</translation>
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">El historial de transacciones ha sido guardado exitosamente en %1</translation>
+ <translation type="unfinished">El historial de transacciones se guardó correctamente en %1.</translation>
</message>
<message>
<source>Range:</source>
@@ -3454,8 +3890,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<translation type="unfinished">No se cargó ninguna billetera.
-Ir a Archivo &gt; Abrir billetera para cargar una.
-- OR -</translation>
+Ir a "Archivo &gt; Abrir billetera" para cargar una.
+- O -</translation>
</message>
<message>
<source>Create a new wallet</source>
@@ -3463,19 +3899,23 @@ 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 PSBT desde el portapapeles (Base64 inválido)</translation>
+ <translation type="unfinished">No se puede decodificar la TBPF desde el portapapeles (Base64 inválida)</translation>
+ </message>
+ <message>
+ <source>Load Transaction Data</source>
+ <translation type="unfinished">Cargar datos de la transacción</translation>
</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>
@@ -3486,18 +3926,30 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>Fee bump error</source>
- <translation type="unfinished">Error de incremento de cuota</translation>
+ <translation type="unfinished">Error de incremento de comisión</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">Fallo al incrementar la comisión de transacción</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">¿Desea incrementar la cuota?</translation>
+ <translation type="unfinished">¿Deseas incrementar la comisión?</translation>
+ </message>
+ <message>
+ <source>Current fee:</source>
+ <translation type="unfinished">Comisión actual:</translation>
</message>
<message>
<source>Increase:</source>
<translation type="unfinished">Incremento:</translation>
</message>
<message>
+ <source>New fee:</source>
+ <translation type="unfinished">Nueva comisión:</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">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>
@@ -3511,28 +3963,27 @@ 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>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">TBPF con incremento de comisión copiada en el portapapeles</translation>
</message>
<message>
<source>Can't sign transaction.</source>
- <translation type="unfinished">No se ha podido firmar la transacción.</translation>
+ <translation type="unfinished">No se puede firmar la transacción.</translation>
</message>
<message>
<source>Could not commit transaction</source>
<translation type="unfinished">No se pudo confirmar la transacción</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Error de firmante</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">billetera por defecto</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">No se puede mostrar la dirección</translation>
</message>
</context>
<context>
@@ -3543,11 +3994,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
- <translation type="unfinished">Billetera de Respaldo</translation>
+ <translation type="unfinished">Realizar copia de seguridad de la billetera</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -3560,15 +4011,15 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>There was an error trying to save the wallet data to %1.</source>
- <translation type="unfinished">Hubo un error intentando guardar los datos de la billetera al %1</translation>
+ <translation type="unfinished">Ocurrió un error al intentar guardar los datos de la billetera en %1.</translation>
</message>
<message>
<source>Backup Successful</source>
- <translation type="unfinished">Copia de seguridad completada</translation>
+ <translation type="unfinished">Copia de seguridad correcta</translation>
</message>
<message>
<source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">Los datos de la billetera fueron guardados exitosamente al %1</translation>
+ <translation type="unfinished">Los datos de la billetera se guardaron correctamente en %1.</translation>
</message>
<message>
<source>Cancel</source>
@@ -3583,11 +4034,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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 de la billetera de bitcoin para rescatar o restaurar una copia de seguridad.</translation>
+ <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 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>
+ <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>
@@ -3610,28 +4061,32 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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; 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. 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! 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>
+ <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>
<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>
+ <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 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>
- <translation type="unfinished">Error: las billeteras heredadas solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32".</translation>
+ <translation type="unfinished">Error: Las billeteras "legacy" 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>
@@ -3643,7 +4098,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <translation type="unfinished">El archivo peers.dat (%s) es inválido o está dañado. 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>
@@ -3662,16 +4117,16 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>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">Verifica que la fecha y hora de la computadora 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">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 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 de poda no es compatible con -reindex-chainstate. Usa en su lugar un -reindex completo.</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>
@@ -3679,7 +4134,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3691,7 +4146,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3699,7 +4154,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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 compilación de prueba pre-lanzamiento - use bajo su propio riesgo - no utilizar para aplicaciones de minería o mercantes</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>
@@ -3707,15 +4162,15 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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">Impuesto por transacción que pagarás cuando la estimación de impuesto 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>
@@ -3727,7 +4182,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3739,11 +4194,11 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
+ <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>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
@@ -3751,7 +4206,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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">Aviso: ¡No parecen estar totalmente de acuerdo con nuestros compañeros! Puede que tengas que actualizar, u otros nodos tengan que actualizarce.</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>
@@ -3763,19 +4218,15 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <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 direccion: '%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>
@@ -3786,12 +4237,8 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede establecer -peerblockfilters sin -blockfilterindex.</translation>
</message>
<message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <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>
+ <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>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -3803,7 +4250,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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>
+ <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>
@@ -3822,6 +4269,12 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">No se pudo eliminar la instantánea chainstate dir (%s). Elimínala manualmente antes de reiniciar.
+</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>
@@ -3830,6 +4283,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo de bloques al disco. Es probable que se deba a un error de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falló el volcado del archivo para deshacer al disco. Es probable que se deba a un error de E/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>
@@ -3838,6 +4299,14 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<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>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">El peso máximo de la transacción es menor que el peso de la transacción sin entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio.</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>
@@ -3854,12 +4323,20 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Falló el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinación de las entradas preseleccionadas y la selección automática de entradas de la billetera supera el peso máximo de la transacción. Intenta enviar un importe menor o consolidar manualmente las UTXO de la billetera.</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>
+ <translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe 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>
+ <translation type="unfinished">El monto 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>
@@ -3867,18 +4344,18 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</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 la UTXO. Reinicia para reanudar la descarga normal del bloque inicial o intenta cargar una instantánea diferente.</translation>
+ <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>
+ <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 la billetera basada en descriptores. Cargando billetera%s
Es posible que la billetera haya sido manipulada o creada con malas intenciones.
</translation>
@@ -3896,6 +4373,10 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La fecha y la hora de la computadora parecen estar más de %d minutos desincronizadas con la red, lo que puede producir un fallo de consenso. Después de confirmar el reloj de la computadora, este mensaje debería dejar de aparecer cuando reinicies el nodo. Sin reiniciar, debería dejar de mostrarse automáticamente después de que te hayas conectado a un número suficiente de nuevos pares salientes, lo que puede llevar cierto tiempo. Puedes inspeccionar el campo "timeoffset" de los métodos RPC "getpeerinfo" y "getnetworkinfo" para obtener más información.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3908,12 +4389,36 @@ Unable to restore backup of wallet.</source>
No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind solo puede utilizarse para conexiones entrantes (se ha pasado "out")</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 obtener más información:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">No se encontraron datos assumeutxo para el blockhash indicado "%s".</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
<message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <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>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Se encontró un bloque corrupto que indica un posible fallo del hardware.</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>
@@ -3933,13 +4438,17 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Done loading</source>
- <translation type="unfinished">Generado pero no aceptado</translation>
+ <translation type="unfinished">Carga completa</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>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Fallo en la prueba de cordura de la criptografía de curva elíptica. %s se apagará.</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>
@@ -3953,7 +4462,11 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error initializing wallet database environment %s!</source>
- <translation type="unfinished">Error al inicializar el entorno de la base de datos del monedero %s</translation>
+ <translation type="unfinished">Error al inicializar el entorno de la base de datos de la billetera %s.</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <translation type="unfinished">Error al cargar %s</translation>
</message>
<message>
<source>Error loading %s: Private keys can only be disabled during creation</source>
@@ -3961,19 +4474,19 @@ No se puede restaurar la copia de seguridad de la billetera.</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: billetera dañada</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: la billetera 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>
@@ -3993,7 +4506,7 @@ No se puede restaurar la copia de seguridad 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>
+ <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>
@@ -4013,11 +4526,11 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
@@ -4037,15 +4550,15 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Error: Esta billetera ya es de descriptores</translation>
+ <translation type="unfinished">Error: Esta billetera ya está basada en 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>
+ <translation type="unfinished">Error: No se pueden 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>
+ <translation type="unfinished">Error: No se puede realizar una copia de seguridad de la billetera</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
@@ -4057,7 +4570,7 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <translation type="unfinished">Error: No se pudo leer el registro del mejor localizador de bloques de la billetera.</translation>
</message>
<message>
<source>Error: Unable to remove watchonly address book data</source>
@@ -4069,24 +4582,35 @@ No se puede restaurar la copia de seguridad de la 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>
+ <translation type="unfinished">Error: No se pudo escribir el registro del mejor localizador de bloques de la billetera solucionable.</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>
+ <translation type="unfinished">Error: No se pudo escribir el registro del mejor localizador de bloques de la billetera 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 la billetera 1%s
- </translation>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera %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 connect best block (%s).</source>
+ <translation type="unfinished">No se pudo conectar el mejor bloque (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">No se pudo desconectar el bloque.</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>
+ <translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
+ </message>
+ <message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">No se pudo leer el bloque.</translation>
</message>
<message>
<source>Failed to rescan the wallet during initialization</source>
@@ -4094,15 +4618,31 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Failed to start indexes, shutting down..</source>
- <translation type="unfinished">Es erróneo al iniciar indizados, se apaga...</translation>
+ <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>Failed to write block.</source>
+ <translation type="unfinished">No se pudo escribir el bloque.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos del índice de bloques.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Error al escribir en la base de datos de monedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Error al escribir datos para deshacer.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
- <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ <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>
@@ -4118,15 +4658,19 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">Incorrecto o bloque de génesis no encontrado. Datadir equivocada para la red?</translation>
+ <translation type="unfinished">El bloque génesis es incorrecto o no se encontró. ¿El directorio de datos es equivocado para la red?</translation>
+ </message>
+ <message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <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>
- <translation type="unfinished">No se encontró o ya se gastó la entrada</translation>
+ <translation type="unfinished">La entrada no se encontró o ya se gastó</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>
@@ -4134,15 +4678,15 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <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 de -onion o dominio '%s' invá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 de -proxy o dominio ' %s' invá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>
@@ -4157,16 +4701,24 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%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 netmask specified in -whitelist: '%s'</source>
+ <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">Fallo en la escucha para conexiones entrantes (la escucha devolvió el error %s)</translation>
+ <translation type="unfinished">Fallo al escuchar conexiones entrantes (la escucha devolvió el error %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -4174,7 +4726,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>
@@ -4185,14 +4737,22 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Cargando billetera...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">El peso máximo de la transacción debe estar entre %d y %d.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
- <translation type="unfinished">Falta la cantidad</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 la transacción</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>
+ </message>
+ <message>
<source>No addresses available</source>
<translation type="unfinished">No hay direcciones disponibles</translation>
</message>
@@ -4202,11 +4762,15 @@ No se puede restaurar la copia de seguridad de la billetera.</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>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Solo se ha establecido la dirección, sin permisos: "%s"</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
@@ -4218,7 +4782,11 @@ 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>
+ <translation type="unfinished">Reduciendo -maxconnections de %d a %d, debido a limitaciones del sistema.</translation>
</message>
<message>
<source>Replaying blocks…</source>
@@ -4249,8 +4817,20 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">El firmante no se hizo eco de la dirección</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">El firmante se hizo eco de una dirección inesperada %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">El firmante devolvió un error: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
- <translation type="unfinished">Transacción falló</translation>
+ <translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
<message>
<source>Specified -walletdir "%s" does not exist</source>
@@ -4277,8 +4857,20 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Error del sistema durante el vaciado:%s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Error del sistema al cargar un archivo de bloque externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Error del sistema al guardar el bloque en el disco: %s</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>
@@ -4286,15 +4878,27 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">El monto de la transacción es demasiado pequeño para pagar la comisión</translation>
+ <translation type="unfinished">El importe de la transacción es muy pequeño para pagar la comisión</translation>
+ </message>
+ <message>
+ <source>The wallet will avoid paying less than the minimum relay fee.</source>
+ <translation type="unfinished">La billetera evitará pagar menos que la comisión mínima de retransmisión.</translation>
+ </message>
+ <message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">No hay ningún ScriptPubKeyManager para esta direcció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>
+ <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 tarifa a pagar si realizas una transacción.</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>
@@ -4302,11 +4906,11 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Transaction amount too small</source>
- <translation type="unfinished">Monto 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 montos de la transacción no debe ser negativo</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>
@@ -4314,7 +4918,7 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
@@ -4325,10 +4929,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<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>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">No se puede establecer un enlace a %s en esta computadora (bind devolvió el error %s)</translation>
</message>
@@ -4361,6 +4961,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">No se puede analizar -maxuploadtarget: "%s"</translation>
</message>
<message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <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>
<translation type="unfinished">No se puede descargar la billetera antes de la migración</translation>
</message>
@@ -4378,23 +4982,27 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">La red especificada en -onlynet '%s' es 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">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opción no reconocida "%s" proporcionada en -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
+ <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>
+ <translation type="unfinished">Error al crear el archivo de la billetera: %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>
+ <translation type="unfinished">acceptstalefeeestimates no se admite en la cadena %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
@@ -4402,11 +5010,11 @@ No se puede restaurar la copia de seguridad de la billetera.</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>
+ <translation type="unfinished">Error: No se puede agregar la transacción solo de observación %s a la billetera solo de observación</translation>
</message>
<message>
<source>Error: Could not delete watchonly transactions. </source>
- <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ <translation type="unfinished">Error: No se pudieron eliminar las transacciones solo de observación</translation>
</message>
<message>
<source>User Agent comment (%s) contains unsafe characters.</source>
diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts
index 8ffd068e5c..a23c1ffdd9 100644
--- a/src/qt/locale/bitcoin_et.ts
+++ b/src/qt/locale/bitcoin_et.ts
@@ -1468,10 +1468,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Palun kontrolli aadressi ja proovi uuesti.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Sisestatud aadress ei viita võtmele.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Rahakoti lahtilukustamine on katkestatud.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_eu.ts b/src/qt/locale/bitcoin_eu.ts
index 78cac641f0..d3ed81efdd 100644
--- a/src/qt/locale/bitcoin_eu.ts
+++ b/src/qt/locale/bitcoin_eu.ts
@@ -310,7 +310,11 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Diruzorro lehenetsia</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -582,10 +586,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Diruzorro guztiak itxi</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Diruzorro lehenetsia</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ez dago diru-zorrorik eskura</translation>
</message>
@@ -860,10 +860,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Diruzorroa irekitzen abisua</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Diruzorro lehenetsia</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Diruzorroa zabaldu</translation>
@@ -2157,11 +2153,7 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<source>PSBT copied</source>
<translation type="unfinished">PSBT kopiatua</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Diruzorro lehenetsia</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts
index 5da96344e5..43b82049e1 100644
--- a/src/qt/locale/bitcoin_fa.ts
+++ b/src/qt/locale/bitcoin_fa.ts
@@ -2,106 +2,44 @@
<context>
<name>AddressBookPage</name>
<message>
- <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>
- </message>
- </context>
-<context>
- <name>AskPassphraseDialog</name>
- <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>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">برای ویرایش آدرس یا لیبل کلیک راست کنید</translation>
</message>
<message>
- <source>Wallet unlock failed</source>
- <translation type="unfinished">باز کردن Ù‚ÙÙ„ کی٠پول انجام نشد
- </translation>
+ <source>Create a new address</source>
+ <translation type="unfinished">آدرس جدید بسازید</translation>
</message>
<message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">عبارت عبور وارد شده برای رمزگشایی کی٠پول نادرست است.
- </translation>
+ <source>&amp;New</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>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">آدرس انتخاب شده را در حاÙظه سیستم ذخیره کنید</translation>
</message>
<message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">هشدار: کلید کلاه Ù‚ÙÙ„ روشن است!
- </translation>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">هم اÙزایی</translation>
</message>
-</context>
-<context>
- <name>BanTableModel</name>
<message>
- <source>IP/Netmask</source>
- <translation type="unfinished">آی پی/نت ماسک</translation>
+ <source>C&amp;lose</source>
+ <translation type="unfinished">بستن</translation>
</message>
<message>
- <source>Banned Until</source>
- <translation type="unfinished">مسدودشده تا</translation>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">آدرس انتخاب شده را از لیست پاک کنید</translation>
</message>
-</context>
+ </context>
<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>Internal error</source>
- <translation type="unfinished">مشکل داخلی</translation>
- </message>
+ <name>AskPassphraseDialog</name>
<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>
+ <source>Back</source>
+ <translation type="unfinished">بازگشت</translation>
</message>
-</context>
+ </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">یک خطای مرگبار رخ داد. بررسی کنید Ú©Ù‡ Ùایل تنظیمات قابل نوشتن باشد یا سعی کنید با -nosettings اجرا کنید.</translation>
- </message>
- <message>
<source>Error: %1</source>
<translation type="unfinished">خطا: %1</translation>
</message>
@@ -110,8 +48,12 @@
<translation type="unfinished">%1 هنوز به صورت ایمن بیرون نرÙته است...</translation>
</message>
<message>
- <source>unknown</source>
- <translation type="unfinished">ناشناس</translation>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">تعبیه شده%1</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">سÙارشی...</translation>
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
@@ -236,6 +178,11 @@
<source>%1 GB</source>
<translation type="unfinished">%1 گیگابایت</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">کی٠پول پیش Ùرض
+ </translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -300,7 +247,7 @@
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">پراکسی &lt;br&gt;Ùعال شده است: %1&lt;/br&gt;</translation>
+ <translation type="unfinished">پراکسی &lt;b&gt;Ùعال&lt;/b&gt; شده است: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -324,10 +271,6 @@
<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>
@@ -409,14 +352,6 @@
<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 و بیت‌کوین: URIs)</translation>
- </message>
- <message>
<source>Show the list of used sending addresses and labels</source>
<translation type="unfinished">نمایش لیست آدرس‌ها Ùˆ لیبل‌های ارسالی استÙاده شده</translation>
</message>
@@ -431,7 +366,7 @@
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>سابقه تراکنش بلوک(های) %n پردازش شد.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
</translation>
</message>
<message>
@@ -510,20 +445,10 @@
<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>default wallet</source>
- <translation type="unfinished">کی٠پول پیش Ùرض
- </translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">هیچ کی٠پولی در دسترس نمی باشد</translation>
</message>
@@ -538,11 +463,6 @@
<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>
@@ -571,7 +491,7 @@
<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>
@@ -603,114 +523,59 @@
<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
-</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>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
<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>
+ <source>After Fee:</source>
+ <translation type="unfinished">بعد از احتساب کارمزد</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>
+ <source>Change:</source>
+ <translation type="unfinished">تغییر</translation>
</message>
<message>
- <source>Original message:</source>
- <translation type="unfinished">پیام اصلی:</translation>
+ <source>(un)select all</source>
+ <translation type="unfinished">(عدم)انتخاب همه</translation>
</message>
-</context>
-<context>
- <name>CoinControlDialog</name>
<message>
- <source>Coin Selection</source>
- <translation type="unfinished">انتخاب سکه
- </translation>
+ <source>Tree mode</source>
+ <translation type="unfinished">حالت درختی</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation type="unfinished">حالت لیستی</translation>
</message>
<message>
- <source>Quantity:</source>
- <translation type="unfinished">مقدار</translation>
+ <source>Amount</source>
+ <translation type="unfinished">میزان وجه:</translation>
</message>
<message>
- <source>Bytes:</source>
- <translation type="unfinished">بایت ها:</translation>
+ <source>Received with label</source>
+ <translation type="unfinished">دریاÙت شده با برچسب</translation>
</message>
<message>
- <source>Amount:</source>
- <translation type="unfinished">میزان وجه:</translation>
+ <source>Received with address</source>
+ <translation type="unfinished">دریاÙت شده با آدرس</translation>
</message>
<message>
- <source>Fee:</source>
- <translation type="unfinished">هزینه</translation>
+ <source>Date</source>
+ <translation type="unfinished">تاریخ</translation>
</message>
<message>
- <source>After Fee:</source>
- <translation type="unfinished">بعد از احتساب کارمزد</translation>
+ <source>Confirmations</source>
+ <translation type="unfinished">تاییدیه</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">تغییر</translation>
+ <source>Confirmed</source>
+ <translation type="unfinished">تایید شده</translation>
</message>
<message>
- <source>List mode</source>
- <translation type="unfinished">حالت لیستی</translation>
+ <source>Copy amount</source>
+ <translation type="unfinished">کپی مقدار</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -761,6 +626,10 @@
<translation type="unfinished">(Ù‚ÙÙ„ شده است %1)</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>
@@ -815,420 +684,45 @@
</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>
+ <name>MigrateWalletActivity</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>
- <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>Close all wallets</source>
- <translation type="unfinished">همه‌ی کی٠پول‌ها را ببند</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">اسکریپت های Watchonly با موÙقیت به کی٠پول '%1' منتقل گردیدند.</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">غیر Ùعال کردن کلیدهای خصوصی برای این کی٠پول. کی٠پول هایی با کلید های خصوصی غیر Ùعال هیچ کلید خصوصی نداشته Ùˆ نمیتوانند 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>
- <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 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>
- <source>Edit Address</source>
- <translation type="unfinished">ویرایش آدرس</translation>
- </message>
- <message>
- <source>&amp;Label</source>
- <translation type="unfinished">برچسب</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>&amp;Address</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>
- <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>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>
-</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>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>%n گیگابایت Ùضای موجود</numerusform>
+ <numerusform>%n GB of space available</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform>(از %n گیگابایت مورد نیاز)</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 گیگابایت برای زنجیره کامل مورد نیاز است)</numerusform>
+ <numerusform>(%n GB needed for full chain)</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 گیگابایت اطلاعات در این شاخه ذخیره خواهد شد، Ú©Ù‡ به مرور زمان اÙزایش خواهد یاÙت.</translation>
- </message>
- <message>
- <source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">تقریبا %1 گیگابایت داده در این شاخه ذخیره خواهد شد.</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>(برای بازیابی نسخه‌های پشتیبان %n روز (های) قدیمی کاÙÛŒ است)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
</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> GB</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 شروع به دانلود و پردازش زنجیره بلاک %4 کامل (%2 گیگابایت) می‌کند که با اولین تراکنش‌ها در %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>
- <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>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>Esc</source>
- <translation type="unfinished">خروج</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>URI:</source>
- <translation type="unfinished">آدرس:</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>
<context>
<name>OptionsDialog</name>
<message>
- <source>Options</source>
- <translation type="unfinished">گزینه ها</translation>
- </message>
- <message>
- <source>&amp;Main</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>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">اندازه کش پایگاه داده.</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>
+ <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>
@@ -1721,921 +1215,46 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;ذخیره کردن تصویر...</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;کپی کردن image</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">URL ایجاد شده خیلی طولانی است. سعی کنید طول برچسب و یا پیام را کمتر کنید.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">خطا در تبدیل نشانی اینترنتی به صورت کد QR.</translation>
- </message>
- <message>
- <source>QR code support not available.</source>
- <translation type="unfinished">پستیبانی از QR کد در دسترس نیست.</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">ذحیره کردن Qr Code</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">ویرایش کنسول RPC</translation>
- </message>
- <message>
- <source>&amp;Information</source>
- <translation type="unfinished">&amp;اطلاعات</translation>
- </message>
- <message>
- <source>General</source>
- <translation type="unfinished">عمومی</translation>
- </message>
- <message>
- <source>Datadir</source>
- <translation type="unfinished">پوشه داده Datadir</translation>
- </message>
- <message>
- <source>Blocksdir</source>
- <translation type="unfinished">Ùولدر بلاکها</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;ریست کردن</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;همتاها</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>Version</source>
- <translation type="unfinished">نسخه</translation>
- </message>
- <message>
- <source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">اگرچه ما تراکنش ها را به این همتا بازپخش کنیم.</translation>
- </message>
- <message>
- <source>Transaction Relay</source>
- <translation type="unfinished">بازپخش تراکنش </translation>
- </message>
- <message>
- <source>Starting Block</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>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>
- </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>
- </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>
- </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>
- </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>Decrease font size</source>
- <translation type="unfinished">کاهش دادن اندازه Ùونت</translation>
- </message>
- <message>
- <source>Increase font size</source>
- <translation type="unfinished">اÙزایش دادن اندازه Ùونت</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, or 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">مدت زمان پینگ</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">انتظار پینگ</translation>
- </message>
- <message>
- <source>Min Ping</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;بازکردن</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">&amp;کنسول</translation>
- </message>
- <message>
- <source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;شلوغی شبکه</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>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>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">تکثیر نشانی</translation>
- </message>
- <message>
- <source>&amp;Disconnect</source>
- <translation type="unfinished">&amp;قطع شدن</translation>
- </message>
- <message>
- <source>1 &amp;hour</source>
- <translation type="unfinished">1 &amp;ساعت</translation>
- </message>
- <message>
- <source>1 d&amp;ay</source>
- <translation type="unfinished">1 روز</translation>
- </message>
- <message>
- <source>1 &amp;week</source>
- <translation type="unfinished">1 &amp;Ù‡Ùته</translation>
- </message>
- <message>
- <source>1 &amp;year</source>
- <translation type="unfinished">1 &amp;سال</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;کپی IP/Netmask</translation>
- </message>
- <message>
- <source>&amp;Unban</source>
- <translation type="unfinished">&amp;خارج کردن از بن</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>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>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">میزان وجه:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">برچسب:</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">پیام:</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; ایجاد آدرس دریاÙت جدید
- </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;آدرس URL</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>Copy &amp;message</source>
- <translation type="unfinished">کپی &amp;پیام </translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">روگرÙت Ù…&amp;قدار</translation>
- </message>
- <message>
- <source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">به دلیل کارمزد زیاد Ùˆ محاÙظت کمتر در برابر خطای تایپی پیشنهاد نمی‌شود</translation>
- </message>
- <message>
- <source>Generates an address compatible with older wallets.</source>
- <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>
</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>Copy &amp;URI</source>
- <translation type="unfinished">کپی کردن &amp;آدرس URL</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">کپی آدرس</translation>
- </message>
- <message>
- <source>&amp;Verify</source>
- <translation type="unfinished">&amp;تایید کردن</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;ذخیره کردن تصویر...</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>Message</source>
- <translation type="unfinished">پیام</translation>
+ <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>
- <message>
- <source>Requested</source>
- <translation type="unfinished">درخواست شده</translation>
- </message>
-</context>
+ </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>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">استÙاده از Fallbackfee Ù…ÛŒ تواند منجر به ارسال تراکنشی شود Ú©Ù‡ تأیید آن چندین ساعت یا روز (یا هرگز) طول Ù…ÛŒ کشد. هزینه خود را به صورت دستی انتخاب کنید یا صبر کنید تا زنجیره کامل را تأیید کنید.</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">به ازای هر کیلوبایت</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;گیرنده</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">مشخص کردن هزینه کارمزد مخصوص به ازای کیلوبایت(1,000 بایت) حجم مجازی تراکنش
-
-توجه: از آن جایی Ú©Ù‡ کارمزد بر اساس هر بایت محاسبه Ù…ÛŒ شود,هزینه کارمزد"100 ساتوشی بر کیلو بایت"برای تراکنش با حجم 500 بایت مجازی (نص٠1 کیلوبایت) کارمزد Ùقط اندازه 50 ساتوشی خواهد بود.</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">پاک کردن همه</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">و ارسال</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">کپی مقدار</translation>
</message>
<message>
- <source>Copy fee</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>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">مسیر اسکریپت امضاکننده خارجی را در Options -&gt; Wallet تنظیم کنید</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>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">تو میتوانی بعدا هزینه کارمزد را اÙزایش بدی(signals Replace-By-Fee, BIP-125)</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>
- </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>
- </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>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>
- <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>
- <message>
- <source>Confirm send coins</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>
- <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">
@@ -2643,280 +1262,12 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</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>
- </context>
-<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>A&amp;mount:</source>
- <translation type="unfinished">میزان وجه</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">پرداخت به:
- </translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">برچسب:</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">آدرس Bitcoin برای ارسال پرداخت به
- </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>Use available balance</source>
- <translation type="unfinished">استÙاده از موجودی حساب</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">پیام:</translation>
- </message>
- </context>
-<context>
- <name>SendConfirmationDialog</name>
- <message>
- <source>Send</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;ثبت پیام</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;پیام</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">تنظیم مجدد همه امضاء کردن زمینه های پیام</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">پاک کردن همه</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">&amp; تأیید پیام</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>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">پیام را تأیید کنید تا مطمئن شوید با آدرس Bitcoin مشخص شده امضا شده است
- </translation>
- </message>
- <message>
- <source>Verify &amp;Message</source>
- <translation type="unfinished">تایید پیام</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">برای تولید امضا "Sign Message" و یا "ثبت پیام" را کلیک کنید</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>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(q را Ùشار دهید تا خاموش شود Ùˆ بعدا ادامه دهید)</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">q را Ùشار دهید تا خاموش شود</translation>
- </message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
- <message>
- <source>kB/s</source>
- <translation type="unfinished">کیلوبایت بر ثانیه</translation>
+ <source>(no label)</source>
+ <translation type="unfinished">(برچسبی ندارد)</translation>
</message>
</context>
<context>
<name>TransactionDesc</name>
- <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>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">
@@ -2924,82 +1275,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</translation>
</message>
<message>
- <source>not accepted</source>
- <translation type="unfinished">قبول نشده</translation>
- </message>
- <message>
- <source>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">شناسه تراکنش</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>Merchant</source>
- <translation type="unfinished">بازرگان</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>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>
+ <source>Amount</source>
+ <translation type="unfinished">میزان وجه:</translation>
</message>
-</context>
+ </context>
<context>
<name>TransactionTableModel</name>
<message>
@@ -3007,186 +1286,17 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">تأیید شده (%1 تأییدیه)</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>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>
+ <source>(no label)</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>
<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>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">تکثیر نشانی</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">تکثیر برچسب</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">روگرÙت Ù…&amp;قدار</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID</source>
- <translation type="unfinished">کپی شناسه تراکنش </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">اÙزایش کارمزد تراکنش</translation>
- </message>
- <message>
- <source>A&amp;bandon transaction</source>
- <translation type="unfinished">ترک معامله</translation>
- </message>
- <message>
- <source>&amp;Edit address label</source>
- <translation type="unfinished">&amp;ویرایش برچسب آدرس</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>Watch-only</source>
- <translation type="unfinished">Ùقط برای تماشا</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">نوع</translation>
</message>
- <message>
- <source>ID</source>
- <translation type="unfinished">شناسه</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation type="unfinished">خارج کردن موÙقیت آمیز بود Exporting</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation type="unfinished">دامنه:</translation>
- </message>
- <message>
- <source>to</source>
- <translation type="unfinished">به</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletFrame</name>
<message>
@@ -3200,82 +1310,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</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>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>
- <message>
- <source>Can't sign 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>
- <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>Backup Successful</source>
- <translation type="unfinished">پشتیبان گیری موÙقیت آمیز است
- </translation>
- </message>
- <message>
<source>Cancel</source>
<translation type="unfinished">لغو</translation>
</message>
@@ -3283,442 +1324,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<context>
<name>bitcoin-core</name>
<message>
- <source>The %s developers</source>
- <translation type="unfinished">%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 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>
- </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 ممکن است Ùایل های بلوک را در خود جای ندهد. تقریبا %u گیگابایت داده در این Ùهرست ذخیره خواهد شد</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">خطا در بارگیری کی٠پول. کی٠پول برای بارگیری به بلوک‌ها نیاز دارد، Ùˆ نرم‌اÙزار در حال حاضر از بارگیری کی٠پول‌ها پشتیبانی نمی‌کند، استÙاده از تصاویر گره ( نود ) های کامل جدیدی Ú©Ù‡ تأیید های قدیمی را به تعویق Ù…ÛŒ اندازند، باعث می‌شود بلوک ها بدون نظم دانلود شود. بارگیری کامل اطلاعات کی٠پول Ùقط پس از اینکه همگام‌سازی گره به ارتÙاع %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" "مورد انتظار".</translation>
- </message>
- <message>
- <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">خطا: رکورد شناسه Dumpfile نادرست است. دریاÙت "%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 پشتیبانی نمی شود. این نسخه کی٠پول بیت کوین Ùقط از Ùایل های dumpfiles نسخه 1 پشتیبانی Ù…ÛŒ کند. Dumpfile با نسخه %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">خطا: امکان تولید جزئیات برای این کی٠پول نوع legacy وجود ندارد. در صورتی که کی٠پول رمزگذاری شده است، مطمئن شوید که عبارت عبور آن را درست وارد کرده‌اید.</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). اگر Ùکر Ù…ÛŒ کنید این یک اشکال است، لطÙاً آن را به %s گزارش دهید. به عنوان یک راه حل، Ù…ÛŒ توانید Ùایل (%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>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">هرس: آخرین هماهنگی کی٠پول Ùراتر از داده های هرس شده است. شما باید دوباره -exe کنید (در صورت گره هرس شده دوباره Ú©Ù„ بلاکچین را بارگیری کنید)
- </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 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 transaction fee you may pay when fee estimates are not available.</source>
- <translation type="unfinished">این است هزینه معامله ممکن است پرداخت چه زمانی هزینه تخمین در دسترس نیست</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>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
- <translation type="unfinished">هشدار: قالب کی٠پول Dumpfile "%s" با Ùرمت مشخص شده خط Ùرمان %s مطابقت ندارد.</translation>
- </message>
- <message>
- <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <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>
- <message>
- <source>%s is set very high!</source>
- <translation type="unfinished">%s بسیار بزرگ انتخاب شده است.</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 روی نادرست نمی توان -forcednsseed را روی درست تنظیم کرد.</translation>
- </message>
- <message>
<source>Cannot write to data directory '%s'; check permissions.</source>
<translation type="unfinished">نمیتواند پوشه داده ها را بنویسد ' %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>
- <message>
- <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">اتصالات خروجی محدود به 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">اندازه ورودی از حداکثر مقدار موجودی بیشتر است. لطÙاً مقدار کمتری ارسال کنید یا به صورت دستی مقدار موجودی خرج نشده کی٠پول خود را در ارسال تراکنش اعمال کنید. </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>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">ورودی خارج از دستور از نوع legacy در کی٠پول مورد نظر پیدا شد. در حال بارگیری کی٠پول %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>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 creating %s</source>
- <translation type="unfinished">خطا در ایجاد %s</translation>
- </message>
- <message>
- <source>Error initializing block database</source>
- <translation type="unfinished">خطا در آماده سازی پایگاه داده ی بلوک</translation>
- </message>
- <message>
- <source>Error loading %s</source>
- <translation type="unfinished">خطا بازگذاری %s</translation>
- </message>
- <message>
- <source>Error loading block database</source>
- <translation type="unfinished">خطا در بارگذاری پایگاه داده بلاک block</translation>
- </message>
- <message>
- <source>Error opening block database</source>
- <translation type="unfinished">خطا در بازکردن پایگاه داده بلاک block</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: 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>
- </message>
- <message>
- <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">خطا: جمع چکی Dumpfile مطابقت ندارد. محاسبه شده %s، مورد انتظار %s.</translation>
- </message>
- <message>
- <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: 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: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">خطا: تجزیه نسخه %u به عنوان uint32_t ممکن نیست</translation>
- </message>
- <message>
- <source>Error: Unable to write record to new wallet</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>
- <message>
- <source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">در هنگام مقداردهی اولیه ، مجدداً اسکن کی٠پول انجام نشد
- </translation>
- </message>
- <message>
- <source>Importing…</source>
- <translation type="unfinished">در حال واردات…</translation>
- </message>
- <message>
- <source>Input not found or already spent</source>
- <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 -proxy address or hostname: '%s'</source>
- <translation type="unfinished">آدرس پراکسی یا هاست نامعتبر: ' %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 port specified in %s: '%s'</source>
- <translation type="unfinished">پورت نامعتبری در %s انتخاب شده است : «%s»</translation>
- </message>
- <message>
- <source>Invalid pre-selected input %s</source>
- <translation type="unfinished">ورودی از پیش انتخاب شده %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>
- </message>
- <message>
- <source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">داده های حل برای تخمین اندازه تراکنش وجود ندارد</translation>
- </message>
- <message>
- <source>No addresses available</source>
- <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>
- <translation type="unfinished">ورودی از پیش انتخاب شده %s پیدا نشد </translation>
- </message>
- <message>
- <source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">ورودی از پیش انتخاب شده %s قابل محاسبه نیست </translation>
- </message>
- <message>
- <source>Pruning blockstore…</source>
- <translation type="unfinished">هرس بلوک Ùروشی…</translation>
- </message>
- <message>
- <source>Replaying blocks…</source>
- <translation type="unfinished">در حال پخش مجدد بلوک ها…</translation>
- </message>
- <message>
- <source>Rescanning…</source>
- <translation type="unfinished">در حال اسکن مجدد…</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">ثبت تراکنش با خطا مواجه شد</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">کی٠پول از پرداخت کمتر از حداقل هزینه رله جلوگیری خواهد کرد.
- </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 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 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 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">قادر به تجزیه -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>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">قوانین جدید ناشناخته Ùعال شد (‌%iversionbit)</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>Settings file could not be read</source>
- <translation type="unfinished">Ùایل تنظیمات خوانده نشد</translation>
- </message>
- <message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">Ùایل تنظیمات نوشته نشد</translation>
- </message>
-</context>
+ </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts
index cbf81afdb2..c72d64d7b9 100644
--- a/src/qt/locale/bitcoin_fi.ts
+++ b/src/qt/locale/bitcoin_fi.ts
@@ -2,8 +2,8 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Create a new address</source>
- <translation type="unfinished">Luo uusi osoite</translation>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Valitse hiiren kakkospainikkeella muokataksesi osoitetta tai nimikettä</translation>
</message>
<message>
<source>&amp;New</source>
@@ -54,10 +54,6 @@
<translation type="unfinished">V&amp;alitse</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>
- <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">Nämä ovat Bitcoin-osoitteesi maksujen vastaanottoa varten. Käytä painiketta "Luo uusi vastaanotto-osoite" vastaanottovälilehdessä luodaksesi uusia osoitteita.
@@ -90,6 +86,14 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Virhe tallentaessa osoitelistaa kohteeseen %1. Yritä uudelleen.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Osoitteiden lähettäminen - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Vastaanottava osoite - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Vienti epäonnistui</translation>
</message>
@@ -172,6 +176,14 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Syötä vanha ja uusi salasanalause lompakolle.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Jatka</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Takaisin</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">Muista, että salaamalla lompakkosi et täysin pysty suojaamaan bitcoineja varkaudelta, jotka aiheutuvat koneellasi olevista haittaohjelmista.</translation>
</message>
@@ -291,6 +303,18 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">tuntematon</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">upotettu "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Järjestelmän oletuskirjasin "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Mukautettu…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Määrä</translation>
</message>
@@ -303,6 +327,12 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Reitittämätön</translation>
</message>
<message>
+ <source>Onion</source>
+ <comment>network name</comment>
+ <extracomment>Name of Tor network in peer info</extracomment>
+ <translation type="unfinished">Sipuli</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">Sisääntuleva</translation>
@@ -313,11 +343,26 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Ulosmenevä</translation>
</message>
<message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">Täysi Rele</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">Lohko Rele</translation>
+ </message>
+ <message>
<source>Manual</source>
<extracomment>Peer connection type established manually through one of several methods.</extracomment>
<translation type="unfinished">Manuaali</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Tunturi</translation>
+ </message>
+ <message>
<source>Address Fetch</source>
<extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
<translation type="unfinished">Osoitteen haku</translation>
@@ -376,7 +421,11 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<numerusform>%n vuotta</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">oletuslompakko</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -616,6 +665,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Lataa osittain allekirjoitettu bitcoin-siirtotapahtuma</translation>
</message>
<message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Lataa PSBT &amp;leikepöydältä…</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">Lataa osittain allekirjoitettu bitcoin-siirtotapahtuma leikepöydältä</translation>
</message>
@@ -666,6 +719,14 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Sulje kaikki lompakot</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Siirrä lompakko</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Siirrä lompakko</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Näytä %1 ohjeet saadaksesi listan mahdollisista Bitcoinin komentorivivalinnoista</translation>
</message>
@@ -678,10 +739,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Naamioi arvot Yhteenveto-välilehdessä</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">oletuslompakko</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Lompakoita ei ole saatavilla</translation>
</message>
@@ -725,6 +782,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<source>&amp;Hide</source>
<translation type="unfinished">&amp;Piilota</translation>
</message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">N&amp;äytä</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -754,6 +815,18 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Ota verkkotoiminta käyttöön</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Esi synkronoidaan otsikot (%1%)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Virhe luodessa lompakkoa</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Uutta lompakkoa ei voi luoda, ohjelmisto on käännetty ilman sqlite-tukea (tarvitaan kuvauslompakoissa)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Virhe: %1</translation>
</message>
@@ -920,6 +993,14 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Kopioi &amp;määrä</translation>
</message>
<message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">Kopioi tapahtumatunnus &amp;ID ja tulosindeksi</translation>
+ </message>
+ <message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">L&amp;kitse käyttämättömät</translation>
+ </message>
+ <message>
<source>&amp;Unlock unspent</source>
<translation type="unfinished">&amp;Avaa käyttämättömien lukitus</translation>
</message>
@@ -1007,6 +1088,57 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Siirrä lompakko</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Oletko varma, että haluat siirtää lompakon &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">Lompakon siirtäminen muuntaa tämän lompakon yhdeksi tai useammaksi kuvailluksi lompakoksi. Uusi lompakon varmuuskopio on tehtävä.
+Jos tämä lompakko sisältää vain katseltavia skriptejä, luodaan uusi lompakko, joka sisältää nämä katseltavat skriptit.
+Jos tämä lompakko sisältää ratkaistavia mutta ei katsottuja skriptejä, luodaan eri ja uusi lompakko, joka sisältää nämä skriptit.
+
+Siirtoprosessi luo varmuuskopion lompakosta ennen siirtoa. Tämä varmuuskopiotiedosto nimetään &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak ja se löytyy tämän lompakon hakemistosta. Virheellisen siirron sattuessa varmuuskopio voidaan palauttaa "Palauta lompakko" -toiminnolla.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Siirrä lompakko</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Siirretään lompakkoa &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Lompakko '%1' siirrettiin onnistuneesti.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Pelkästään katseltavissa olevat skriptit on siirretty uuteen lompakkoon nimeltä '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Ratkaistavat mutta ei katsotut skriptit on siirretty uuteen lompakkoon nimeltä '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Siirto epäonnistui</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Siirto onnistui</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1017,10 +1149,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Avoimen lompakon varoitus</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">oletuslompakko</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Avaa lompakko</translation>
@@ -1048,7 +1176,17 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
<translation type="unfinished">Lompakon palauttaminen epäonnistui</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">Palauta lompakkovaroitus</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">Palauta lompakkoviesti</translation>
+ </message>
+</context>
<context>
<name>WalletController</name>
<message>
@@ -1075,6 +1213,14 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Luo lompakko</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Olet yhden askeleen päässä uuden lompakon luomisesta!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Anna nimi ja ota halutessasi käyttöön lisäasetukset</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Lompakon nimi</translation>
</message>
@@ -1211,8 +1357,8 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n GB vapaata tilaa</numerusform>
+ <numerusform>%n GB vapaata tilaa</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1294,6 +1440,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Tämä alustava synkronointi on erittäin vaativa ja saattaa tuoda esiin laiteongelmia, joita ei aikaisemmin ole havaittu. Aina kun ajat %1:n, jatketaan siitä kohdasta, mihin viimeksi jäätiin.</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">Kun napsautat OK, %1 alkaa ladata ja käsitellä koko %4 lohkoketjun (%2 GB) alkaen ensimmäisistä tapahtumista %3 kun %4 alun perin käynnistetty.</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">Vaikka olisitkin valinnut rajoittaa lohkoketjun tallennustilaa (karsinnalla), täytyy historiatiedot silti ladata ja käsitellä, mutta ne poistetaan jälkikäteen levytilan säästämiseksi.</translation>
</message>
@@ -1390,7 +1540,11 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<source>Unknown. Syncing Headers (%1, %2%)…</source>
<translation type="unfinished">Tuntematon. Synkronoidaan järjestysnumeroita (%1,%2%)...</translation>
</message>
- </context>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Tuntematon. Esi-synkronointi otsikot (%1, %2%)...</translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1434,6 +1588,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Säikeiden määrä skriptien &amp;varmistuksessa</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">Täysi polku %1 yhteensopivaan komentosarjaan (esim. C:\Downloads\hwi.exe tai /Users/you/Downloads/hwi.py). Varo: haittaohjelmat voivat varastaa kolikkosi!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">IP osoite proxille (esim. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1446,6 +1604,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Minimoi ikkuna ohjelman sulkemisen sijasta kun ikkuna suljetaan. Kun tämä asetus on käytössä, ohjelma suljetaan vain valittaessa valikosta Poistu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fontti Yleiskatsaus-välilehdellä:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Tässä valintaikkunassa asetetut asetukset ohitetaan komentorivillä:</translation>
</message>
@@ -1487,6 +1649,11 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Tietokannan välimuistin enimmäiskoko. Suurempi välimuisti voi nopeuttaa synkronointia, mutta sen jälkeen hyöty ei ole enää niin merkittävä useimmissa käyttötapauksissa. Välimuistin koon pienentäminen vähentää muistin käyttöä. Käyttämätön mempool-muisti jaetaan tätä välimuistia varten.</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">Aseta komentosarjan vahvistusketjujen määrä. Negatiiviset arvot vastaavat niiden ytimien määrää, jotka haluat jättää järjestelmälle vapaiksi.</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished">(0 = auto, &lt;0 = jätä näin monta ydintä vapaaksi)</translation>
</message>
@@ -1505,6 +1672,16 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">&amp;Lompakko</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">Määritetäänkö summasta vähennysmaksu oletusarvoksi vai ei.</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">Vähennä &amp;maksu oletuksena summasta</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation type="unfinished">Expertti</translation>
</message>
@@ -1526,10 +1703,19 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Aktivoi &amp;PSBT kontrollit</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">Näytetäänkö PSBT-ohjaimet.</translation>
+ </message>
+ <message>
<source>External Signer (e.g. hardware wallet)</source>
<translation type="unfinished">Ulkopuolinen allekirjoittaja (esim. laitelompakko)</translation>
</message>
<message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">&amp;Ulkoisen allekirjoittajan komentosarjapolku</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">Avaa Bitcoin-asiakasohjelman portti reitittimellä automaattisesti. Tämä toimii vain, jos reitittimesi tukee UPnP:tä ja se on käytössä.</translation>
</message>
@@ -1622,6 +1808,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Valitse mitä yksikköä käytetään ensisijaisesti bitcoin-määrien näyttämiseen.</translation>
</message>
<message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">&amp;Kolmannen osapuolen tapahtuma-URL-osoitteet</translation>
+ </message>
+ <message>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished">Näytetäänkö kolikkokontrollin ominaisuuksia vai ei</translation>
</message>
@@ -1661,6 +1851,11 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Ohjelman uudelleenkäynnistys aktivoi muutokset.</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">Nykyiset asetukset varmuuskopioidaan klo"%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">Asiakasohjelma sammutetaan. Haluatko jatkaa?</translation>
@@ -1701,6 +1896,13 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
</message>
</context>
<context>
+ <name>OptionsModel</name>
+ <message>
+ <source>Could not read setting "%1", %2.</source>
+ <translation type="unfinished">Ei voinut luke asetusta "%1", %2.</translation>
+ </message>
+</context>
+<context>
<name>OverviewPage</name>
<message>
<source>Form</source>
@@ -1782,6 +1984,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>PSBT Operations</source>
+ <translation type="unfinished">PSBT-toiminnot</translation>
+ </message>
+ <message>
<source>Sign Tx</source>
<translation type="unfinished">Allekirjoita Tx</translation>
</message>
@@ -1855,6 +2061,10 @@ 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 kohteelle %2</translation>
+ </message>
+ <message>
<source>own address</source>
<translation type="unfinished">oma osoite</translation>
</message>
@@ -1960,6 +2170,11 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Vertainen</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">Ikä</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">Suunta</translation>
@@ -2127,10 +2342,30 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Valitse vertainen eriteltyjä tietoja varten.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Kuljetuskerroksen versio: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Kuljetus</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Istunnon tunniste</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versio</translation>
</message>
<message>
+ <source>Whether we relay transactions to this peer.</source>
+ <translation type="unfinished">Välitämmekö tapahtumat tälle vertaiselle.</translation>
+ </message>
+ <message>
+ <source>Transaction Relay</source>
+ <translation type="unfinished">Siirtokulu</translation>
+ </message>
+ <message>
<source>Starting Block</source>
<translation type="unfinished">Alkaen lohkosta</translation>
</message>
@@ -2155,11 +2390,36 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Kartoitettu 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">Välitämmekö osoitteet tälle vertaiselle.</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">Osoitevälitys</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">Tältä vertaiselta käsiteltyjen osoitteiden kokonaismäärä (ei sisällä osoitteita, jotka hylättiin nopeusrajoituksen vuoksi).</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">Tältä vertaiselta saatujen osoitteiden kokonaismäärä, jotka hylättiin (ei käsitelty) nopeusrajoituksen vuoksi.</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>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">Osoitteiden määrärajoitus</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation type="unfinished">Käyttöliittymä</translation>
</message>
@@ -2220,6 +2480,11 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Viimeisin lohko</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">Kulunut aika siitä, kun tältä vertaiskumppanilta vastaanotettiin muistiomme hyväksytty uusi tapahtuma.</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">Viimeisin lähetetty</translation>
</message>
@@ -2289,6 +2554,53 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Saapuva: vertaisen aloittama</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">Lähtevä täysi välitys: oletus</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">Outbound Block Relay: ei välitä tapahtumia tai osoitteita</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: lyhytaikainen, osoitteiden testaamiseen</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">Lähtevän osoitteen haku: lyhytkestoinen, osoitteiden pyytämiseen</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">havaitseminen: vertaiskumppani voi olla v1 tai v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: salaamaton, selväkielinen siirtoprotokolla</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324-salattu siirtoprotokolla</translation>
+ </message>
+ <message>
+ <source>we selected the peer for high bandwidth relay</source>
+ <translation type="unfinished">valitsimme korkean kaistanleveyden releen vertaislaitteen</translation>
+ </message>
+ <message>
+ <source>the peer selected us for high bandwidth relay</source>
+ <translation type="unfinished">vertaiskumppani valitsi meidät suuren kaistanleveyden välitykseen</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">suuren kaistanleveyden relettä ei ole valittu</translation>
+ </message>
+ <message>
<source>Ctrl+=</source>
<extracomment>Secondary shortcut to increase the RPC console font size.</extracomment>
<translation type="unfinished">Ctrl+-</translation>
@@ -2307,6 +2619,10 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">1 &amp;tunti</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 p&amp;ivä</translation>
+ </message>
+ <message>
<source>1 &amp;week</source>
<translation type="unfinished">1 &amp;viikko</translation>
</message>
@@ -2315,6 +2631,11 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">1 &amp;vuosi</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;Kopioi IP/verkkopeite</translation>
+ </message>
+ <message>
<source>&amp;Unban</source>
<translation type="unfinished">&amp;Poista esto</translation>
</message>
@@ -2323,6 +2644,10 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Verkkoliikenne pysäytetty</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ei yhtään</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Suoritetaan komento ilman lomakkoa</translation>
</message>
@@ -2331,6 +2656,22 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Suoritetaan komento käyttäen lompakkoa "%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">Tervetuloa %1 RPC-konsoliin.
+Käytä ylä- ja alanuolinäppäintä historiassa navigoimiseen ja näppäintä %2 näytön tyhjentämiseen.
+Käytä näppäimiä %3 ja %4 fonttikoon suurentamiseen ja pienentämiseen.
+Näet yleiskuvan käytettävistä komennoista kirjoittamalla %5.
+Lisätietoja konsolin käytöstä saat kirjoittamalla %6.
+%7VAROITUS: Huijarit ovat aktiivisesti yrittäneet varastaa käyttäjien lompakoiden sisältöä pyytämällä heitä kirjoittamaan komentoja tänne. Älä käytä tätä konsolia, jos et täysin ymmärrän komennon seurauksia.%8</translation>
+ </message>
+ <message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished">Suoritetaan...</translation>
@@ -2463,6 +2804,27 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Kopioi &amp;määrä</translation>
</message>
<message>
+ <source>Base58 (Legacy)</source>
+ <translation type="unfinished">Base58 (Vanha)</translation>
+ </message>
+ <message>
+ <source>Not recommended due to higher fees and less protection against typos.</source>
+ <translation type="unfinished">Ei suositella korkeampien maksujen ja heikomman suojan kirjoitusvirheitä vastaan.</translation>
+ </message>
+ <message>
+ <source>Generates an address compatible with older wallets.</source>
+ <translation type="unfinished">Luo osoitteen, joka on yhteensopiva vanhempien lompakoiden kanssa.</translation>
+ </message>
+ <message>
+ <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
+ <translation type="unfinished"> 
+Luo natiivin segwit-osoitteen (BIP-173). Jotkin vanhat lompakot eivät tue sitä.</translation>
+ </message>
+ <message>
+ <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
+ <translation type="unfinished">Bech32m (BIP-350) on päivitys Bech32, mutta lompakkojen tuki on edelleen rajallinen.</translation>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">Lompakkoa ei voitu avata.</translation>
</message>
@@ -2660,6 +3022,15 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished"> Piilota siirtomaksuasetukset</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">Määritä mukautettu maksu per kB (1 000 tavua) tapahtuman virtuaalikoosta.
+
+Huom: Koska maksu lasketaan per tavu, "100 satoshin per kB" maksunopeus 500 virtuaalitavun (puolet 1 kB
+) tapahtumakoolle johtaisi lopulta vain 50 satoshin maksuun.</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">Mikäli lohkoissa ei ole tilaa kaikille siirtotapahtumille, voi louhijat sekä välittävät solmut pakottaa vähimmäispalkkion. Tämän vähimmäispalkkion maksaminen on täysin OK, mutta huomaa, että se saattaa johtaa siihen, ettei siirto vahvistu koskaan, jos bitcoin-siirtoja on enemmän kuin mitä verkko pystyy käsittelemään.</translation>
</message>
@@ -2668,6 +3039,10 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Liian alhainen maksu saattaa johtaa siirtoon, joka ei koskaan vahvistu (lue työkaluohje)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(Älykäs maksu ei ole vielä alustettu. Tämä vie yleensä muutaman lohkon...)</translation>
+ </message>
+ <message>
<source>Confirmation time target:</source>
<translation type="unfinished">Vahvistusajan tavoite:</translation>
</message>
@@ -2763,6 +3138,11 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Ulkopuolista allekirjoittajaa ei löydy</translation>
</message>
<message>
+ <source>External signer failure</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Ulkoisen allekirjoittajan virhe</translation>
+ </message>
+ <message>
<source>Save Transaction Data</source>
<translation type="unfinished">Tallenna siirtotiedot</translation>
</message>
@@ -2794,11 +3174,20 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Ole hyvä ja tarkista siirtoehdotuksesi. Tämä luo osittain allekirjoitetun Bitcoin-siirron (PBST), jonka voit tallentaa tai kopioida ja sitten allekirjoittaa esim. verkosta irrannaisella %1-lompakolla tai PBST-yhteensopivalla laitteistolompakolla.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 lompakosta '%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">Haluatko luoda tämän siirtotapahtuman?</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">Ole hyvä ja tarkista tapahtumasi. Voit luoda ja lähettää tämän tapahtuman tai luoda osittain allekirjoitetun Bitcoin-tapahtuman (PSBT), jonka voit tallentaa tai kopioida ja allekirjoittaa esimerkiksi offline-ympäristössä%1lompakkoosi tai PSBT-yhteensopivalla laitteistolompakolla.</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">Tarkistathan siirtosi.</translation>
@@ -2816,6 +3205,20 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Yhteensä</translation>
</message>
<message>
+ <source>Unsigned Transaction</source>
+ <comment>PSBT copied</comment>
+ <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
+ <translation type="unfinished">Allekirjoittamaton Siirto</translation>
+ </message>
+ <message>
+ <source>The PSBT has been copied to the clipboard. You can also save it.</source>
+ <translation type="unfinished">PSBT on kopioitu leikepöydälle. Voit myös tallentaa sen.</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk</source>
+ <translation type="unfinished">PSBT tallennettu levylle</translation>
+ </message>
+ <message>
<source>Confirm send coins</source>
<translation type="unfinished">Vahvista kolikoiden lähetys</translation>
</message>
@@ -2960,10 +3363,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">&amp;Allekirjoita viesti</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">Voit allekirjoittaa viestit / sopimukset omalla osoitteellasi todistaaksesi että voit vastaanottaa siihen lähetetyt bitcoinit. Varo allekirjoittamasta mitään epämääräistä, sillä phishing-hyökkääjät voivat huijata sinua luovuttamaan henkilöllisyytesi allekirjoituksella. Allekirjoita ainoastaan täysin yksityiskohtainen selvitys siitä, mihin olet sitoutumassa.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-osoite jolla viesti allekirjoitetaan</translation>
</message>
@@ -3048,10 +3447,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Tarkista osoite ja yritä uudelleen.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Syötetty osoite ei viittaa tunnettuun avaimeen.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Lompakon avaaminen peruttiin.</translation>
</message>
@@ -3111,6 +3506,16 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">ristiriidassa maksutapahtumalle, jolla on %1 varmistusta</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/vahvistamatonta, memory poolissa</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/vahvistamatonta, ei memory poolissa</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">hylätty</translation>
@@ -3225,6 +3630,10 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Ulostulon indeksi</translation>
</message>
<message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Sertifikaattia ei ole todennettu)</translation>
+ </message>
+ <message>
<source>Merchant</source>
<translation type="unfinished">Kauppias</translation>
</message>
@@ -3434,6 +3843,35 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Kopio transaktio &amp;ID</translation>
</message>
<message>
+ <source>Copy &amp;raw transaction</source>
+ <translation type="unfinished">Kopioi &amp;raaka tapahtuma</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">Kopioi koko tapahtuma &amp;tiedot</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">&amp;Näytä tapahtuman tiedot</translation>
+ </message>
+ <message>
+ <source>Increase transaction &amp;fee</source>
+ <translation type="unfinished">Lisää tapahtuman &amp;kuluja</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">H&amp;ylkää tapahtuma</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">&amp;Muokkaa osoitekenttää</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">Näytä %1</translation>
+ </message>
+ <message>
<source>Export Transaction History</source>
<translation type="unfinished">Vie rahansiirtohistoria</translation>
</message>
@@ -3562,6 +4000,11 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Uusi palkkio:</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"> 
+Varoitus: Tämä voi maksaa ylimääräisen maksun vähentämällä vaihtotuloja tai lisäämällä tuloja tarvittaessa. Se voi lisätä uuden vaihtotulojen, jos sellaista ei jo ole. Nämä muutokset voivat mahdollisesti vuotaa yksityisyyttä.</translation>
+ </message>
+ <message>
<source>Confirm fee bump</source>
<translation type="unfinished">Vahvista palkkion korotus</translation>
</message>
@@ -3585,10 +4028,6 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<source>Can't display address</source>
<translation type="unfinished">Osoitetta ei voida näyttää</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">oletuslompakko</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3641,6 +4080,11 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">%s on vioittunut. Yritä käyttää lompakkotyökalua bitcoin-wallet pelastaaksesi sen tai palauttaa varmuuskopio.</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 virheellinen -assumeutxo-snapshot-tila. Tämä viittaa laitteistoon liittyvään ongelmaan, ohjelmistovirheeseen tai huonoon ohjelmistomuutokseen, joka on sallinut virheellisen snapshotin lataamisen. Tämän seurauksena solmu sulkeutuu ja lopettaa kaiken sen tilan käytön, joka perustui snapshottiin, ja nollaa lohkokorkeuden%darvoon%d. Seuraavassa uudelleenkäynnistyksessä solmu jatkaa synkronointia kohdasta%d  
+ilman, että käytetään mitään snapshot-tietoja. Ilmoita tästä tapauksesta osoitteeseen%s, mukaan lukien se, miten sait snapshotin. Virheellinen snapshot-tilatiedosto jätetään levylle, jos se on hyödyllinen ongelman diagnosoinnissa, joka aiheutti tämän virheen.</translation>
+ </message>
+ <message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
<translation type="unfinished">Ei voida alentaa lompakon versiota versiosta %i versioon %i. Lompakon versio pysyy ennallaan.</translation>
</message>
@@ -3661,10 +4105,6 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Useampi onion bind -osoite on tarjottu. Automaattisesti luotua Torin onion-palvelua varten käytetään %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">Tarkistathan että tietokoneesi päivämäärä ja kellonaika ovat oikeassa! Jos kellosi on väärässä, %s ei toimi oikein.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Ole hyvä ja avusta, jos %s on mielestäsi hyödyllinen. Vieraile %s saadaksesi lisää tietoa ohjelmistosta.</translation>
</message>
@@ -3737,10 +4177,6 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">-maxmempool on oltava vähintään %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Kriittinen sisäinen virhe kohdattiin, katso debug.log lisätietoja varten</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">-%s -osoitteen '%s' selvittäminen epäonnistui</translation>
</message>
@@ -3753,6 +4189,22 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Hakemistoon '%s' ei voida kirjoittaa. Tarkista käyttöoikeudet.</translation>
</message>
<message>
+ <source>
+Unable to cleanup failed migration</source>
+ <translation type="unfinished">
+Epäonnistuneen migraation siivoaminen epäonnistui</translation>
+ </message>
+ <message>
+ <source>
+Unable to restore backup of wallet.</source>
+ <translation type="unfinished">
+Ei voinut palauttaa lompakon varmuuskopiota..</translation>
+ </message>
+ <message>
+ <source>Block verification was interrupted</source>
+ <translation type="unfinished">Lohkon vahvistus keskeytettiin</translation>
+ </message>
+ <message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
<translation type="unfinished">Konfigurointiasetuksen %s käyttöön vain %s -verkossa, kun osassa [%s].</translation>
</message>
@@ -3825,6 +4277,10 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Virhe avattaessa lohkoindeksiä</translation>
</message>
<message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Virhe luettaessa asetustiedostoa 1%s</translation>
+ </message>
+ <message>
<source>Error reading from database, shutting down.</source>
<translation type="unfinished">Virheitä tietokantaa luettaessa, ohjelma pysäytetään.</translation>
</message>
@@ -3853,6 +4309,30 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">virhe: Puuttuva tarkistussumma</translation>
</message>
<message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">Virhe: Ei %s osoitteita saatavilla.</translation>
+ </message>
+ <message>
+ <source>Error: This wallet already uses SQLite</source>
+ <translation type="unfinished">Virhe: Tämä lompakko käyttää jo SQLite:ä</translation>
+ </message>
+ <message>
+ <source>Error: Unable to make a backup of your wallet</source>
+ <translation type="unfinished">Virhe: Lompakon varmuuskopion luominen epäonnistui</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read all records in the database</source>
+ <translation type="unfinished">Virhe: Kaikkien tietueiden lukeminen tietokannasta ei onnistunut</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write record to new wallet</source>
+ <translation type="unfinished">Virhe: Tiedon kirjoittaminen lompakkoon epäonnistui</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Virhe: osoitekirjan kopiointi epäonnistui lompakolle %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Ei onnistuttu kuuntelemaan missään portissa. Käytä -listen=0 jos haluat tätä.</translation>
</message>
@@ -3861,10 +4341,18 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Lompakkoa ei voitu tarkastaa alustuksen yhteydessä.</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Indeksien käynnistäminen epäonnistui, sammutetaan..</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Tietokannan todennus epäonnistui</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Siirron poistaminen epäonnistui: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Kulutaso (%s) on alempi, kuin minimikulutasoasetus (%s)</translation>
</message>
@@ -3885,6 +4373,10 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Alustava järkevyyden tarkistus epäonnistui. %s sulkeutuu.</translation>
</message>
<message>
+ <source>Insufficient dbcache for block verification</source>
+ <translation type="unfinished">Riittämätön dbcache lohkon vahvistukseen</translation>
+ </message>
+ <message>
<source>Insufficient funds</source>
<translation type="unfinished">Lompakon saldo ei riitä</translation>
</message>
@@ -3905,6 +4397,10 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Virheellinen P2P-lupa: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Virheellinen määrä %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Virheellinen määrä -%s=&lt;amount&gt;: '%s'</translation>
</message>
@@ -3913,6 +4409,18 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Kelvoton verkkopeite määritelty argumentissa -whitelist: '%s'</translation>
</message>
<message>
+ <source>Invalid port specified in %s: '%s'</source>
+ <translation type="unfinished">Virheellinen portti määritetty %s: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid pre-selected input %s</source>
+ <translation type="unfinished">Virheellinen esivalittu syöte %s</translation>
+ </message>
+ <message>
+ <source>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">Saapuvien yhteyksien kuuntelu epäonnistui (kuuntelu palasi virheen %s)</translation>
+ </message>
+ <message>
<source>Loading P2P addresses…</source>
<translation type="unfinished">Ladataan P2P-osoitteita...</translation>
</message>
@@ -3933,6 +4441,10 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Puuttuva summa</translation>
</message>
<message>
+ <source>Missing solving data for estimating transaction size</source>
+ <translation type="unfinished">Ratkaisutiedot puuttuvat tapahtuman koon arvioimiseksi</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>
@@ -3945,6 +4457,14 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Ei tarpeeksi tiedostomerkintöjä vapaana.</translation>
</message>
<message>
+ <source>Not found pre-selected input %s</source>
+ <translation type="unfinished">Esivalittua tuloa ei löydy %s</translation>
+ </message>
+ <message>
+ <source>Not solvable pre-selected input %s</source>
+ <translation type="unfinished">Ei ratkaistavissa esivalittu tulo%s</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Karsintaa ei voi toteuttaa negatiivisella arvolla.</translation>
</message>
@@ -4009,6 +4529,14 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Määrättyä lohkohakemistoa "%s" ei ole olemassa.</translation>
</message>
<message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Määritettyä tietohakemistoa %s ei ole olemassa.</translation>
+ </message>
+ <message>
+ <source>Starting network threads…</source>
+ <translation type="unfinished">Aloitetaan verkkosäikeitä…</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Lähdekoodi löytyy %s.</translation>
</message>
@@ -4037,6 +4565,10 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Tämä on se siirtomaksu, jonka maksat, mikäli lähetät siirron.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Tapahtuma %s ei kuulu tähän lompakkoon</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Siirtosumma liian pieni</translation>
</message>
@@ -4045,10 +4577,18 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Lähetyksen siirtosumman tulee olla positiivinen</translation>
</message>
<message>
+ <source>Transaction change output index out of range</source>
+ <translation type="unfinished">Tapahtuman muutoksen tulosindeksi on alueen ulkopuolella</translation>
+ </message>
+ <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Lähetyksessä tulee olla ainakin yksi vastaanottaja</translation>
</message>
<message>
+ <source>Transaction needs a change address, but we can't generate it.</source>
+ <translation type="unfinished">Tapahtuma vaatii osoitteenmuutoksen, mutta emme voi luoda sitä.</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation type="unfinished">Siirtosumma liian iso</translation>
</message>
@@ -4065,6 +4605,10 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">PID-tiedostoa '%s' ei voitu luoda: %s</translation>
</message>
<message>
+ <source>Unable to find UTXO for external input</source>
+ <translation type="unfinished">Ulkoisen tulon UTXO ei löydy</translation>
+ </message>
+ <message>
<source>Unable to generate initial keys</source>
<translation type="unfinished">Alkuavaimia ei voi luoda</translation>
</message>
@@ -4077,10 +4621,18 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Ei pystytä avaamaan %s kirjoittamista varten</translation>
</message>
<message>
+ <source>Unable to parse -maxuploadtarget: '%s'</source>
+ <translation type="unfinished">Ei voi lukea -maxuploadtarget: '%s'</translation>
+ </message>
+ <message>
<source>Unable to start HTTP server. See debug log for details.</source>
<translation type="unfinished">HTTP-palvelinta ei voitu käynnistää. Katso debug-lokista lisätietoja.</translation>
</message>
<message>
+ <source>Unable to unload the wallet before migrating</source>
+ <translation type="unfinished">Lompakon lataus epäonnistui ennen siirtoa</translation>
+ </message>
+ <message>
<source>Unknown -blockfilterindex value %s.</source>
<translation type="unfinished">Tuntematon -lohkosuodatusindeksiarvo %s.</translation>
</message>
@@ -4101,6 +4653,14 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Tuntemattomia uusia sääntöjä aktivoitu (versiobitti %i)</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Lompakon luominen epäonnistui: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">hyväksyttyjä ilmaisia ​​arvioita ei tueta %s ketju.</translation>
+ </message>
+ <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Lokikategoriaa %s=%s ei tueta.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fil.ts b/src/qt/locale/bitcoin_fil.ts
index a8d32b00c0..8aca583655 100644
--- a/src/qt/locale/bitcoin_fil.ts
+++ b/src/qt/locale/bitcoin_fil.ts
@@ -222,6 +222,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Isang fatal error ang naganap. %1 ay hindi na maaaring magpatuloy nang ligtas at magtitigil.</translation>
+ </message>
+ </context>
+<context>
<name>QObject</name>
<message>
<source>Error: %1</source>
@@ -299,7 +306,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">walet na default</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -377,7 +388,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Palitan ang passphrase na ginamit para sa pag-enkripto ng pitaka</translation>
+ <translation type="unfinished">Palitan ang passphrase na ginamit para sa pag-encrypt ng walet</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -499,10 +510,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ipakita sa %1 ang tulong na mensahe upang makuha ang talaan ng mga posibleng opsyon ng Bitcoin command-line</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">walet na default</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Walang magagamit na mga walet</translation>
</message>
@@ -540,6 +547,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kamalian: %1</translation>
</message>
<message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Babala:%1</translation>
+ </message>
+ <message>
<source>Date: %1
</source>
<translation type="unfinished">Datiles: %1
@@ -699,7 +710,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(%1 locked)</source>
- <translation type="unfinished">(%1 ay naka-lock)</translation>
+ <translation type="unfinished">(%1 Naka-lock)</translation>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
@@ -745,10 +756,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Buksan ang babala sa pitaka</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">walet na default</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Buksan ang Walet</translation>
@@ -1569,8 +1576,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Mapped AS</source>
- <translation type="unfinished">Mapa sa AS
-</translation>
+ <translation type="unfinished">Mapa sa AS</translation>
</message>
<message>
<source>User Agent</source>
@@ -1686,6 +1692,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ang aktibidad ng network ay hindi gumagana.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Wala</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Isinasagawa ang command nang walang anumang walet.</translation>
</message>
@@ -2026,6 +2036,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Lumikha ng Unsigned</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">Lumilikha ng isang Bahagyang Signed Bitcoin Transaction (PSBT) para magamit sa hal. isang offline na%1 wallet, o isang wallet na hardware na katugma sa PSBT.</translation>
+ </message>
+ <message>
+ <source>%1 to '%2'</source>
+ <translation type="unfinished">%1 hanggang %2</translation>
+ </message>
+ <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 sa %2</translation>
</message>
@@ -2191,10 +2209,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Pirmahan ang Mensahe</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">Maaari kang pumirma ng mga mensahe/kasunduan sa iyong mga address upang mapatunayan na maaari kang makatanggap ng mga bitcoin na ipinadala sa kanila. Mag-ingat na huwag pumirma ng anumang bagay na hindi malinaw o random, dahil ang mga phishing attack ay maaaring subukan na linlangin ka sa pagpirma ng iyong pagkakakilanlan sa kanila. Pumirma lamang ng kumpletong mga pahayag na sumasang-ayon ka.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Ang Bitcoin address kung anong ipipirma sa mensahe</translation>
</message>
@@ -2271,10 +2285,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Mangyaring suriin ang address at subukang muli.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Ang pinasok na address ay hindi tumutukoy sa isang key.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Kinansela ang pag-unlock ng walet.</translation>
</message>
@@ -2712,11 +2722,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Could not commit transaction</source>
<translation type="unfinished">Hindi makagawa ng transaksyon</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">walet na default</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2767,10 +2773,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>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>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Mangyaring tumulong kung natagpuan mo ang %s kapaki-pakinabang. Bisitahin ang %s para sa karagdagang impormasyon tungkol sa software.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fo.ts b/src/qt/locale/bitcoin_fo.ts
index 2d6a543454..15dc1b50d4 100644
--- a/src/qt/locale/bitcoin_fo.ts
+++ b/src/qt/locale/bitcoin_fo.ts
@@ -181,6 +181,10 @@
<translation type="unfinished">Net-virksemi óvirkijað.</translation>
</message>
<message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">&amp;Móttak</translation>
+ </message>
+ <message>
<source>Sign &amp;message…</source>
<translation type="unfinished">&amp;Undirrita boð</translation>
</message>
@@ -282,7 +286,7 @@
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">Byte:</translation>
+ <translation type="unfinished">Být:</translation>
</message>
<message>
<source>Amount:</source>
@@ -860,7 +864,7 @@
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">Byte:</translation>
+ <translation type="unfinished">Být:</translation>
</message>
<message>
<source>Amount:</source>
@@ -879,6 +883,10 @@
<translation type="unfinished">Adressa til vekslipening</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">per kilobýt</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">Loka</translation>
</message>
@@ -1001,10 +1009,6 @@
<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>
@@ -1265,10 +1269,6 @@
<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>
diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts
index 796e1affe6..5ff6d09dbd 100644
--- a/src/qt/locale/bitcoin_fr.ts
+++ b/src/qt/locale/bitcoin_fr.ts
@@ -35,7 +35,7 @@
</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>
@@ -81,7 +81,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</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>
@@ -103,7 +103,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Échec d'exportation</translation>
+ <translation type="unfinished">Échec d’exportation</translation>
</message>
</context>
<context>
@@ -184,6 +184,14 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
<translation type="unfinished">Saisir l’ancienne puis la nouvelle phrase de passe du porte-monnaie.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Poursuivre</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Retour</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">N’oubliez pas que le chiffrement de votre porte-monnaie ne peut pas protéger entièrement vos bitcoins contre le vol par des programmes malveillants qui infecteraient votre ordinateur.</translation>
</message>
@@ -229,7 +237,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">La phrase de passe du porte-monnaie a été modifiée.</translation>
+ <translation type="unfinished">La phrase de passe du porte-monnaie a été modifiée avec succès.</translation>
</message>
<message>
<source>Passphrase change failed</source>
@@ -439,6 +447,10 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
<source>%1 GB</source>
<translation type="unfinished">%1 Go</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">porte-monnaie par défaut</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -505,11 +517,11 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
+ <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
- <translation type="unfinished">Sauvegarder le porte-monnaie dans un autre emplacement</translation>
+ <translation type="unfinished">Sauvegarder le porte-monnaie vers un autre emplacement</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
@@ -533,7 +545,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Sauvegarder le porte-monnaie…</translation>
+ <translation type="unfinished">&amp;auvegarder le porte-monnaie…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -557,7 +569,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Charger la TBSP d’un fichier…</translation>
+ <translation type="unfinished">&amp;Charger une TBSP d’un fichier…</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -617,11 +629,11 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses d’envoi et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes d’envoi utilisées</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses de réception et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes de réception utilisées</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -684,7 +696,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Ouvrir une console de débogage des nœuds et de diagnostic</translation>
+ <translation type="unfinished">Ouvrir une console de débogage de nœuds et de diagnostic</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
@@ -700,7 +712,7 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ouvrir un porte-monnaie</translation>
+ <translation type="unfinished">Ouvrir le porte-monnaie</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -745,10 +757,6 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
<translation type="unfinished">Masquer les montants dans l’onglet Vue d’ensemble</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Aucun porte-monnaie n’est proposé</translation>
</message>
@@ -800,8 +808,8 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n connexion active vers le réseau Bitcoin.</numerusform>
- <numerusform>%n de connexions actives vers le réseau Bitcoin.</numerusform>
+ <numerusform>%n connexion active avec le réseau Bitcoin.</numerusform>
+ <numerusform>%n connexions actives avec le réseau Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -988,11 +996,11 @@ Il n’est possible de signer qu’avec les adresses de type « legacy ».</tr
</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 mont&amp;ant</translation>
+ <translation type="unfinished">Copier le &amp;montant</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -1133,11 +1141,11 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</message>
<message>
<source>Migration failed</source>
- <translation type="unfinished">La migration a échoué</translation>
+ <translation type="unfinished">Échec de migration</translation>
</message>
<message>
<source>Migration Successful</source>
- <translation type="unfinished">Migration réussie</translation>
+ <translation type="unfinished">La migration est terminée</translation>
</message>
</context>
<context>
@@ -1151,10 +1159,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
<translation type="unfinished">Avertissement d’ouverture du porte-monnaie</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ouvrir un porte-monnaie</translation>
@@ -1223,7 +1227,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</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>
+ <translation type="unfinished">Indiquez un nom et, si désiré, activez les options avancées.</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -1382,7 +1386,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</message>
<message>
<source>Choose data directory</source>
- <translation type="unfinished">Choisissez un répertoire de donnée</translation>
+ <translation type="unfinished">Choisissez le répertoire des données</translation>
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
@@ -1446,7 +1450,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</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, lors du lancement de %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>
@@ -1507,7 +1511,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</message>
<message>
<source>calculating…</source>
- <translation type="unfinished">calcul en cours…</translation>
+ <translation type="unfinished">calcul…</translation>
</message>
<message>
<source>Last block time</source>
@@ -1543,7 +1547,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Inconnu. En-têtes de présynchronisation (%1, %2%)...</translation>
+ <translation type="unfinished">Inconnu. En-têtes de présynchronisation (%1, %2%)…</translation>
</message>
</context>
<context>
@@ -1590,7 +1594,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</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">Chemin complet vers un %1 script compatible (par exemple, C:\Downloads\hwi.exe ou /Users/you/Downloads/hwi.py). Attention : les malwares peuvent voler vos pièces !</translation>
+ <translation type="unfinished">Chemin complet vers un script compatible avec %1 (p. ex. C:\Téléchargements\hwi.exe ou /Utilisateurs/vous/Téléchargements/hwi.py). Attention : des programmes malveillants peuvent voler vos pièces !</translation>
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
@@ -1610,7 +1614,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
</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>
+ <translation type="unfinished">Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande :</translation>
</message>
<message>
<source>Open the %1 configuration file from the working directory.</source>
@@ -1862,7 +1866,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
<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">Les paramètres actuels vont être restaurés à "%1".</translation>
+ <translation type="unfinished">Les paramètres actuels seront sauvegardés à « %1 ».</translation>
</message>
<message>
<source>Client will be shut down. Do you want to proceed?</source>
@@ -1908,7 +1912,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
<name>OptionsModel</name>
<message>
<source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">Impossible de lire le paramètre "%1", %2.</translation>
+ <translation type="unfinished">Impossible de lire le paramètre « %1 », %2.</translation>
</message>
</context>
<context>
@@ -1994,7 +1998,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant migratio
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
- <translation type="unfinished">Opération PSBT</translation>
+ <translation type="unfinished">Opération TBSP</translation>
</message>
<message>
<source>Sign Tx</source>
@@ -2172,6 +2176,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Pair</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">Âge</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">Envoyé</translation>
@@ -2285,6 +2294,14 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Nombre de connexions</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Adresses locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Adresses réseau que votre nœud Bitcoin utilise actuellement pour communiquer avec d’autres nœuds.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Chaîne de blocs</translation>
</message>
@@ -2333,20 +2350,20 @@ 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>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Cacher les détails des pairs</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>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Version de la couche de transport : %1</translation>
</message>
<message>
<source>Session ID</source>
- <translation type="unfinished">ID de session</translation>
+ <translation type="unfinished">ID de la session</translation>
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Si nous relayons des transactions à ce pair.</translation>
+ <translation type="unfinished">Relayer ou non des transactions à ce pair.</translation>
</message>
<message>
<source>Transaction Relay</source>
@@ -2389,12 +2406,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<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">Nombre total d'adresses reçues de ce pair qui ont été traitées (à l'exclusion des adresses qui ont été abandonnées en raison de la limitation du débit).</translation>
+ <translation type="unfinished">Nombre total d’adresses reçues de ce pair qui ont été traitées (les adresses abandonnées en raison de la limite du débit sont exclues).</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">Nombre total d'adresses reçues de ce pair qui ont été abandonnées (non traitées) en raison de la limitation du débit.</translation>
+ <translation type="unfinished">Nombre total d’adresses reçues de ce pair qui ont été abandonnées (non traitées) en raison de la limite du débit.</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -2439,6 +2456,14 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">La direction et le type de la connexion au pair : %1</translation>
</message>
<message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">Direction ou type</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">ID hexadécimale de la session BIP324.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Le protocole réseau par lequel ce pair est connecté : IPv4, IPv6, Oignon, I2P ou CJDNS.</translation>
</message>
@@ -2560,17 +2585,17 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
+ <translation type="unfinished">détection : les paires pourraient ê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>
+ <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>
+ <translation type="unfinished">v2 : protocole de transport chiffré BIP324</translation>
</message>
<message>
<source>we selected the peer for high bandwidth relay</source>
@@ -2623,6 +2648,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">L’activité réseau est désactivée</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Aucun</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
@@ -2783,8 +2812,12 @@ Pour plus de précisions sur cette console, tapez %6.
<translation type="unfinished">Copier le mont&amp;ant</translation>
</message>
<message>
+ <source>Base58 (Legacy)</source>
+ <translation type="unfinished">Base58 (ancien)</translation>
+ </message>
+ <message>
<source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">Non recommandé en raison de frais élevés et d'une faible protection contre les fautes de frappe.</translation>
+ <translation type="unfinished">Non recommandé en raison de frais élevés et d’une protection moindre contre les fautes de frappe.</translation>
</message>
<message>
<source>Generates an address compatible with older wallets.</source>
@@ -2843,7 +2876,7 @@ Pour plus de précisions sur cette console, tapez %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">&amp;Vérifier</translation>
+ <translation type="unfinished">&amp;Confirmer</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
@@ -3162,6 +3195,12 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Frais de transaction</translation>
</message>
<message>
+ <source>%1 kvB</source>
+ <comment>PSBT transaction creation</comment>
+ <extracomment>When reviewing a newly created PSBT (via Send flow), the transaction fee is shown, with "virtual size" of the transaction displayed for context</extracomment>
+ <translation type="unfinished">%1 kvB</translation>
+ </message>
+ <message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
<translation type="unfinished">Ne signale pas Remplacer-par-des-frais, BIP-125.</translation>
</message>
@@ -3177,11 +3216,11 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">Le PSBT a été copié dans le presse-papiers. Vous pouvez également le sauvegarder.</translation>
+ <translation type="unfinished">La TBSP a été copiée dans le presse-papiers. Vous pouvez aussi l’enregistrer.</translation>
</message>
<message>
<source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT sauvegardé sur le disque</translation>
+ <translation type="unfinished">La TBSP a été enregistrée sur le disque</translation>
</message>
<message>
<source>Confirm send coins</source>
@@ -3219,6 +3258,13 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">Des frais supérieurs à %1 sont considérés comme ridiculement élevés.</translation>
</message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Début de confirmation estimé à %n bloc.</numerusform>
+ <numerusform>Début de confirmation estimé à %n de blocs.</numerusform>
+ </translation>
+ </message>
<message>
<source>Warning: Invalid Bitcoin address</source>
<translation type="unfinished">Avertissement : L’adresse Bitcoin est invalide</translation>
@@ -3321,8 +3367,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">&amp;Signer un message</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">Vous pouvez signer des messages ou des accords avec vos adresses pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Faites attention de ne rien signer de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous êtes d’accord.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Vous pouvez signer des messages ou des accords avec vos anciennes adresses (P2PKH) pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Ne signer rien de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et que vous acceptez.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3405,8 +3451,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez vérifier l’adresse et réessayer.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L’adresse saisie ne fait pas référence à une clé.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">L’adresse saisie ne fait pas référence à une ancienne clé (P2PKH). La signature des messages n’est pas prise en charge pour SegWit ni pour les autres types d’adresses non P2PKH dans cette version de %1. Vérifiez l’adresse et réessayez.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3477,12 +3523,12 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<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/non confirmé, dans la pool de mémoire</translation>
+ <translation type="unfinished">0/non confirmée, dans la réserve de mémoire</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/non confirmé, pas dans la pool de mémoire</translation>
+ <translation type="unfinished">0/non confirmée, absente de la réserve de mémoire</translation>
</message>
<message>
<source>abandoned</source>
@@ -3842,7 +3888,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>
@@ -3912,7 +3958,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Fee bump error</source>
- <translation type="unfinished">Erreur d’augmentation des frais</translation>
+ <translation type="unfinished">Erreur de majoration des frais</translation>
</message>
<message>
<source>Increasing transaction fee failed</source>
@@ -3941,7 +3987,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Confirm fee bump</source>
- <translation type="unfinished">Confirmer l’augmentation des frais</translation>
+ <translation type="unfinished">Confirmer la majoration des frais</translation>
</message>
<message>
<source>Can't draft transaction.</source>
@@ -3952,9 +3998,8 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La TBPS a été copiée</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copié dans le presse-papiers</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">La TBSP des augmentations de frais a été copiée dans le presse-papiers.</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3965,12 +4010,12 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible de valider la transaction</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Impossible d’afficher l’adresse</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erreur de signataire</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Impossible d’afficher l’adresse</translation>
</message>
</context>
<context>
@@ -3981,7 +4026,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>
@@ -4025,11 +4070,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</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>
+ <translation type="unfinished">%s n’a pas réussi à valider l’état de l’instantané -assumeutxo. Cela indique un problème matériel, un bogue logiciel ou une mauvaise modification logicielle qui a permis le chargement d’un instantané invalide. Par conséquent, le nœud s’arrêtera et cessera d’utiliser tout état fondé sur cet instantané, ce qui réinitialisera à le niveau de la chaîne de %d à %d. Lors du prochain démarrage, la synchronisation reprendra de %d, sans utiliser les données d’un instantané. Signalez cet incident à %s en indiquant comment vous avez obtenu l’instantané. L’état de chaîne de l’instantané invalide sera laissé sur le disque au cas afin d’aider éventuellement à diagnostiquer le problème à l’origine de 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>
+ <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 précisions et une liste complète.</translation>
</message>
<message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
@@ -4045,7 +4090,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</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">L'espace disque %s peut ne pas être suffisant pour les fichiers en bloc. Environ %u Go de données seront stockés dans ce répertoire.</translation>
+ <translation type="unfinished">L’espace disque pourrait être insuffisant sur %s pour accueillir les fichiers de bloc. Environ %u Go de données seront stockés dans ce répertoire.</translation>
</message>
<message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
@@ -4104,10 +4149,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Aucun format de fichier de porte-monnaie n’a été indiqué. Pour utiliser createfromdump, -format=&lt;format&gt; doit être indiqué.</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">Veuillez vérifier que l’heure et la date de votre ordinateur sont justes. Si votre horloge n’est pas à l’heure, %s ne fonctionnera pas correctement.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Si vous trouvez %s utile, veuillez y contribuer. Pour de plus de précisions sur le logiciel, rendez-vous sur %s.</translation>
</message>
@@ -4117,7 +4158,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">Le mode Prune est incompatible avec -reindex-chainstate. Utilisez plutôt -reindex complet.</translation>
+ <translation type="unfinished">Le mode d’élagage est incompatible avec -reindex-chainstate. Utilisez plutôt -reindex complet.</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>
@@ -4125,7 +4166,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</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>
+ <translation type="unfinished">Échec de renommage de '%s' en '%s'. Vous devriez résoudre cela en déplaçant ou en supprimant manuellement le répertoire de l’instantané invalide %s, sinon la même erreur surviendra de nouveau lors du prochain démarrage.</translation>
</message>
<message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
@@ -4173,11 +4214,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</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>
+ <translation type="unfinished">Le niveau de journalisation propre à la catégorie n’est pas pris en charge %1$s=%2$s. Attendu %1$s=&lt;category&gt;:&lt;loglevel&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>
+ <translation type="unfinished">Un format non pris en charge de la base de données d’état de la chaîne a été trouvé. Redémarrez avec -reindex-chainstate. La base de données d’état de la chaîne sera reconstruite.</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>
@@ -4216,10 +4257,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">-maxmempool doit être d’au moins %d Mo</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Une erreur interne fatale est survenue. Consulter debug.log pour plus de précisions</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Impossible de résoudre l’adresse -%s : « %s »</translation>
</message>
@@ -4237,7 +4274,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</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>
+ <translation type="unfinished">%s est un montant très élevé. Des frais aussi élevés pourraient être payés en une seule transaction.</translation>
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -4249,7 +4286,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</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>
+ <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 métadonnées de l’adresse sont peut-être manquantes ou incorrectes.</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
@@ -4265,7 +4302,12 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</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>
+ <translation type="unfinished">Échec de calcul de la majoration des frais, car les UTXO non confirmés dépendent d’un groupe énorme de transactions non confirmées.</translation>
+ </message>
+ <message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Échec de suppression du répertoire de l’instantané d’état de la chaîne (%s). Supprimez-le manuellement avant de redémarrer.</translation>
</message>
<message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
@@ -4273,31 +4315,55 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">L'estimation des frais a échoué. Fallbackfee est désactivé. Attendez quelques blocs ou activez %s.</translation>
+ <translation type="unfinished">Échec d’estimation des frais. L’option de frais de repli « Fallbackfee » est désactivée. Attendez quelques blocs ou activez %s.</translation>
+ </message>
+ <message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier des blocs sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier d’annulation sur le disque, probablement à cause d’une erreur d’E/S.</translation>
</message>
<message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">Options incompatibles : -dnsseed=1 a été explicitement spécifié, mais -onlynet interdit les connexions vers IPv4/IPv6</translation>
+ <translation type="unfinished">Options incompatibles : -dnsseed=1 a été indiqué explicitement, mais -onlynet interdit les connexions vers IPv4 et 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">Montant non valide pour %s=&lt;amount&gt; : '%s' (doit être au moins égal au minrelay fee de %s pour éviter les transactions bloquées)</translation>
+ <translation type="unfinished">Le montant est invalide pour %s=&lt;amount&gt; : « %s » (doit être au moins égal aux frais minrelay de %s pour prévenir le blocage des transactions)</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Le poids maximal de la transaction est inférieur au poids de la transaction sans entrées</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Le poids maximal de la transaction est trop faible et ne permet pas les sorties de monnaie</translation>
</message>
<message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">Connexions sortantes limitées à CJDNS (-onlynet=cjdns) mais -cjdnsreachable n'est pas fourni</translation>
+ <translation type="unfinished">Les connexions sortantes sont limitées à CJDNS (-onlynet=cjdns), mais -cjdnsreachable n’est pas indiqué</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">Connexions sortantes limitées à Tor (-onlynet=onion) mais le proxy pour atteindre le réseau Tor est explicitement interdit : -onion=0</translation>
+ <translation type="unfinished">Les connexions sortantes sont limitées à Tor (-onlynet=onion), mais le mandataire pour accéder au réseau Tor est explicitement interdit : -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">Connexions sortantes limitées à Tor (-onlynet=onion) mais le proxy pour atteindre le réseau Tor n'est pas fourni : aucun des paramètres -proxy, -onion ou -listenonion n'est donné</translation>
+ <translation type="unfinished">Les connexions sortantes sont limitées à Tor (-onlynet=onion), mais le mandataire pour accéder au réseau Tor n’est pas indiqué : ni -proxy, ni -onion, ni -onion=0 n’est indiqué</translation>
</message>
<message>
<source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">Connexions sortantes limitées à i2p (-onlynet=i2p) mais -i2psam n'est pas fourni</translation>
+ <translation type="unfinished">Les connexions sortantes sont limitées à i2p (-onlynet=i2p), mais -i2psam n’est pas indiqué</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Échec de renommage de « %s » en « %s ». Impossible de nettoyer le répertoire de la base de données d’état de chaîne d’arrière-plan.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinaison des entrées présélectionnées et de la sélection automatique des entrées du porte-monnaie dépasse le poids maximal de la transaction. Essayez d’envoyer un montant inférieur ou de consolider manuellement les UTXO de votre porte-monnaie.</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>
@@ -4305,15 +4371,15 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</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">Le montant total des pièces présélectionnées ne couvre pas l'objectif de la transaction. Veuillez permettre à d'autres entrées d'être sélectionnées automatiquement ou inclure plus de pièces manuellement</translation>
+ <translation type="unfinished">Le montant total des pièces présélectionnées ne couvre pas l’objectif de la transaction. Permettez la sélection automatique d’autres entrées ou ajoutez d’autres pièces manuellement</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 transaction nécessite une destination d'une valeur non nulle, un ratio de frais non nul, ou une entrée présélectionnée.</translation>
+ <translation type="unfinished">Une destination d’une valeur non nulle, des taux de frais non nuls, ou une entrée présélectionnée sont nécessaires pour cette transaction</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">La validation de la snapshot UTXO a échoué. Redémarrez pour reprendre le téléchargement normal du bloc initial, ou essayez de charger une autre snapshot.</translation>
+ <translation type="unfinished">Échec de validation de l’instantané UTXO. Redémarrez pour reprendre le téléchargement normal du bloc initial ou essayez de charger un instantané différent</translation>
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
@@ -4342,10 +4408,14 @@ Essayez d’utiliser la version la plus récente du logiciel.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La date et l’heure de votre ordinateur semblent décalées de plus de %d minutes par rapport au réseau, ce qui peut entraîner un échec de consensus. Après avoir confirmé l’heure de votre ordinateur, ce message ne devrait plus s’afficher après redémarrage de votre nœud. Sans redémarrage, il devrait cesser de s’afficher automatiquement si vous vous connectez à suffisamment de nouveaux pairs sortants, ce qui peut prendre du temps. Pour plus de précisions, vous pouvez inspecter le champ `timeoffset` des méthodes RPC `getpeerinfo` et `getnetworkinfo`.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
-Impossible de corriger l'échec de la migration</translation>
+Impossible de nettoyer la migration en échec</translation>
</message>
<message>
<source>
@@ -4354,6 +4424,18 @@ Unable to restore backup of wallet.</source>
Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">« whitebind » ne peut être utilisé que pour les connexions entrantes (« out » a été passé)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Une erreur interne fatale est survenue. Pour plus de précisions, consultez debug.log :</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Les données Assumeutxo sont introuvables pour l’empreinte de bloc « %s » donnée.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">La vérification des blocs a été interrompue</translation>
</message>
@@ -4366,6 +4448,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Tous droits réservés © %i à %i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Un bloc corrompu a été détecté, ce qui indique une défaillance matérielle possible.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Une base de données des blocs corrompue a été détectée</translation>
</message>
@@ -4394,6 +4480,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Échec du contrôle d’intégrité de la cryptographie à courbe elliptique. Fermeture de %s.</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>
@@ -4435,7 +4525,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Error reading configuration file: %s</source>
- <translation type="unfinished">Erreur de lecture du fichier de configuration : %s</translation>
+ <translation type="unfinished">Erreur de lecture du fichier de configuration : %s</translation>
</message>
<message>
<source>Error reading from database, shutting down.</source>
@@ -4451,7 +4541,7 @@ Impossible de restaurer la sauvegarde 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>
+ <translation type="unfinished">Erreur : impossible d’extraire la destination de la scriptpubkey générée</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4542,22 +4632,50 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<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 connect best block (%s).</source>
+ <translation type="unfinished">Échec de connexion du meilleur bloc (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Échec de déconnexion du bloc.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Échec de lecture du bloc.</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>
+ <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>Failed to write block.</source>
+ <translation type="unfinished">Échec d’écriture du bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données d’index des blocs.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données des pièces.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Échec d’écriture des données d’annulation.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Échec de retrait de la transaction :%s</translation>
</message>
@@ -4587,7 +4705,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">Insuffisance de dbcache pour la vérification des blocs</translation>
+ <translation type="unfinished">dbcache est insuffisant pour la vérification des blocs</translation>
</message>
<message>
<source>Insufficient funds</source>
@@ -4611,11 +4729,11 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Montant non valide pour %s=&lt;amount&gt; : '%s' (doit être au moins %s)</translation>
+ <translation type="unfinished">Le montant est invalide pour %s=&lt;amount&gt; : « %s » (doit être au moins %s)</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Montant non valide pour %s=&lt;amount&gt; : '%s'</translation>
+ <translation type="unfinished">Le montant est invalide pour %s=&lt;amount&gt; : « %s »</translation>
</message>
<message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
@@ -4627,15 +4745,15 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Port non valide spécifié dans %s: '%s'</translation>
+ <translation type="unfinished">Un port non valide est indiqué dans %s : « %s »</translation>
</message>
<message>
<source>Invalid pre-selected input %s</source>
- <translation type="unfinished">Entrée présélectionnée non valide %s</translation>
+ <translation type="unfinished">L’entrée présélectionnée %s est invalide</translation>
</message>
<message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">L'écoute des connexions entrantes a échoué ( l'écoute a renvoyé une erreur %s)</translation>
+ <translation type="unfinished">L’écoute des connexions entrantes a échoué (l’écoute a retourné l’erreur %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -4654,6 +4772,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Chargement du porte-monnaie…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Le poids maximal de la transaction doit être compris entre %d et %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Le montant manque</translation>
</message>
@@ -4675,13 +4797,17 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
- <translation type="unfinished">Entrée présélectionnée introuvable %s</translation>
+ <translation type="unfinished">L’entrée présélectionnée %s est introuvable</translation>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
<translation type="unfinished">Entrée présélectionnée non soluble %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Seule la direction a été définie, sans permissions : « %s »</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">L’élagage ne peut pas être configuré avec une valeur négative</translation>
</message>
@@ -4726,6 +4852,18 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">La section [%s] n’est pas reconnue</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Le signataire n’a pas renvoyé l’adresse</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une adresse inattendue %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une erreur : %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Échec de signature de la transaction</translation>
</message>
@@ -4747,13 +4885,25 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">Le répertoire de données spécifié "%s" n'existe pas.</translation>
+ <translation type="unfinished">Le répertoire de données indiqué « %s » n’existe pas</translation>
</message>
<message>
<source>Starting network threads…</source>
<translation type="unfinished">Démarrage des processus réseau…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erreur système lors du vidage : %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erreur système lors du chargement d’un fichier de blocs externe : %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erreur système lors de l’enregistrement du bloc sur le disque : %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Le code source est publié sur %s.</translation>
</message>
@@ -4770,6 +4920,10 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Le porte-monnaie évitera de payer moins que les frais minimaux de relais.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Il n’y a pas de « ScriptPubKeyManager » pour cette adresse.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Ce logiciel est expérimental.</translation>
</message>
@@ -4787,7 +4941,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Transaction amount too small</source>
- <translation type="unfinished">Le montant de la transaction est trop bas</translation>
+ <translation type="unfinished">Le montant de la transaction est trop petit</translation>
</message>
<message>
<source>Transaction amounts must not be negative</source>
@@ -4807,11 +4961,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Transaction too large</source>
- <translation type="unfinished">La transaction est trop grosse</translation>
- </message>
- <message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossible d'allouer de la mémoire pour -maxsigcachesize : '%s' Mo</translation>
+ <translation type="unfinished">La transaction est trop élevée</translation>
</message>
<message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
@@ -4827,7 +4977,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Unable to find UTXO for external input</source>
- <translation type="unfinished">Impossible de trouver l'UTXO pour l'entrée externe</translation>
+ <translation type="unfinished">Impossible de trouver l’UTXO pour l’entrée externe</translation>
</message>
<message>
<source>Unable to generate initial keys</source>
@@ -4851,7 +5001,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Impossible de vider le portefeuille avant la migration</translation>
+ <translation type="unfinished">Impossible de décharger le porte-monnaie avant migration</translation>
</message>
<message>
<source>Unknown -blockfilterindex value %s.</source>
@@ -4874,8 +5024,12 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
<translation type="unfinished">Les nouvelles règles inconnues sont activées (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Une option non reconnue « %s » a été indiquée dans -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
+ <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>
@@ -4883,7 +5037,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</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>
+ <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>
@@ -4911,7 +5065,7 @@ Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Wallet needed to be rewritten: restart %s to complete</source>
- <translation type="unfinished">Le portefeuille doit être réécrit : redémarrer %s pour terminer</translation>
+ <translation type="unfinished">Le porte-monnaie devait être réécrit : redémarrer %s pour terminer l’opération.</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 50d27a4f85..07ceebc2ef 100644
--- a/src/qt/locale/bitcoin_fr_CM.ts
+++ b/src/qt/locale/bitcoin_fr_CM.ts
@@ -180,6 +180,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Saisir l’ancienne puis la nouvelle phrase de passe du porte-monnaie.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Poursuivre</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Retour</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">N’oubliez pas que le chiffrement de votre porte-monnaie ne peut pas protéger entièrement vos bitcoins contre le vol par des programmes malveillants qui infecteraient votre ordinateur.</translation>
</message>
@@ -435,6 +443,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<source>%1 GB</source>
<translation type="unfinished">%1 Go</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">porte-monnaie par défaut</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -501,11 +513,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
+ <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
- <translation type="unfinished">Sauvegarder le porte-monnaie dans un autre emplacement</translation>
+ <translation type="unfinished">Sauvegarder le porte-monnaie vers un autre emplacement</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
@@ -520,6 +532,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">&amp;Recevoir</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Choix</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Chiffrer le porte-monnaie…</translation>
</message>
@@ -529,7 +545,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Sauvegarder le porte-monnaie…</translation>
+ <translation type="unfinished">&amp;auvegarder le porte-monnaie…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -553,7 +569,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Charger la TBSP d’un fichier…</translation>
+ <translation type="unfinished">&amp;Charger une TBSP d’un fichier…</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -589,7 +605,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisation des en-têtes (%1 %)…</translation>
+ <translation type="unfinished">Synchronisation des en-têtes (%1)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -613,11 +629,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses d’envoi et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes d’envoi utilisées</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses de réception et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes de réception utilisées</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -636,7 +652,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>
@@ -656,7 +672,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>
@@ -680,7 +696,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Ouvrir une console de débogage des nœuds et de diagnostic</translation>
+ <translation type="unfinished">Ouvrir une console de débogage de nœuds et de diagnostic</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
@@ -696,7 +712,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ouvrir un porte-monnaie</translation>
+ <translation type="unfinished">Ouvrir le porte-monnaie</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -741,10 +757,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Masquer les montants dans l’onglet Vue d’ensemble</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Aucun porte-monnaie n’est disponible</translation>
</message>
@@ -1092,6 +1104,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Migrer le portefeuille</translation>
</message>
<message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Êtes-vous sûr de vouloir migrer le portefeuille &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.
@@ -1143,10 +1159,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Avertissement d’ouverture du porte-monnaie</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ouvrir un porte-monnaie</translation>
@@ -2282,6 +2294,14 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Nombre de connexions</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Adresses locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Adresses réseau que votre nœud Bitcoin utilise actuellement pour communiquer avec d’autres nœuds.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Chaîne de blocs</translation>
</message>
@@ -2330,12 +2350,12 @@ 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>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Cacher les détails des pairs</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>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">La version de la couche de transport : %1</translation>
</message>
<message>
<source>Session ID</source>
@@ -2436,6 +2456,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">La direction et le type de la connexion au pair : %1</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">ID hexadécimale de la session BIP324.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Le protocole réseau par lequel ce pair est connecté : IPv4, IPv6, Oignon, I2P ou CJDNS.</translation>
</message>
@@ -2620,6 +2644,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">L’activité réseau est désactivée</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Aucun</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
@@ -3216,6 +3244,13 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">Des frais supérieurs à %1 sont considérés comme ridiculement élevés.</translation>
</message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Début de confirmation estimé à %n bloc.</numerusform>
+ <numerusform>Début de confirmation estimé à %n blocs.</numerusform>
+ </translation>
+ </message>
<message>
<source>Warning: Invalid Bitcoin address</source>
<translation type="unfinished">Avertissement : L’adresse Bitcoin est invalide</translation>
@@ -3318,8 +3353,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">&amp;Signer un message</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">Vous pouvez signer des messages ou des accords avec vos adresses pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Faites attention de ne rien signer de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous êtes d’accord.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Vous pouvez signer des messages ou des accords avec vos anciennes adresses (P2PKH) pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Ne signer rien de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et que vous acceptez.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3402,8 +3437,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez vérifier l’adresse et réessayer.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L’adresse saisie ne fait pas référence à une clé.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">L’adresse saisie ne fait pas référence à une ancienne clé (P2PKH). La signature des messages n’est pas prise en charge pour SegWit ni pour les autres types d’adresses non P2PKH dans cette version de %1. Vérifiez l’adresse et réessayez.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3949,9 +3984,8 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La TBPS a été copiée</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copié dans le presse-papiers</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">La TBSP des augmentations de frais a été copiée dans le presse-papiers.</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3962,12 +3996,12 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible de valider la transaction</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Impossible d’afficher l’adresse</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erreur de signataire</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Impossible d’afficher l’adresse</translation>
</message>
</context>
<context>
@@ -4101,10 +4135,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Aucun format de fichier de porte-monnaie n’a été indiqué. Pour utiliser createfromdump, -format=&lt;format&gt; doit être indiqué.</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">Veuillez vérifier que l’heure et la date de votre ordinateur sont justes. Si votre horloge n’est pas à l’heure, %s ne fonctionnera pas correctement.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Si vous trouvez %s utile, veuillez y contribuer. Pour de plus de précisions sur le logiciel, rendez-vous sur %s.</translation>
</message>
@@ -4213,10 +4243,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">-maxmempool doit être d’au moins %d Mo</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Une erreur interne fatale est survenue. Consulter debug.log pour plus de précisions</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Impossible de résoudre l’adresse -%s : « %s »</translation>
</message>
@@ -4265,6 +4291,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Échec de suppression du répertoire de l’instantané d’état de la chaîne (%s). Supprimez-le manuellement avant de redémarrer.</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>
@@ -4273,6 +4304,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">L'estimation des frais a échoué. Fallbackfee est désactivé. Attendez quelques blocs ou activez %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier des blocs sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier d’annulation sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Options incompatibles : -dnsseed=1 a été explicitement spécifié, mais -onlynet interdit les connexions vers IPv4/IPv6</translation>
</message>
@@ -4281,6 +4320,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Montant non valide pour %s=&lt;amount&gt; : '%s' (doit être au moins égal au minrelay fee de %s pour éviter les transactions bloquées)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Le poids maximal de la transaction est inférieur au poids de la transaction sans entrées</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Le poids maximal de la transaction est trop faible et ne permet pas les sorties de monnaie</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Connexions sortantes limitées à CJDNS (-onlynet=cjdns) mais -cjdnsreachable n'est pas fourni</translation>
</message>
@@ -4297,6 +4344,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Connexions sortantes limitées à i2p (-onlynet=i2p) mais -i2psam n'est pas fourni</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Échec de renommage de « %s » en « %s ». Impossible de nettoyer le répertoire de la base de données d’état de chaîne d’arrière-plan.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinaison des entrées présélectionnées et de la sélection automatique des entrées du porte-monnaie dépasse le poids maximal de la transaction. Essayez d’envoyer un montant inférieur ou de consolider manuellement les UTXO de votre porte-monnaie.</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">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>
</message>
@@ -4332,15 +4387,21 @@ 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 %ss
+ <translation type="unfinished">Descripteur non reconnu trouvé. Chargement du portefeuille %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>
+Veuillez essayer d'utiliser la dernière version du logiciel.
+</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La date et l’heure de votre ordinateur semblent décalées de plus de %d minutes par rapport au réseau, ce qui peut entraîner un échec de consensus. Après avoir confirmé l’heure de votre ordinateur, ce message ne devrait plus s’afficher après redémarrage de votre nœud. Sans redémarrage, il devrait cesser de s’afficher automatiquement si vous vous connectez à suffisamment de nouveaux pairs sortants, ce qui peut prendre du temps. Pour plus de précisions, vous pouvez inspecter le champ `timeoffset` des méthodes RPC `getpeerinfo` et `getnetworkinfo`.</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>
@@ -4349,6 +4410,18 @@ Unable to restore backup of wallet.</source>
Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">« whitebind » ne peut être utilisé que pour les connexions entrantes (« out » a été passé)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Une erreur interne fatale est survenue. Pour plus de précisions, consultez debug.log :</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Les données Assumeutxo sont introuvables pour l’empreinte de bloc « %s » donnée.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">La vérification des blocs a été interrompue</translation>
</message>
@@ -4361,6 +4434,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Tous droits réservés © %i à %i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Un bloc corrompu a été détecté, ce qui indique une défaillance matérielle possible.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Une base de données des blocs corrompue a été détectée</translation>
</message>
@@ -4389,6 +4466,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Échec du contrôle d’intégrité de la cryptographie à courbe elliptique. Fermeture de %s.</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>
@@ -4537,10 +4618,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<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 connect best block (%s).</source>
+ <translation type="unfinished">Échec de connexion du meilleur bloc (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Échec de déconnexion du bloc.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Échec de lecture du bloc.</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>
@@ -4553,6 +4646,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Échec d’écriture du bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données d’index des blocs.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données des pièces.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Échec d’écriture des données d’annulation.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Échec de suppression de la transaction :%s</translation>
</message>
@@ -4649,6 +4758,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Chargement du porte-monnaie…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Le poids maximal de la transaction doit être compris entre %d et %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Le montant manque</translation>
</message>
@@ -4677,6 +4790,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Entrée présélectionnée non solvable %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Seule la direction a été définie, sans permissions : « %s »</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">L’élagage ne peut pas être configuré avec une valeur négative</translation>
</message>
@@ -4721,6 +4838,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La section [%s] n’est pas reconnue</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Le signataire n’a pas fait écho à l’adresse</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une adresse inattendue %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une erreur : %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Échec de signature de la transaction</translation>
</message>
@@ -4749,6 +4878,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Démarrage des processus réseau…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erreur système lors du vidage : %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erreur système lors du chargement d’un fichier de blocs externe : %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erreur système lors de l’enregistrement du bloc sur le disque : %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Le code source est publié sur %s.</translation>
</message>
@@ -4765,6 +4906,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le porte-monnaie évitera de payer moins que les frais minimaux de relais.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Il n’y a pas de « ScriptPubKeyManager » pour cette adresse.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Ce logiciel est expérimental.</translation>
</message>
@@ -4805,10 +4950,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La transaction est trop grosse</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossible d'allouer de la mémoire pour -maxsigcachesize : '%s' Mo</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Impossible de se lier à %s sur cet ordinateur (la liaison a retourné l’erreur %s)</translation>
</message>
@@ -4869,6 +5010,10 @@ 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>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Une option non reconnue « %s » a été indiquée dans -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
diff --git a/src/qt/locale/bitcoin_fr_LU.ts b/src/qt/locale/bitcoin_fr_LU.ts
index 1c0fd095c4..76800c5658 100644
--- a/src/qt/locale/bitcoin_fr_LU.ts
+++ b/src/qt/locale/bitcoin_fr_LU.ts
@@ -180,6 +180,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Saisir l’ancienne puis la nouvelle phrase de passe du porte-monnaie.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Poursuivre</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Retour</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">N’oubliez pas que le chiffrement de votre porte-monnaie ne peut pas protéger entièrement vos bitcoins contre le vol par des programmes malveillants qui infecteraient votre ordinateur.</translation>
</message>
@@ -435,6 +443,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<source>%1 GB</source>
<translation type="unfinished">%1 Go</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">porte-monnaie par défaut</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -501,11 +513,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
+ <translation type="unfinished">Envoyer des pièces à une adresse Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
- <translation type="unfinished">Sauvegarder le porte-monnaie dans un autre emplacement</translation>
+ <translation type="unfinished">Sauvegarder le porte-monnaie vers un autre emplacement</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
@@ -520,6 +532,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">&amp;Recevoir</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Choix</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Chiffrer le porte-monnaie…</translation>
</message>
@@ -529,7 +545,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Sauvegarder le porte-monnaie…</translation>
+ <translation type="unfinished">&amp;auvegarder le porte-monnaie…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -553,7 +569,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Charger la TBSP d’un fichier…</translation>
+ <translation type="unfinished">&amp;Charger une TBSP d’un fichier…</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -589,7 +605,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisation des en-têtes (%1 %)…</translation>
+ <translation type="unfinished">Synchronisation des en-têtes (%1)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -613,11 +629,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses d’envoi et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes d’envoi utilisées</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Afficher la liste d’adresses de réception et d’étiquettes utilisées</translation>
+ <translation type="unfinished">Afficher la liste d’adresses et d’étiquettes de réception utilisées</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -636,7 +652,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>
@@ -656,7 +672,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>
@@ -680,7 +696,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Ouvrir une console de débogage des nœuds et de diagnostic</translation>
+ <translation type="unfinished">Ouvrir une console de débogage de nœuds et de diagnostic</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
@@ -696,7 +712,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ouvrir un porte-monnaie</translation>
+ <translation type="unfinished">Ouvrir le porte-monnaie</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -741,10 +757,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Masquer les montants dans l’onglet Vue d’ensemble</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Aucun porte-monnaie n’est disponible</translation>
</message>
@@ -1092,6 +1104,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Migrer le portefeuille</translation>
</message>
<message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Êtes-vous sûr de vouloir migrer le portefeuille &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.
@@ -1143,10 +1159,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Avertissement d’ouverture du porte-monnaie</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ouvrir un porte-monnaie</translation>
@@ -2282,6 +2294,14 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Nombre de connexions</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Adresses locales</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Adresses réseau que votre nœud Bitcoin utilise actuellement pour communiquer avec d’autres nœuds.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Chaîne de blocs</translation>
</message>
@@ -2330,12 +2350,12 @@ 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>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Cacher les détails des pairs</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>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">La version de la couche de transport : %1</translation>
</message>
<message>
<source>Session ID</source>
@@ -2436,6 +2456,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">La direction et le type de la connexion au pair : %1</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">ID hexadécimale de la session BIP324.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Le protocole réseau par lequel ce pair est connecté : IPv4, IPv6, Oignon, I2P ou CJDNS.</translation>
</message>
@@ -2620,6 +2644,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">L’activité réseau est désactivée</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Aucun</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
@@ -3216,6 +3244,13 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">Des frais supérieurs à %1 sont considérés comme ridiculement élevés.</translation>
</message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Début de confirmation estimé à %n bloc.</numerusform>
+ <numerusform>Début de confirmation estimé à %n blocs.</numerusform>
+ </translation>
+ </message>
<message>
<source>Warning: Invalid Bitcoin address</source>
<translation type="unfinished">Avertissement : L’adresse Bitcoin est invalide</translation>
@@ -3318,8 +3353,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">&amp;Signer un message</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">Vous pouvez signer des messages ou des accords avec vos adresses pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Faites attention de ne rien signer de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous êtes d’accord.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Vous pouvez signer des messages ou des accords avec vos anciennes adresses (P2PKH) pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Ne signer rien de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et que vous acceptez.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3402,8 +3437,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez vérifier l’adresse et réessayer.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L’adresse saisie ne fait pas référence à une clé.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">L’adresse saisie ne fait pas référence à une ancienne clé (P2PKH). La signature des messages n’est pas prise en charge pour SegWit ni pour les autres types d’adresses non P2PKH dans cette version de %1. Vérifiez l’adresse et réessayez.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3949,9 +3984,8 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La TBPS a été copiée</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copié dans le presse-papiers</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">La TBSP des augmentations de frais a été copiée dans le presse-papiers.</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3962,12 +3996,12 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible de valider la transaction</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Impossible d’afficher l’adresse</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erreur de signataire</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">porte-monnaie par défaut</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Impossible d’afficher l’adresse</translation>
</message>
</context>
<context>
@@ -4101,10 +4135,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Aucun format de fichier de porte-monnaie n’a été indiqué. Pour utiliser createfromdump, -format=&lt;format&gt; doit être indiqué.</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">Veuillez vérifier que l’heure et la date de votre ordinateur sont justes. Si votre horloge n’est pas à l’heure, %s ne fonctionnera pas correctement.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Si vous trouvez %s utile, veuillez y contribuer. Pour de plus de précisions sur le logiciel, rendez-vous sur %s.</translation>
</message>
@@ -4213,10 +4243,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">-maxmempool doit être d’au moins %d Mo</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Une erreur interne fatale est survenue. Consulter debug.log pour plus de précisions</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Impossible de résoudre l’adresse -%s : « %s »</translation>
</message>
@@ -4265,6 +4291,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Échec de suppression du répertoire de l’instantané d’état de la chaîne (%s). Supprimez-le manuellement avant de redémarrer.</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>
@@ -4273,6 +4304,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">L'estimation des frais a échoué. Fallbackfee est désactivé. Attendez quelques blocs ou activez %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier des blocs sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Échec de vidage du fichier d’annulation sur le disque, probablement à cause d’une erreur d’E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Options incompatibles : -dnsseed=1 a été explicitement spécifié, mais -onlynet interdit les connexions vers IPv4/IPv6</translation>
</message>
@@ -4281,6 +4320,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Montant non valide pour %s=&lt;amount&gt; : '%s' (doit être au moins égal au minrelay fee de %s pour éviter les transactions bloquées)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Le poids maximal de la transaction est inférieur au poids de la transaction sans entrées</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Le poids maximal de la transaction est trop faible et ne permet pas les sorties de monnaie</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Connexions sortantes limitées à CJDNS (-onlynet=cjdns) mais -cjdnsreachable n'est pas fourni</translation>
</message>
@@ -4297,6 +4344,14 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Connexions sortantes limitées à i2p (-onlynet=i2p) mais -i2psam n'est pas fourni</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Échec de renommage de « %s » en « %s ». Impossible de nettoyer le répertoire de la base de données d’état de chaîne d’arrière-plan.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinaison des entrées présélectionnées et de la sélection automatique des entrées du porte-monnaie dépasse le poids maximal de la transaction. Essayez d’envoyer un montant inférieur ou de consolider manuellement les UTXO de votre porte-monnaie.</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">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>
</message>
@@ -4332,15 +4387,21 @@ 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 %ss
+ <translation type="unfinished">Descripteur non reconnu trouvé. Chargement du portefeuille %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>
+Veuillez essayer d'utiliser la dernière version du logiciel.
+</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La date et l’heure de votre ordinateur semblent décalées de plus de %d minutes par rapport au réseau, ce qui peut entraîner un échec de consensus. Après avoir confirmé l’heure de votre ordinateur, ce message ne devrait plus s’afficher après redémarrage de votre nœud. Sans redémarrage, il devrait cesser de s’afficher automatiquement si vous vous connectez à suffisamment de nouveaux pairs sortants, ce qui peut prendre du temps. Pour plus de précisions, vous pouvez inspecter le champ `timeoffset` des méthodes RPC `getpeerinfo` et `getnetworkinfo`.</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>
@@ -4349,6 +4410,18 @@ Unable to restore backup of wallet.</source>
Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">« whitebind » ne peut être utilisé que pour les connexions entrantes (« out » a été passé)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Une erreur interne fatale est survenue. Pour plus de précisions, consultez debug.log :</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Les données Assumeutxo sont introuvables pour l’empreinte de bloc « %s » donnée.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">La vérification des blocs a été interrompue</translation>
</message>
@@ -4361,6 +4434,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Tous droits réservés © %i à %i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Un bloc corrompu a été détecté, ce qui indique une défaillance matérielle possible.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Une base de données des blocs corrompue a été détectée</translation>
</message>
@@ -4389,6 +4466,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Échec du contrôle d’intégrité de la cryptographie à courbe elliptique. Fermeture de %s.</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>
@@ -4537,10 +4618,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<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 connect best block (%s).</source>
+ <translation type="unfinished">Échec de connexion du meilleur bloc (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Échec de déconnexion du bloc.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Échec de lecture du bloc.</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>
@@ -4553,6 +4646,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Échec d’écriture du bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données d’index des blocs.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Échec d’écriture dans la base de données des pièces.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Échec d’écriture des données d’annulation.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Échec de suppression de la transaction :%s</translation>
</message>
@@ -4649,6 +4758,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Chargement du porte-monnaie…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Le poids maximal de la transaction doit être compris entre %d et %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Le montant manque</translation>
</message>
@@ -4677,6 +4790,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Entrée présélectionnée non solvable %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Seule la direction a été définie, sans permissions : « %s »</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">L’élagage ne peut pas être configuré avec une valeur négative</translation>
</message>
@@ -4721,6 +4838,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La section [%s] n’est pas reconnue</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Le signataire n’a pas fait écho à l’adresse</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une adresse inattendue %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Le signataire a renvoyé une erreur : %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Échec de signature de la transaction</translation>
</message>
@@ -4749,6 +4878,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Démarrage des processus réseau…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erreur système lors du vidage : %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erreur système lors du chargement d’un fichier de blocs externe : %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erreur système lors de l’enregistrement du bloc sur le disque : %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Le code source est publié sur %s.</translation>
</message>
@@ -4765,6 +4906,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le porte-monnaie évitera de payer moins que les frais minimaux de relais.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Il n’y a pas de « ScriptPubKeyManager » pour cette adresse.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Ce logiciel est expérimental.</translation>
</message>
@@ -4805,10 +4950,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La transaction est trop grosse</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossible d'allouer de la mémoire pour -maxsigcachesize : '%s' Mo</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Impossible de se lier à %s sur cet ordinateur (la liaison a retourné l’erreur %s)</translation>
</message>
@@ -4869,6 +5010,10 @@ 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>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Une option non reconnue « %s » a été indiquée dans -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
diff --git a/src/qt/locale/bitcoin_ga.ts b/src/qt/locale/bitcoin_ga.ts
index 901748a146..1b7b9c0ec3 100644
--- a/src/qt/locale/bitcoin_ga.ts
+++ b/src/qt/locale/bitcoin_ga.ts
@@ -171,6 +171,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cuir isteach an sean pasfhrása agus an pasfhrása nua don sparán.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Leanúint ar aghaidh</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Ar ais</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">Cuimhnigh nach dtugann chriptiú do sparán cosaint go hiomlán do do bitcoins ó bheith goidte ag bogearraí mailíseacha atá ag ionfhabhtú do ríomhaire.</translation>
</message>
@@ -215,6 +223,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Athraíodh pasfhrása sparán go rathúil.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Theip ar athrú pasfhocail</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">Tá an seanphasfhrása a cuireadh isteach le haghaidh díchriptithe an sparán mícheart. Tá carachtar nialasach ann (ie - beart nialasach). Má socraíodh an pasfhrása le leagan den bhogearra seo roimh 25.0, bain triail eile as gan ach na carachtair suas go dtí — ach gan a bheith san áireamh — an chéad charachtar null.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Rabhadh: Tá an eochair Glas Ceannlitreacha ar!</translation>
</message>
@@ -233,21 +249,55 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Eisceacht runaway</translation>
+ </message>
+ <message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished">Tharla earráid mharfach. Ní féidir le %1 leanúint ar aghaidh go sábháilte agus scoirfidh sé.</translation>
</message>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">Earráid inmheánach</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">Ar mhaith leat socruithe a athshocrú go luachanna réamhshocraithe, nó deireadh a chur leis gan athruithe a dhéanamh?</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">Tharla earráid mharfach. Cinntigh go bhfuil an comhad socruithe inscríofa, nó bain triail as rith le -nosettings.</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Earráid: %1</translation>
</message>
<message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">Níor scoir %1 go sábháilte fós…</translation>
+ </message>
+ <message>
<source>unknown</source>
<translation type="unfinished">neamhaithnid</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Leabaithe "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Cló réamhshocraithe an chórais "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Saincheaptha…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Suim</translation>
</message>
@@ -256,6 +306,16 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Iontráil seoladh Bitcoin (m.sh.%1)</translation>
</message>
<message>
+ <source>Unroutable</source>
+ <translation type="unfinished">Dothreoraithe</translation>
+ </message>
+ <message>
+ <source>Onion</source>
+ <comment>network name</comment>
+ <extracomment>Name of Tor network in peer info</extracomment>
+ <translation type="unfinished">Oinniún</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">Isteach</translation>
@@ -266,6 +326,31 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Amach</translation>
</message>
<message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">Sealaíocht Iomlán</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">Sealaíocht Bloc</translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <extracomment>Peer connection type established manually through one of several methods.</extracomment>
+ <translation type="unfinished">Lámhleabhar</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Fearacht</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">Seoladh Fetch</translation>
+ </message>
+ <message>
<source>%1 d</source>
<translation type="unfinished">%1 l</translation>
</message>
@@ -288,41 +373,41 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n soicind(í)</numerusform>
+ <numerusform>%n soicind(í)</numerusform>
+ <numerusform>%n soicind(í)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n nóiméad(a)</numerusform>
+ <numerusform>%n nóiméad(a)</numerusform>
+ <numerusform>%n nóiméad(a)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n uair(eanta)</numerusform>
+ <numerusform>%n uair(eanta)</numerusform>
+ <numerusform>%n uair(eanta)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n lá(/a)</numerusform>
+ <numerusform>%n lá(/a)</numerusform>
+ <numerusform>%n lá(/a)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n seachtain(/a)</numerusform>
+ <numerusform>%n seachtain(/a)</numerusform>
+ <numerusform>%n seachtain(/a)</numerusform>
</translation>
</message>
<message>
@@ -332,12 +417,16 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n bliain(/a)</numerusform>
+ <numerusform>%n bliain(/a)</numerusform>
+ <numerusform>%n bliain(/a)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">sparán réamhshocraithe</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -369,6 +458,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Maidir le %1</translation>
</message>
<message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Taispeáin faisnéis faoi %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">Maidir le &amp;Qt</translation>
</message>
@@ -377,10 +470,18 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Taispeáin faisnéis faoi Qt</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Mionathraigh roghanna cumraíochta do %1</translation>
+ </message>
+ <message>
<source>Create a new wallet</source>
<translation type="unfinished">Cruthaigh sparán nua</translation>
</message>
<message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">&amp;Ãoslaghdaigh</translation>
+ </message>
+ <message>
<source>Wallet:</source>
<translation type="unfinished">Sparán:</translation>
</message>
@@ -414,18 +515,62 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Glac</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Roghanna…</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Criptigh Sparán…</translation>
+ </message>
+ <message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">Criptigh na heochracha príobháideacha a bhaineann le do sparán</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Sparán Cúltaca…</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Athraigh Pasfhocal…</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Sínigh &amp;teachtaireacht…</translation>
+ </message>
+ <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">Sínigh teachtaireachtaí le do sheoltaí Bitcoin chun a chruthú gur leat iad</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Fíoraigh teachtaireacht…</translation>
+ </message>
+ <message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
<translation type="unfinished">Teachtaireachtaí a fhíorú lena chinntiú go raibh siad sínithe le seoltaí sainithe Bitcoin</translation>
</message>
<message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Lódáil PSBT ón gcomhad…</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Oscail &amp;URI…</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Dún Sparán…</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Cruthaigh Sparán…</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Dún Gach Sparán…</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation type="unfinished">&amp;Comhad</translation>
</message>
@@ -442,6 +587,26 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Barra uirlisí cluaisíní</translation>
</message>
<message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Ceanntásca á Sioncronú (%1 %)…</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Ag sioncronú le líonra…</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Bloic á n-innéacsú ar an diosca…</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Bloic ar diosca á bpróiseáil…</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Ag nascadh le piaraí…</translation>
+ </message>
+ <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished">Iarr íocaíochtaí (gineann cóid QR agus bitcoin: URIs)</translation>
</message>
@@ -460,9 +625,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>Próiseáladh %n bloc de stair na n-idirbheart.</numerusform>
+ <numerusform>Próiseáladh %n bloc de stair na n-idirbheart.</numerusform>
+ <numerusform>Próiseáladh %n bloc de stair na n-idirbheart.</numerusform>
</translation>
</message>
<message>
@@ -470,6 +635,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">%1 taobh thiar</translation>
</message>
<message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Ag teacht suas…</translation>
+ </message>
+ <message>
<source>Last received block was generated %1 ago.</source>
<translation type="unfinished">Gineadh an bloc deireanach a fuarthas %1 ó shin.</translation>
</message>
@@ -498,6 +667,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Lódáil Idirbheart Bitcoin Sínithe go Páirteach</translation>
</message>
<message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Luchtaigh PSBT ón &amp;gearrthaisce…</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">Lódáil Idirbheart Bitcoin Sínithe go Páirteach ón gearrthaisce</translation>
</message>
@@ -534,10 +707,28 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Dún sparán</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Athchóirigh Sparán…</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Athchóirigh sparán ó chomhad cúltaca</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Dún gach sparán</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Imirce Sparán</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Imirce sparán</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Taispeáin an %1 teachtaireacht chabhrach chun liosta a fháil de roghanna Bitcoin líne na n-orduithe féideartha</translation>
</message>
@@ -550,14 +741,25 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Masc na luachanna sa gcluaisín Forléargas</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Níl aon sparán ar fáil</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Sonraí Sparán</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Luchtaigh Cúltaca Sparán</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">Athchóirigh Sparán</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">Ainm Sparán</translation>
@@ -578,16 +780,56 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<source>%1 client</source>
<translation type="unfinished">%1 cliaint</translation>
</message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">&amp;Folaigh</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">S&amp;conas</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 />
+ <numerusform>%n nasc(í) gníomhacha le líonra Bitcoin.</numerusform>
+ <numerusform>%n nasc(í) gníomhacha le líonra Bitcoin.</numerusform>
+ <numerusform>%n nasc(í) gníomhacha le líonra 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">Cliceáil le haghaidh tuilleadh gníomhartha.</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">Taispeáin cluaisín Piaraí</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Díchumasaigh gníomhaíocht líonra</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Cumasaigh gníomhaíocht líonra</translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Ceanntásca a réamhshioncronú (%1 %)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Earráid agus sparán á chruthú</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Ní féidir sparán nua a chruthú, tiomsaíodh na bogearraí gan tacaíocht sqlite (riachtanach le haghaidh sparán tuairisceora)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Earráid: %1</translation>
</message>
@@ -742,6 +984,30 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáil suim</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Cóipeáil seoladh</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Cóipeáil &amp;lipéad</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Cóipeáil &amp; méid</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">Cóipeáil idirbheart &amp; ID agus innéacs aschuir</translation>
+ </message>
+ <message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">L&amp;ocáil neamhchaite</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">L&amp;ocáil neamhchaite</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">Cóipeáil méid</translation>
</message>
@@ -802,7 +1068,79 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<source>Create wallet warning</source>
<translation type="unfinished">Rabhadh cruthú sparán</translation>
</message>
- </context>
+ <message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">Ní féidir sínitheoirí a liostú</translation>
+ </message>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Fuarthas an iomarca sínitheoirí seachtracha</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">Luchtaigh Sparán</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">Sparán á lódáil…</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Imirce sparán</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">An bhfuil tú cinnte gur mian leat an sparán &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">Má dhéantar an sparán a aistriú, déanfar an sparán seo a thiontú go sparán tuairisceora amháin nó níos mó. Beidh gá le cúltaca sparán nua.
+Má tá aon scripteanna faire amháin sa sparán seo, cruthófar sparán nua ina mbeidh na scripteanna faire amháin sin.
+Má tá aon scripteanna intuaslagtha ach nach bhfuil faire orthu sa sparán seo, cruthófar sparán difriúil agus nua ina mbeidh na scripteanna sin.
+
+Cruthóidh an próiseas imirce cúltaca den sparán roimh imirce. Ainmneofar an comhad cúltaca seo &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak agus is féidir é a fháil san eolaire don sparán seo. I gcás imirce mícheart, is féidir an cúltaca a chur ar ais leis an bhfeidhmiúlacht "Athchóirigh Sparán".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Imirce Sparán</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Sparán á Ascnamh &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">D'éirigh le haistriú an sparán '%1'.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Aistríodh scripteanna faire amháin go sparán nua darb ainm '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Aistríodh scripteanna intuaslagtha ach nach bhfuiltear ag faire orthu go sparán nua darb ainm '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Theip ar an imirce</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">D'éirigh leis an Imirce</translation>
+ </message>
+</context>
<context>
<name>OpenWalletActivity</name>
<message>
@@ -814,15 +1152,44 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Rabhadh oscail sparán</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Oscail Sparán</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">Sparán Oscailte&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">Athchóirigh Sparán</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">Sparán á Athchóiriú&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">Theip ar athchóiriú an sparán</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">Athchóirigh rabhadh sparán</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">Athchóirigh teachtaireacht sparán</translation>
+ </message>
+</context>
<context>
<name>WalletController</name>
<message>
@@ -853,6 +1220,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cruthaigh Sparán</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Tá tú céim amháin ar shiúl ó chruthú do sparán nua!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Tabhair ainm le do thoil agus, más mian leat, cumasaigh aon ardroghanna</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Ainm Sparán</translation>
</message>
@@ -889,10 +1264,23 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Déan Sparán Glan</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">Bain úsáid as gléas sínithe seachtrach cosúil le sparán crua-earraí. Cumraigh an script sínitheora sheachtraigh i sainroghanna an sparán ar dtús.</translation>
+ </message>
+ <message>
+ <source>External signer</source>
+ <translation type="unfinished">Sínitheoir seachtrach</translation>
+ </message>
+ <message>
<source>Create</source>
<translation type="unfinished">Cruthaigh</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">Tiomsaithe gan tacaíocht sínithe seachtrach (riachtanach le haghaidh síniú seachtrach)</translation>
+ </message>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -972,9 +1360,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n GB de spás ar fáil</numerusform>
+ <numerusform>%n GB de spás ar fáil</numerusform>
+ <numerusform>%n GB de spás ar fáil</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -994,6 +1382,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Roghnaigh eolaire sonraí</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">Ar a laghad stórálfar %1 GB de shonraí sa comhadlann seo, agus fásfaidh sé le himeacht ama.</translation>
</message>
@@ -1005,9 +1397,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</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 />
+ <numerusform>(leor chun cúltacaí a aischur %n lá(laethanta) d'aois)</numerusform>
+ <numerusform>(leor chun cúltacaí a aischur %n lá(laethanta) d'aois)</numerusform>
+ <numerusform>(leor chun cúltacaí a aischur %n lá(laethanta) d'aois)</numerusform>
</translation>
</message>
<message>
@@ -1039,6 +1431,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Mar gurb é seo an chéad uair a lainseáil an clár, is féidir leat a roghnú cá stórálfaidh %1 a chuid sonraí.</translation>
</message>
<message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">Teorainn a chur le blocshlabhra stórála go</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">Teastaíonn an blocshlabhra iomlán a íoslódáil arís chun an socrú seo a fhilleadh. Tá sé níos sciobtha an slabhra iomlán a íoslódáil ar dtús agus é a bhearradh níos déanaí. Díchumasaíodh roinnt ardgnéithe.</translation>
</message>
@@ -1047,6 +1443,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Tá an sioncrónú tosaigh seo an-dhian, agus d’fhéadfadh sé fadhbanna crua-earraí a nochtadh le do ríomhaire nach tugadh faoi deara roimhe seo. Gach uair a ritheann tú %1, leanfaidh sé ar aghaidh ag íoslódáil san áit ar fhág sé as.</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">Nuair a chliceálann tú OK, tosóidh %1 ag íosluchtú agus ag próiseáil slabhra iomlán %4 (%2 GB) ag tosú leis na hidirbhearta is luaithe i %3 nuair a seoladh %4 ar dtús.</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">Má roghnaigh tú stóráil blocshlabhra a theorannú (bearradh), fós caithfear na sonraí stairiúla a íoslódáil agus a phróiseáil, ach scriosfar iad ina dhiaidh sin chun d’úsáid diosca a choinneáil íseal.</translation>
</message>
@@ -1077,6 +1477,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>ShutdownWindow</name>
<message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">Tá %1 ag múchadh…</translation>
+ </message>
+ <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation type="unfinished">Ná múch an ríomhaire go dtí go n-imíonn an fhuinneog seo.</translation>
</message>
@@ -1100,6 +1504,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Líon na mbloic fágtha</translation>
</message>
<message>
+ <source>Unknown…</source>
+ <translation type="unfinished">Anaithnid…</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">ag ríomh…</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Am bloc deireanach</translation>
</message>
@@ -1123,7 +1535,15 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<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">Tá %1 ag sioncronú faoi láthair. Déanfaidh sé é a íoslódáil agus a fíorú ar ceanntásca agus bloic ó phiaraí go dtí barr an blocshlabhra.</translation>
</message>
- </context>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Anaithnid. Ceanntásca á Sioncronú (%1, %2 %)…</translation>
+ </message>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Anaithnid. Ceanntásca a Réamhshioncronú (%1, %2 %)…</translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1155,6 +1575,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Tosaigh %1 ar logáil isteach an chórais</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">Laghdaítear go mór an spás diosca a theastaíonn chun idirbhearta a stóráil má dhéantar bearradh a chumasú. Tá gach bloc fós bailíochtaithe go hiomlán. Chun an socrú seo a thabhairt ar ais ní mór an blockchain iomlán a athíoslódáil.</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation type="unfinished">Méid taisce &amp;bunachar sonraí</translation>
</message>
@@ -1163,6 +1587,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Líon snáitheanna &amp;fíorú scripte</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">Conair iomlán chuig script comhoiriúnach %1 (m.sh. C:\Downloads\hwi.exe nó /Users/you/Downloads/hwi.py). Tabhair aire: is féidir le malware do bhoinn a ghoid!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Seoladh IP an seachfhreastalaí (m.sh. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1175,6 +1603,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Ãoslaghdaigh in ionad scoir an feidhmchlár nuair a bhíonn an fhuinneog dúnta. Nuair a chumasófar an rogha seo, ní dhúnfar an feidhmchlár ach amháin tar éis Scoir a roghnú sa roghchlár.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Cló sa chluaisín Forbhreathnú:</translation>
+ </message>
+ <message>
+ <source>Options set in this dialog are overridden by the command line:</source>
+ <translation type="unfinished">Tá na roghanna atá socraithe sa dialóg seo sáraithe ag an líne ordaithe:</translation>
+ </message>
+ <message>
<source>Open the %1 configuration file from the working directory.</source>
<translation type="unfinished">Oscail an comhad cumraíochta %1 ón eolaire oibre.</translation>
</message>
@@ -1203,14 +1639,44 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Teastaíonn an blocshlabhra iomlán a íoslódáil arís chun an socrú seo a fhilleadh.</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">Uasmhéid taisce bunachar sonraí. Is féidir le taisce níos mó cur le sioncrónú níos tapúla, agus ina dhiaidh sin ní bhíonn an tairbhe chomh soiléir don chuid is mó de chásanna úsáide. Laghdófar úsáid chuimhne má laghdaítear méid an taisce. Roinntear cuimhne mempool neamhúsáidte don taisce seo.</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">Socraigh líon na snáitheanna fíoraithe scripte. Freagraíonn luachanna diúltacha do líon na gcroíthe is mian leat a fhágáil saor sa chóras.</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished">(0 = uath, &lt;0 = fág an méid sin cóir saor)</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">Ligeann sé seo duit féin nó d’uirlis tríú páirtí cumarsáid a dhéanamh leis an nód trí orduithe ordú-líne agus 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">Cumasaigh freastalaí R&amp;PC</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation type="unfinished">Sp&amp;arán</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">Cibé an táille a dhealú ón méid a shocrú mar réamhshocrú nó nach bhfuil.</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">Dealaigh &amp;táille ón méid de réir réamhshocraithe</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation type="unfinished">Saineolach</translation>
</message>
@@ -1227,6 +1693,24 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Caith &amp;sóinseáil neamhdheimhnithe</translation>
</message>
<message>
+ <source>Enable &amp;PSBT controls</source>
+ <extracomment>An options window setting to enable PSBT controls.</extracomment>
+ <translation type="unfinished">Cumasaigh &amp; rialuithe 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">Cibé ar cheart rialuithe PSBT a thaispeáint.</translation>
+ </message>
+ <message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">Sínitheoir Seachtrach (m.sh. sparán crua-earraí)</translation>
+ </message>
+ <message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">&amp;Conair scripte sínithe seachtraí</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">Oscail port cliant Bitcoin go huathoibríoch ar an ródaire. Ní oibríonn sé seo ach nuair a thacaíonn do ródaire le UPnP agus nuair a chumasaítear é.</translation>
</message>
@@ -1235,6 +1719,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Mapáil port ag úsáid &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">Oscail calafort cliant Bitcoin go huathoibríoch ar an ródaire. Ní oibríonn sé seo ach amháin nuair a thacaíonn do ródaire le NAT-PMP agus go bhfuil sé cumasaithe. D'fhéadfadh an port seachtrach a bheith randamach.</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">Port léarscáil le NA&amp;T-PMP</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">Glac le naisc ón taobh amuigh.</translation>
</message>
@@ -1267,6 +1759,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Fuinneog</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">Taispeáin an deilbhín i dtráidire an chórais.</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">&amp;Taispeáin íocón an tráidire</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">Ná taispeáin ach deilbhín tráidire t'éis an fhuinneog a íoslaghdú.</translation>
</message>
@@ -1299,6 +1799,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Roghnaigh an t-aonad foroinnte réamhshocraithe le taispeáint sa chomhéadan agus nuair a sheoltar boinn.</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">URLanna tríú páirtí (m.sh. taiscéalaí bloc) atá le feiceáil sa chluaisín idirbheart mar mhíreanna roghchláir comhthéacs. Cuirtear hais idirbhirt in ionad%s sa URL. Déantar URLanna iolracha a dheighilt le barra ingearach |.</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">URLanna idirbheart tríú páirtí</translation>
+ </message>
+ <message>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished">Gnéithe rialúchán bonn a thaispeáint nó nach.</translation>
</message>
@@ -1319,6 +1827,11 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Cealaigh</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">Tiomsaithe gan tacaíocht sínithe seachtrach (riachtanach le haghaidh síniú seachtrach)</translation>
+ </message>
+ <message>
<source>default</source>
<translation type="unfinished">réamhshocrú</translation>
</message>
@@ -1337,6 +1850,11 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Atosú cliant ag teastáil chun athruithe a ghníomhachtú.</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">Déanfar cúltaca de na socruithe reatha ag "%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">Múchfar an cliant. Ar mhaith leat dul ar aghaidh?</translation>
@@ -1352,6 +1870,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Úsáidtear an comhad cumraíochta chun ardroghanna úsáideora a shonrú a sháraíonn socruithe GUI. Freisin, sáróidh aon roghanna líne na n-orduithe an comhad cumraíochta seo.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Leanúint ar aghaidh</translation>
+ </message>
+ <message>
<source>Cancel</source>
<translation type="unfinished">Cealaigh</translation>
</message>
@@ -1373,6 +1895,13 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
</message>
</context>
<context>
+ <name>OptionsModel</name>
+ <message>
+ <source>Could not read setting "%1", %2.</source>
+ <translation type="unfinished">Níorbh fhéidir socrú "%1", %2 a léamh.</translation>
+ </message>
+</context>
+<context>
<name>OverviewPage</name>
<message>
<source>Form</source>
@@ -1454,6 +1983,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>PSBT Operations</source>
+ <translation type="unfinished">Oibríochtaí PSBT</translation>
+ </message>
+ <message>
<source>Sign Tx</source>
<translation type="unfinished">Sínigh Tx</translation>
</message>
@@ -1466,6 +1999,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáil chuig Gearrthaisce</translation>
</message>
<message>
+ <source>Save…</source>
+ <translation type="unfinished">Sábháil…</translation>
+ </message>
+ <message>
<source>Close</source>
<translation type="unfinished">Dún</translation>
</message>
@@ -1478,6 +2015,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Theip ar síniú idirbheart: %1</translation>
</message>
<message>
+ <source>Cannot sign inputs while wallet is locked.</source>
+ <translation type="unfinished">Ní féidir ionchuir a shíniú agus an sparán glasáilte.</translation>
+ </message>
+ <message>
<source>Could not sign any more inputs.</source>
<translation type="unfinished">Níorbh fhéidir níos mó ionchuir a shíniú.</translation>
</message>
@@ -1510,10 +2051,19 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Sábháil Sonraí Idirbheart</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">Idirbheart Páirt-Sínithe (Dénártha)</translation>
+ </message>
+ <message>
<source>PSBT saved to disk.</source>
<translation type="unfinished">IBSP sábháilte ar dhiosca.</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Seoltar %1 go %2</translation>
+ </message>
+ <message>
<source>own address</source>
<translation type="unfinished">seoladh féin</translation>
</message>
@@ -1546,6 +2096,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Tá síni(ú/the) fós ag teastáil ón idirbheart.</translation>
</message>
<message>
+ <source>(But no wallet is loaded.)</source>
+ <translation type="unfinished">(Ach níl aon sparán luchtaithe.)</translation>
+ </message>
+ <message>
<source>(But this wallet cannot sign transactions.)</source>
<translation type="unfinished">(Ach ní féidir leis an sparán seo idirbhearta a shíniú.)</translation>
</message>
@@ -1581,6 +2135,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Ní URI bailí é 'bitcoin://'. Úsáid 'bitcoin:' ina ionad.</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">Ní féidir iarratas íocaíochta a phróiseáil toisc nach dtacaítear le BIP70.
+De bharr lochtanna slándála forleathan in BIP70, moltar go láidir neamhaird a dhéanamh d’aon treoracha ceannaithe chun sparán a athrú.
+Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir URI atá comhoiriúnach le BIP21 a sholáthar.</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">Ní féidir URI a pharsáil! Is féidir le seoladh neamhbhailí Bitcoin nó paraiméadair URI drochfhoirmithe a bheith mar an chúis.</translation>
</message>
@@ -1597,6 +2159,16 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Gníomhaire Úsáideora</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">Piaraí</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">Aois</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">Treo</translation>
@@ -1640,6 +2212,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>QRImageWidget</name>
<message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Sábháil Ãomhá…</translation>
+ </message>
+ <message>
<source>&amp;Copy Image</source>
<translation type="unfinished">&amp;Cóipeáil Ãomhá</translation>
</message>
@@ -1659,7 +2235,12 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<source>Save QR Code</source>
<translation type="unfinished">Sabháil cód QR.</translation>
</message>
- </context>
+ <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">Ãomhá PNG</translation>
+ </message>
+</context>
<context>
<name>RPCConsole</name>
<message>
@@ -1711,6 +2292,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Líon naisc</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Seoltaí Ãitiúla</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Seoltaí líonra go bhfuil do nód Bitcoin úsáid faoi láthair chun cumarsáid a dhéanamh le nóid eile.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Blocshlabhra</translation>
</message>
@@ -1759,10 +2348,34 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Roghnaigh piara chun faisnéis mhionsonraithe a fheiceáil.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Folaigh Sonraí na bPiaraí</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Leagan na sraithe iompair: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Iompar</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Aitheantas an tseisiúin</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Leagan</translation>
</message>
<message>
+ <source>Whether we relay transactions to this peer.</source>
+ <translation type="unfinished">Cibé an ndéanaimid idirbhearta a athsheoladh chuig an bpiaraí seo.</translation>
+ </message>
+ <message>
+ <source>Transaction Relay</source>
+ <translation type="unfinished">Leaschraolacháin Idirbheart</translation>
+ </message>
+ <message>
<source>Starting Block</source>
<translation type="unfinished">Bloc Tosaigh</translation>
</message>
@@ -1775,6 +2388,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Bloic Sioncronaithe</translation>
</message>
<message>
+ <source>Last Transaction</source>
+ <translation type="unfinished">Idirbheart Deiridh</translation>
+ </message>
+ <message>
<source>The mapped Autonomous System used for diversifying peer selection.</source>
<translation type="unfinished">An Córas Uathrialach mapáilte a úsáidtear chun roghnú piaraí a éagsúlú.</translation>
</message>
@@ -1783,6 +2400,36 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">CU Mapáilte</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">Cibé an gcuirfimid seoltaí chuig an bpiaraí seo.</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">Sealaíocht Seoladh</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">Líon iomlán na seoltaí a fuarthas ón bpiaraí seo a próiseáladh (ní áirítear seoltaí a laghdaíodh mar gheall ar theorannú rátaí).</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">Líon iomlán na seoltaí a fuarthas ón bpiaraí seo a thit (nár próiseáladh) mar gheall ar theorannú rátaí.</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">Seoltaí Próiseáilte</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">Seoltaí Ráta-Teoranta</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation type="unfinished">Gníomhaire Úsáideora</translation>
</message>
@@ -1811,14 +2458,51 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Ceadanna</translation>
</message>
<message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">Treo agus cineál an naisc phiara: %1</translation>
+ </message>
+ <message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">Treo/Cineál</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">Teaghrán ID an tseisiúin BIP324 i heicsidheachúlach.</translation>
+ </message>
+ <message>
+ <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
+ <translation type="unfinished">An prótacal líonra a bhfuil an piara seo ceangailte trí: IPv4, IPv6, Oinniún, I2P, nó CJDNS.</translation>
+ </message>
+ <message>
<source>Services</source>
<translation type="unfinished">Seirbhísí</translation>
</message>
<message>
+ <source>High bandwidth BIP152 compact block relay: %1</source>
+ <translation type="unfinished">Bandaleithead ard BIP152 sealaíochta bloc dhlúth: %1</translation>
+ </message>
+ <message>
+ <source>High Bandwidth</source>
+ <translation type="unfinished">Bandaleithid Ard</translation>
+ </message>
+ <message>
<source>Connection Time</source>
<translation type="unfinished">Am Ceangail</translation>
</message>
<message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">Tá achar ama caite ó fuarthas bloc úrscéil a rinne na seiceálacha bailíochta tosaigh ón gcomhghleacaí seo.</translation>
+ </message>
+ <message>
+ <source>Last Block</source>
+ <translation type="unfinished">Bloc Deireanach</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">Chuaigh an t-am caite ó fuarthas idirbheart úrnua a glacadh isteach inár mempool ón bpiaraí seo.</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">Seol Deireanach</translation>
</message>
@@ -1883,6 +2567,63 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Amach:</translation>
</message>
<message>
+ <source>Inbound: initiated by peer</source>
+ <extracomment>Explanatory text for an inbound peer connection.</extracomment>
+ <translation type="unfinished">Isteach: arna thionscnamh ag piaraí</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">Sealaíocht Iomlán Amach: réamhshocraithe</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">Leaschraolacháin Bloc Amach: ní athsheoltar idirbhearta ná seoltaí</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">Feeler Amach: gearrthéarmach, le haghaidh seoltaí tástála</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">Faigh Seoladh Amach: gearrthéarmach, chun seoltaí a lorg</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">bhrath: d’fhéadfadh v1 nó v2 a bheith i gcomhghleacaí</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: prótacal iompair gnáththéacs gan chriptiú</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 prótacal iompair criptithe</translation>
+ </message>
+ <message>
+ <source>we selected the peer for high bandwidth relay</source>
+ <translation type="unfinished">roghnaigh muid an piaraí le haghaidh sealaíochta bandaleithead ard</translation>
+ </message>
+ <message>
+ <source>the peer selected us for high bandwidth relay</source>
+ <translation type="unfinished">roghnaigh an piaraí sinn le haghaidh sealaíochta bandaleithead ard</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">níor roghnaíodh aon sealaíochta bandaleithead ard</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óipeáil seoladh</translation>
+ </message>
+ <message>
<source>&amp;Disconnect</source>
<translation type="unfinished">&amp;Scaoil</translation>
</message>
@@ -1891,6 +2632,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">1 &amp;uair</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 l&amp;á</translation>
+ </message>
+ <message>
<source>1 &amp;week</source>
<translation type="unfinished">1 &amp;seachtain</translation>
</message>
@@ -1899,6 +2644,11 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">1 &amp;bhliain</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;Cóipeáil IP/Netmask</translation>
+ </message>
+ <message>
<source>&amp;Unban</source>
<translation type="unfinished">&amp;Díchosc</translation>
</message>
@@ -1907,14 +2657,48 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Gníomhaíocht líonra díchumasaithe</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Faic</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ag rith ordú gan aon sparán</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Fuinneog nód - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Ag rith ordú ag úsáid sparán "%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">Fáilte go consól RPC %1.
+Úsáid saigheada suas agus síos chun an stair a nascleanúint, agus %2 chun an scáileán a ghlanadh.
+Úsáid %3 agus %4 chun an clómhéid a mhéadú nó a laghdú.
+Clóscríobh %5 le haghaidh forbhreathnú ar na horduithe atá ar fáil.
+Chun tuilleadh eolais a fháil faoin gconsól seo a úsáid, clóscríobh %6.
+
+%7 RABHADH: Bhí scamadóirí gníomhach, ag rá le húsáideoirí orduithe a chlóscríobh anseo, ag goid a n-inneachar sparán. Ná húsáid an consól seo gan iarmhairtí ordaithe a thuiscint go hiomlán.%8</translation>
+ </message>
+ <message>
+ <source>Executing…</source>
+ <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
+ <translation type="unfinished">Ag rith…</translation>
+ </message>
+ <message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(piara: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">trí %1</translation>
</message>
@@ -1939,6 +2723,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cosc do</translation>
</message>
<message>
+ <source>Never</source>
+ <translation type="unfinished">Riamh</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation type="unfinished">Anaithnid</translation>
</message>
@@ -2018,6 +2806,46 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáil &amp;URI</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Cóipeáil seoladh</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Cóipeáil &amp;lipéad</translation>
+ </message>
+ <message>
+ <source>Copy &amp;message</source>
+ <translation type="unfinished">Cóipeáil &amp; teachtaireacht</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Cóipeáil &amp; méid</translation>
+ </message>
+ <message>
+ <source>Base58 (Legacy)</source>
+ <translation type="unfinished">Bonn58 (Oidhreacht)</translation>
+ </message>
+ <message>
+ <source>Not recommended due to higher fees and less protection against typos.</source>
+ <translation type="unfinished">Ní mholtar mar gheall ar tháillí níos airde agus cosaint níos lú i gcoinne typos.</translation>
+ </message>
+ <message>
+ <source>Base58 (P2SH-SegWit)</source>
+ <translation type="unfinished">Base58 (P2SH- SegWit)</translation>
+ </message>
+ <message>
+ <source>Generates an address compatible with older wallets.</source>
+ <translation type="unfinished">Gineann seoladh atá comhoiriúnach le sparán níos sine.</translation>
+ </message>
+ <message>
+ <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
+ <translation type="unfinished">Gineann sé seoladh segwit dúchais (BIP-173). Ní thacaíonn roinnt sean-sparán leis.</translation>
+ </message>
+ <message>
+ <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
+ <translation type="unfinished">Is uasghrádú é Bech32m (BIP-350) go Bech32, tá tacaíocht sparán fós teoranta.</translation>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">Níorbh fhéidir sparán a dhíghlasáil.</translation>
</message>
@@ -2029,6 +2857,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>ReceiveRequestDialog</name>
<message>
+ <source>Request payment to …</source>
+ <translation type="unfinished">Iarr íocaíocht chuig…</translation>
+ </message>
+ <message>
<source>Address:</source>
<translation type="unfinished">Seoladh:</translation>
</message>
@@ -2057,6 +2889,18 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáil &amp;Seoladh</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">&amp;Fíoraigh</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">Fíoraigh an seoladh seo ar e.g. scáileán sparán crua-earraí</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Sábháil Ãomhá…</translation>
+ </message>
+ <message>
<source>Payment information</source>
<translation type="unfinished">Faisnéis íocaíochta</translation>
</message>
@@ -2187,10 +3031,26 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Glan gach réimse den fhoirm.</translation>
</message>
<message>
+ <source>Inputs…</source>
+ <translation type="unfinished">Ionchuir…</translation>
+ </message>
+ <message>
+ <source>Choose…</source>
+ <translation type="unfinished">Roghnaigh…</translation>
+ </message>
+ <message>
<source>Hide transaction fee settings</source>
<translation type="unfinished">Folaigh socruithe táillí idirbhirt</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">Sonraigh táille shaincheaptha in aghaidh an kB (1,000 beart) de mhéid fíorúil an idirbhirt.
+
+Nóta: Ós rud é go ríomhtar an táille ar bhonn in aghaidh an bheart, ní thabharfadh ráta táille "100 satoshis in aghaidh an kvB" le haghaidh méid idirbhirt 500 beart fíorúil (leath de 1 kvB) táille ach 50 satoshis ar deireadh thiar.</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">Nuair a bhíonn méid idirbhirt níos lú ná spás sna bloic, féadfaidh mianadóirí chomh maith le nóid athsheachadadh táille íosta a fhorfheidhmiú. Tá sé sách maith an táille íosta seo a íoc, ach bíodh a fhios agat go bhféadfadh idirbheart nach ndeimhnítear riamh a bheith mar thoradh air seo a nuair a bhíonn níos mó éilimh ar idirbhearta bitcoin ná mar is féidir leis an líonra a phróiseáil.</translation>
</message>
@@ -2199,6 +3059,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">D’fhéadfadh idirbheart nach ndeimhnítear riamh a bheith mar thoradh ar tháille ró-íseal (léigh an leid uirlise)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(Níor cuireadh tús leis an táille chliste go fóill. Tógann sé seo cúpla bloc de ghnáth...)</translation>
+ </message>
+ <message>
<source>Confirmation time target:</source>
<translation type="unfinished">Sprioc am dearbhaithe:</translation>
</message>
@@ -2255,6 +3119,20 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">%1 (%2 bloic)</translation>
</message>
<message>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">Sínigh ar an ngléas</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">Ceangail do sparán crua-earraí ar dtús.</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">Socraigh cosán script sínitheora seachtrach i Roghanna -&gt; Sparán</translation>
+ </message>
+ <message>
<source>Cr&amp;eate Unsigned</source>
<translation type="unfinished">Cruthaigh Gan Sín</translation>
</message>
@@ -2271,15 +3149,42 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">%1 go %2</translation>
</message>
<message>
+ <source>To review recipient list click "Show Details…"</source>
+ <translation type="unfinished">Chun liosta na bhfaighteoirí a athbhreithniú cliceáil "Taispeáin Sonraí…"</translation>
+ </message>
+ <message>
+ <source>Sign failed</source>
+ <translation type="unfinished">Theip ar an síniú</translation>
+ </message>
+ <message>
+ <source>External signer not found</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Níor aimsíodh sínitheoir seachtrach</translation>
+ </message>
+ <message>
+ <source>External signer failure</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Teip sínitheora sheachtraigh</translation>
+ </message>
+ <message>
<source>Save Transaction Data</source>
<translation type="unfinished">Sábháil Sonraí Idirbheart</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">Idirbheart Páirt-Sínithe (Dénártha)</translation>
+ </message>
+ <message>
<source>PSBT saved</source>
<extracomment>Popup message when a PSBT has been saved to a file</extracomment>
<translation type="unfinished">IBSP sábháilte</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">Iarmhéid seachtrach:</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">nó</translation>
</message>
@@ -2293,6 +3198,15 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Le do thoil, déan athbhreithniú ar do thogra idirbhirt. Tabharfaidh sé seo Idirbheart Bitcoin Sínithe go Páirteach (IBSP) ar féidir leat a shábháil nó a chóipeáil agus a shíniú ansin le m.sh. sparán as líne %1, nó sparán crua-earraí atá comhoiriúnach le IBSP.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 ó sparán '%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">Ar mhaith leat an t-idirbheart seo a chruthú?</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">Le do thoil, déan athbhreithniú ar d’idirbheart.</translation>
@@ -2310,6 +3224,20 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Iomlán</translation>
</message>
<message>
+ <source>Unsigned Transaction</source>
+ <comment>PSBT copied</comment>
+ <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
+ <translation type="unfinished">Idirbheart Gan Sínithe</translation>
+ </message>
+ <message>
+ <source>The PSBT has been copied to the clipboard. You can also save it.</source>
+ <translation type="unfinished">Tá an PSBT cóipeáilte chuig an ngearrthaisce. Is féidir leat é a shábháil freisin.</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk</source>
+ <translation type="unfinished">PSBT sábháilte ar diosca</translation>
+ </message>
+ <message>
<source>Confirm send coins</source>
<translation type="unfinished">Deimhnigh seol boinn</translation>
</message>
@@ -2348,9 +3276,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>Meastar go dtosóidh an deimhniú laistigh de %n bloc(s).</numerusform>
+ <numerusform>Meastar go dtosóidh an deimhniú laistigh de %n bloc(s).</numerusform>
+ <numerusform>Meastar go dtosóidh an deimhniú laistigh de %n bloc(s).</numerusform>
</translation>
</message>
<message>
@@ -2455,8 +3383,8 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Sínigh Teachtaireacht</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">Féadfaidh tú teachtaireachtaí / comhaontuithe a shíniú le do sheoltaí chun a chruthú gur féidir leat bitcoins a sheoltear chucu a fháil. Bí cúramach gan aon rud doiléir nó randamach a shíniú, mar d’fhéadfadh ionsaithe fioscaireachta iarracht ar d’aitheantas a shíniú chucu. Ná sínigh ach ráitis lán-mhionsonraithe a aontaíonn tú leo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Is féidir leat teachtaireachtaí/comhaontuithe a shíniú le do sheoltaí oidhreachta (P2PKH) lena chruthú gur féidir leat bitcoins a sheoltar chucu a fháil. Bí cúramach gan aon rud doiléir nó randamach a shíniú, mar seans go ndéanfaidh ionsaithe fioscaireachta iarracht tú a mhealladh chun d'aitheantas a shíniú leo. Ná sínigh ach ráitis mhionsonraithe a n-aontaíonn tú leo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -2543,10 +3471,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Seiceáil an seoladh le do thoil agus triail arís.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Ní thagraíonn an seoladh a iontráladh d’eochair.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Cuireadh díghlasáil sparán ar ceal.</translation>
</message>
@@ -2588,6 +3512,17 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
</message>
</context>
<context>
+ <name>SplashScreen</name>
+ <message>
+ <source>(press q to shutdown and continue later)</source>
+ <translation type="unfinished">(brúigh q chun múchadh agus lean ar aghaidh ar ball)</translation>
+ </message>
+ <message>
+ <source>press q to shutdown</source>
+ <translation type="unfinished">brúigh q chun múchadh</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -2595,6 +3530,16 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">faoi choimhlint le idirbheart le %1 dearbhuithe</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/neamhdhearbhaithe, i linn cuimhne</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/neamhdhearbhaithe, ní sa linn cuimhne</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">tréigthe</translation>
@@ -2656,9 +3601,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>aibíonn i %n bloc(anna) eile</numerusform>
+ <numerusform>aibíonn i %n bloc(anna) eile</numerusform>
+ <numerusform>aibíonn i %n bloc(anna) eile</numerusform>
</translation>
</message>
<message>
@@ -2710,6 +3655,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Innéacs aschuir</translation>
</message>
<message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Níor fíoraíodh an teastas)</translation>
+ </message>
+ <message>
<source>Merchant</source>
<translation type="unfinished">Ceannaí</translation>
</message>
@@ -2895,6 +3844,55 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Ãosmhéid</translation>
</message>
<message>
+ <source>Range…</source>
+ <translation type="unfinished">Raon…</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Cóipeáil seoladh</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Cóipeáil &amp;lipéad</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Cóipeáil &amp; méid</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">Cóipeáil idirbheart &amp;ID</translation>
+ </message>
+ <message>
+ <source>Copy &amp;raw transaction</source>
+ <translation type="unfinished">Cóipeáil &amp;amh-idirbheart</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">Cóipeáil idirbheart agus sonraí iomlána</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">&amp;Taispeáin sonraí idirbhirt</translation>
+ </message>
+ <message>
+ <source>Increase transaction &amp;fee</source>
+ <translation type="unfinished">Méadaigh idirbheart &amp; táille</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">Idirbheart&amp;tréigean</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">&amp;Cuir lipéad seolta in eagar</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">Taispeáin i %1</translation>
+ </message>
+ <message>
<source>Export Transaction History</source>
<translation type="unfinished">Easpórtáil Stair Idirbheart</translation>
</message>
@@ -2944,6 +3942,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Easpórtáil Rathúil</translation>
</message>
<message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">Sábháladh stair an idirbhirt go rathúil chuig %1.</translation>
+ </message>
+ <message>
<source>Range:</source>
<translation type="unfinished">Raon:</translation>
</message>
@@ -3023,6 +4025,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Táille nua:</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">Rabhadh: D’fhéadfadh sé seo an táille bhreise a íoc trí aschuir athraithe a laghdú nó trí ionchuir a chur leis, nuair is gá. Féadfaidh sé aschur athraithe nua a chur leis mura bhfuil ceann ann cheana. D'fhéadfadh na hathruithe seo príobháideacht a sceitheadh.</translation>
+ </message>
+ <message>
<source>Confirm fee bump</source>
<translation type="unfinished">Dearbhaigh preab táille</translation>
</message>
@@ -3035,6 +4041,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">IBSP cóipeáilte</translation>
</message>
<message>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Cóipeáil PSBT bump táille chuig an ngearrthaisce</translation>
+ </message>
+ <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Ní féidir síniú idirbheart.</translation>
</message>
@@ -3043,8 +4053,12 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níorbh fhéidir feidhmiú idirbheart</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Earráid sínitheora</translation>
+ </message>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">Ní féidir an seoladh a thaispeáint</translation>
</message>
</context>
<context>
@@ -3062,6 +4076,11 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Sparán Chúltaca</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Sonraí Sparán</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Theip ar cúltacú</translation>
</message>
@@ -3093,20 +4112,84 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Tá %s truaillithe. Triail an uirlis sparán bitcoin-wallet a úsáid chun tharrtháil nó chun cúltaca a athbhunú.</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">Theip ar %s an staid snapshot -assumeutxo a bhailíochtú. Léiríonn sé seo fadhb crua-earraí, nó fabht sna bogearraí, nó droch-mhodhnú bogearraí a cheadaigh pictiúr neamhbhailí a luchtú. Mar thoradh air seo, stopfar an nód agus stopfaidh sé de úsáid a bhaint as staid ar bith a tógadh ar an seat, ag athshocrú airde an tslabhra ó%dgo%d. Ar an gcéad atosú eile, athchromfar ar an nód ag sioncronú ó %d gan úsáid a bhaint as sonraí seat. Tuairiscigh an teagmhas seo do %s lena n-áirítear conas a fuair tú an pictiúr. Fágfar an slabhrashlabhra neamhbhailí ar an diosca ar eagla go mbeadh sé ina chuidiú leis an tsaincheist ba chúis leis an earráid seo a dhiagnóisiú.</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">Iarraidh %s éisteacht ar phort %u. Meastar go bhfuil an port seo "olc" agus dá bhrí sin ní dócha go nascfaidh piaraí ar bith leis. Féach doc/p2p-bad-ports.md le haghaidh sonraí agus liosta iomlán.</translation>
+ </message>
+ <message>
+ <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
+ <translation type="unfinished">Ní féidir an sparán a íosghrádú ó leagan %igo leagan%i. Leagan sparán gan athrú.</translation>
+ </message>
+ <message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
<translation type="unfinished">Ní féidir glas a fháil ar eolaire sonraí %s. Is dócha go bhfuil %s ag rith cheana.</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">Ní féidir sparán scoilte neamh-HD a uasghrádú ó leagan%igo leagan%i gan uasghrádú chun tacú le heochrach réamh-scoilte. Úsáid leagan %i nó níl aon leagan sonraithe.</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">Ní féidir spás diosca le haghaidh %sa chur san áireamh sna blocchomhaid. Stórálfar thart ar %u GB de shonraí san eolaire seo.</translation>
+ </message>
+ <message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
<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 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">Earráid agus an sparán á lódáil. Éilíonn Sparán go n-íoslódálfar bloic, agus ní thacaíonn bogearraí faoi láthair le sparán a luchtú agus bloic á n-íoslódáil as ord nuair a úsáidtear snapshots assumeutxo. Ba cheart go mbeadh Sparán in ann luchtú go rathúil nuair a shroicheann sioncronú nód an airde %s</translation>
+ </message>
+ <message>
+ <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
+ <translation type="unfinished">Earráid agus %s á léamh! Seans go bhfuil sonraí idirbhirt in easnamh nó mícheart. Sparán athscanadh.</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
+ <translation type="unfinished">Earráid agus%s á léamh! Seans go bhfuil sonraí idirbhirt in easnamh nó mícheart. Sparán athscanadh.</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">Earráid: Tá taifead aitheantóra Dumpfile mícheart. Fuair ​​​​tú "%s", bhíothas ag súil le "%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">Earráid: Ní thacaítear leis an leagan Dumpfile. Ní thacaíonn an leagan seo de bitcoin-sparán ach le leagan 1 dumpfiles. Fuair ​​​​tú dumpfile le leagan %s</translation>
+ </message>
+ <message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">Earráid: Ní thacaíonn sparán oidhreachta ach na cineálacha seoltaí "oidhreacht", "p2sh-segwit", agus "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">Earráid: Ní féidir tuairisceoirí a tháirgeadh don sparán oidhreachta seo. Bí cinnte pasfhrása an sparán a sholáthar má tá sé criptithe.</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">Tá comhad %s ann cheana. Má tá tú cinnte gurb é seo a theastaíonn uait, bog é as an mbealach ar dtú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 neamhbhailí nó truaillithe (%s). Má chreideann tú gur fabht é seo, cuir in iúl do %s é le do thoil. Mar shruth oibre, is féidir leat an comhad (%s) a bhogadh as an mbealach (athainmnigh, bog nó scrios) chun ceann nua a chruthú ar an gcéad thús eile.</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>
<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">Le do thoil seiceáil go bhfuil dáta agus am do ríomhaire ceart! Má tá do chlog mícheart, ní oibreoidh %s i gceart.</translation>
+ <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">Níor soláthraíodh aon chomhad dumpála. Chun createfromdump a úsáid, ní mór -dumpfile=&lt;filename&gt; a sholáthar.</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">Níor soláthraíodh aon chomhad dumpála. Chun Dumpáil a úsáid, ní mór -dumpfile=&lt;filename&gt; a sholáthar.</translation>
+ </message>
+ <message>
+ <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
+ <translation type="unfinished">Níor soláthraíodh formáid comhaid sparán. Chun createfromdump a úsáid, ní mór -format=&lt;format&gt; a sholáthar.</translation>
</message>
<message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
@@ -3117,10 +4200,18 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Bearradh cumraithe faoi bhun an íosmhéid %d MiB. Úsáid uimhir níos airde le do thoil.</translation>
</message>
<message>
+ <source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
+ <translation type="unfinished">Níl an modh prúnaí ag luí le -reindex-chainstate. Úsáid lán-reindex ina ionad sin.</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">Bearradh: téann sioncrónú deireanach an sparán thar sonraí bearrtha. Ní mór duit -reindex (déan an blockchain iomlán a íoslódáil arís i gcás nód bearrtha)</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">Theip ar athainmniú '%s' -&gt; '%s'. Ba cheart duit é seo a réiteach tríd an gcomhadlann achomair neamhbhailí %s a bhogadh nó a scriosadh de láimh, nó beidh an earráid chéanna agat arís ar an gcéad tosaithe eile.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: Leagan scéime sparán sqlite anaithnid %d. Ní thacaítear ach le leagan %d</translation>
</message>
@@ -3161,6 +4252,30 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Ní féidir bloic a aithrise. Beidh ort an bunachar sonraí a atógáil ag úsáid -reindex-chainstate.</translation>
</message>
<message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">Cuireadh formáid comhaid sparán anaithnid "%s" ar fáil. Tabhair ceann de "bdb" nó "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">Leibhéal logála catagóir ar leith nach dtacaítear leis%11$s=%2$s. Bhíothas ag súil le %1$s=1:2. Catagóirí bailí: %3$s. Leibhéil loga bailí: %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">Aimsíodh formáid bhunachar sonraí chainstáit nach dtacaítear léi. Atosaigh le -reindex-chainstate. Déanfaidh sé seo an bunachar sonraí slabhrach a atógáil.</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">Sparán cruthaithe go rathúil. Tá an cineál sparán oidhreachta á dhímheas agus bainfear an tacaíocht chun sparán oidhreachta a chruthú agus a oscailt amach anseo.</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">D'éirigh leis an sparán a lódáil. Tá an cineál sparán oidhreachta á dhímheas agus bainfear an tacaíocht chun sparán oidhreachta a chruthú agus a oscailt amach anseo. Is féidir sparán oidhreachta a aistriú chuig sparán tuairisceora le sparán imirceach.</translation>
+ </message>
+ <message>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">Rabhadh: Ní mheaitseálann formáid sparán Dumpfile "%s" an fhormáid ordaithe sonraithe "%s".</translation>
+ </message>
+ <message>
<source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
<translation type="unfinished">Rabhadh: Eochracha príobháideacha braite i sparán {%s} le heochracha príobháideacha díchumasaithe</translation>
</message>
@@ -3169,6 +4284,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Rabhadh: Is cosúil nach n-aontaímid go hiomlán lenár piaraí! B’fhéidir go mbeidh ort uasghrádú a dhéanamh, nó b’fhéidir go mbeidh ar nóid eile uasghrádú.</translation>
</message>
<message>
+ <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
+ <translation type="unfinished">Teastaíonn bailíochtú sonraí finné maidir le bloic tar éis airde %d. Atosaigh le -reindex le do thoil.</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">Ní mór duit an bunachar sonraí a atógáil ag baint úsáide as -reindex chun dul ar ais go mód neamhbhearrtha. Déanfaidh sé seo an blockchain iomlán a athlódáil</translation>
</message>
@@ -3181,14 +4300,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Caithfidh -maxmempool a bheith ar a laghad %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Tharla earráid mharfach inmheánach, féach debug.log le haghaidh sonraí</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Ní féidir réiteach seoladh -%s: '%s'</translation>
</message>
<message>
+ <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
+ <translation type="unfinished">Ní féidir -forcednsseed a shocrú go fíor agus -dnsseed á shocrú go bréagach.</translation>
+ </message>
+ <message>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
<translation type="unfinished">Ní féidir -peerblockfilters a shocrú gan -blockfilterindex.</translation>
</message>
@@ -3197,6 +4316,171 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Ní féidir scríobh chuig eolaire sonraí '%s'; seiceáil ceadanna.</translation>
</message>
<message>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">Tá%s socraithe an-ard! D’fhéadfaí táillí chomh mór seo a íoc ar idirbheart amháin.</translation>
+ </message>
+ <message>
+ <source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
+ <translation type="unfinished">Ní féidir naisc ar leith a sholáthar agus tá addrman chun naisc amach a aimsiú ag an am céanna.</translation>
+ </message>
+ <message>
+ <source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
+ <translation type="unfinished">Earráid agus %s á lódáil: sparán an tsínitheora sheachtraigh á luchtú gan tacaíocht sínitheoir seachtrach a chur le chéile</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">Earráid agus %s á léamh! Léann na heochracha go léir i gceart, ach seans go bhfuil sonraí idirbhirt nó meiteashonraí seolta in easnamh nó mícheart.</translation>
+ </message>
+ <message>
+ <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Earráid: Ní féidir sonraí an leabhair seoltaí sa sparán a shainaithint mar go mbaineann siad le sparán aistrithe</translation>
+ </message>
+ <message>
+ <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
+ <translation type="unfinished">Earráid: Tuairisceoirí dúblacha a cruthaíodh le linn imirce. Seans go bhfuil do sparán truaillithe.</translation>
+ </message>
+ <message>
+ <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Earráid: Ní féidir idirbheart %s sa sparán a aithint gur le sparán aistrithe é</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Theip ar tháillí tuairte a ríomh, toisc go mbraitheann UTXOanna neamhdhearbhaithe ar bhraisle ollmhór idirbheart neamhdheimhnithe.</translation>
+ </message>
+ <message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Theip ar bhaint an tsainstáit seat seat (%s). Bain de láimh é roimh atosú.</translation>
+ </message>
+ <message>
+ <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
+ <translation type="unfinished">Theip ar an gcomhad peers.dat neamhbhailí a athainmniú. Bog nó scrios é agus bain triail eile as.</translation>
+ </message>
+ <message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Theip ar mheastachán na dtáillí. Tá fallbackfee díchumasaithe. Fan cúpla bloc nó cumasaigh %s.</translation>
+ </message>
+ <message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Theip ar chomhad blocála a shruthlú go diosca. Is dócha gur earráid I/O é seo.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Theip ar shruthlú an chomhaid chealaigh go diosca. Is dócha gur earráid I/O é seo.</translation>
+ </message>
+ <message>
+ <source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
+ <translation type="unfinished">Roghanna neamh-chomhoiriúnacha: -dnsseed=1 sonraíodh go sainráite, ach cuireann -onlynet cosc ​​ar naisc le 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">Méid neamhbhailí le haghaidh %s=1: '%s' (ní mór an táille sealaíochta nóiméad de %s a bheith ann ar a laghad chun idirbhearta bhfostú a chosc)</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Tá an t-uasmheáchan idirbhirt níos lú ná meáchan idirbhirt gan ionchuir</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Tá meáchan uasta idirbheart ró-íseal, ní féidir freastal ar aschur athraithe</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
+ <translation type="unfinished">Naisc amach teoranta do CJDNS (-onlynet=cjdns) ach ní chuirtear -cjdnsreachable ar fáil</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">Tá naisc amach teoranta do Tor (-onlynet=onion) ach tá cosc ​​sainráite ar an seachfhreastalaí chun líonra Tor a bhaint amach: -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">Naisc amach teoranta do Tor (-onlynet=onion) ach ní thugtar an seachfhreastalaí chun líonra Tor a bhaint amach: ní thugtar aon seachfhreastalaí, -oinniún nó -listenonion</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
+ <translation type="unfinished">Tá naisc amach teoranta do i2p (-onlynet=i2p) ach ní chuirtear -i2psam ar fáil</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Theip ar athainmniú '%s' -&gt; '%s'. Ní féidir eolaire leveldb an tslabhra cúlra a ghlanadh.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Sáraíonn meascán na n-ionchur réamhroghnaithe agus an rogha ionchuir uathoibríoch sparán an t-uasmheáchan idirbhirt. Bain triail as méid níos lú a sheoladh nó UTXO do sparán a chomhdhlúthú de láimh</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">Sáraíonn méid an ionchuir an t-uasmheáchan. Bain triail as méid níos lú a sheoladh nó UTXO do sparán a chomhdhlúthú de láimh</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">Ní chlúdaíonn méid iomlán na monaí réamhroghnaithe sprioc an idirbhirt. Ceadaigh le do thoil ionchuir eile a roghnú go huathoibríoch nó cuir níos mó bonn san áireamh de láimh</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">Éilíonn an t-idirbheart ceann scríbe amháin de luach neamh-0, táille neamh-0, nó ionchur réamhroghnaithe</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">Theip ar bhailíochtú a dhéanamh ar achomair UTXO. Atosaigh chun gnáthíoslódáil na mbloc tosaigh a atosú, nó bain triail as pictiúr eile a lódáil.</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">Tá UTXOanna neamhdheimhnithe ar fáil, ach cruthaítear slabhra idirbheart a ndiúltóidh an mempool dóibh má dhéantar iad a chaitheamh</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">Fuarthas iontráil oidhreachta gan choinne sa sparán tuairisceora. Sparán %s á lódáil
+
+Seans gur cuireadh isteach ar an sparán nó gur cruthaíodh é le hintinn mhailíseach.</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">Tuairisceoir neamhaitheanta aimsithe. Sparán %s á lódáil
+
+Seans gur cruthaíodh an sparán ar leagan níos nuaí.
+Bain triail as an leagan bogearraí is déanaí a rith.</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">Is cosúil go bhfuil dáta agus am do ríomhaire níos mó ná %d nóiméad as sioncronú leis an líonra, seans go dteipfidh ar chomhdhearcadh dá bharr. Tar éis duit clog do ríomhaire a dheimhniú, níor cheart go mbeadh an teachtaireacht seo le feiceáil a thuilleadh nuair a atosóidh tú do nód. Gan atosú, ba cheart go stopfadh sé ag taispeáint go huathoibríoch tar éis duit nasc a dhéanamh le líon imleor piaraí nua amach, a d'fhéadfadh roinnt ama a ghlacadh. Is féidir leat an réimse `timeoffset` de na modhanna RPC `getpeerinfo` agus `getnetworkinfo` a iniúchadh chun tuilleadh faisnéise a fháil.</translation>
+ </message>
+ <message>
+ <source>
+Unable to cleanup failed migration</source>
+ <translation type="unfinished">
+Ní féidir an t-imirce theip a ghlanadh</translation>
+ </message>
+ <message>
+ <source>
+Unable to restore backup of wallet.</source>
+ <translation type="unfinished">
+Ní féidir cúltaca an sparán a chur ar ais.</translation>
+ </message>
+ <message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">ní féidir ceangaltán bán a úsáid ach amháin le haghaidh naisc isteach (ritheadh ​​​​"amach")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Tharla earráid mharfach inmheánach, féach debug.log le haghaidh sonraí:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Ní bhfuarthas sonraí Assumeutxo don bhlocshlabhra '%s' a tugadh.</translation>
+ </message>
+ <message>
+ <source>Block verification was interrupted</source>
+ <translation type="unfinished">Cuireadh isteach ar an bhfíorú blocála</translation>
+ </message>
+ <message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
<translation type="unfinished">Ní chuirtear socrú cumraíochta do %s i bhfeidhm ach ar líonra %s nuair atá sé sa rannán [%s].</translation>
</message>
@@ -3205,6 +4489,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Cóipcheart (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bloc truaillithe aimsithe a léirigh teip crua-earraí féideartha.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Braitheadh bunachar sonraí bloic truaillithe</translation>
</message>
@@ -3229,6 +4517,22 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Lódáil déanta</translation>
</message>
<message>
+ <source>Dump file %s does not exist.</source>
+ <translation type="unfinished">Níl an comhad dumpála %s ann.</translation>
+ </message>
+ <message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Teip seiceála sláintíochta cripteagrafaíochta cuar éilipseach. Tá %s ag múchadh.</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Earráid agus db txn á dhéanamh chun idirbhearta sparán a bhaint</translation>
+ </message>
+ <message>
+ <source>Error creating %s</source>
+ <translation type="unfinished">Earráid cruthaithe %s</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation type="unfinished">Earráid ag túsú bunachar sonraí bloic</translation>
</message>
@@ -3261,30 +4565,162 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Earráid ag oscailt bunachar sonraí bloic</translation>
</message>
<message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Earráid agus an comhad cumraíochta á léamh: %s</translation>
+ </message>
+ <message>
<source>Error reading from database, shutting down.</source>
<translation type="unfinished">Earráid ag léamh ón mbunachar sonraí, ag múchadh.</translation>
</message>
<message>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">Earráid agus an chéad taifead eile á léamh ón mbunachar sonraí sparán</translation>
+ </message>
+ <message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Earráid agus db txn á thosú chun idirbhearta sparán a bhaint</translation>
+ </message>
+ <message>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Earráid: Ní féidir an ceann scríbe a bhaint as an scriptpubkey ginte</translation>
+ </message>
+ <message>
+ <source>Error: Couldn't create cursor into database</source>
+ <translation type="unfinished">Earráid: Níorbh fhéidir an cúrsóir a chruthú sa bhunachar sonraí</translation>
+ </message>
+ <message>
<source>Error: Disk space is low for %s</source>
<translation type="unfinished">Earráid: Tá spás ar diosca íseal do %s</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">Earráid: Ní hionann seiceála Dumpfile. Ríomh %s, bhíothas ag súil le %s</translation>
+ </message>
+ <message>
+ <source>Error: Failed to create new watchonly wallet</source>
+ <translation type="unfinished">Earráid: Theip ar chruthú sparán faire amháin nua</translation>
+ </message>
+ <message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">Earráid: Fuair ​​​​tú eochair nach heicsidheachúlach í: %s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">Earráid: Fuair ​​tú luach nach heicsidheachúlach é: %s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">Earráid: Rith keypool amach, glaoigh ar keypoolrefill ar dtús</translation>
</message>
<message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">Earráid: Seiceáil in easnamh</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">Earráid: Níl seoladh %s ar fáil.</translation>
+ </message>
+ <message>
+ <source>Error: This wallet already uses SQLite</source>
+ <translation type="unfinished">Earráid: Úsáideann an sparán seo SQLite cheana féin</translation>
+ </message>
+ <message>
+ <source>Error: This wallet is already a descriptor wallet</source>
+ <translation type="unfinished">Earráid: Is sparán tuairisceora é an sparán seo cheana féin</translation>
+ </message>
+ <message>
+ <source>Error: Unable to begin reading all records in the database</source>
+ <translation type="unfinished">Earráid: Ní féidir tosú ag léamh gach taifead sa bhunachar sonraí</translation>
+ </message>
+ <message>
+ <source>Error: Unable to make a backup of your wallet</source>
+ <translation type="unfinished">Earráid: Ní féidir cúltaca a dhéanamh de do sparán</translation>
+ </message>
+ <message>
+ <source>Error: Unable to parse version %u as a uint32_t</source>
+ <translation type="unfinished">Earráid: Ní féidir leagan%u a pharsáil mar uint32_t</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read all records in the database</source>
+ <translation type="unfinished">Earráid: Ní féidir gach taifead sa bhunachar sonraí a léamh</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Earráid: Ní féidir an taifead aimsitheoir bloc is fearr sa sparán a léamh</translation>
+ </message>
+ <message>
+ <source>Error: Unable to remove watchonly address book data</source>
+ <translation type="unfinished">Earráid: Ní féidir sonraí leabhar seoltaí faire amháin a bhaint</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write record to new wallet</source>
+ <translation type="unfinished">Earráid: Ní féidir taifead a scríobh chuig an sparán nua</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Earráid: Ní féidir an taifead aimsitheoir bloc is fearr ar an sparán intuaslagtha a scríobh</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Earráid: Ní féidir an taifead aimsitheoir bloc is fearr le sparán faire amháin a scríobh</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Earráid: theip ar chóip leabhar seoltaí do sparán %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Earráid: ní féidir idirbheart bunachar sonraí a chur i gcrích le haghaidh sparán %s</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Theip ar nascadh an bhloc is fearr (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Theip ar dhínascadh an bhloc.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Theip ar éisteacht ar aon phort. Úsáid -listen=0 más é seo atá uait.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Theip ar léamh an bhloc.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Theip athscanadh ar an sparán le linn túsúchán</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Theip ar thús a chur leis na hinnéacsanna, dúnadh.</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Theip ar fhíorú an mbunachar sonraí</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Theip ar scríobh an bhloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Theip ar scríobh chuig an mbunachar sonraí innéacs bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Theip ar scríobh chuig an mbunachar sonraí boinn.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Theip ar scríobh sonraí cealaigh.</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Teip ag baint an idirbhirt: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Tá an ráta táillí (%s) níos ísle ná an socrú íosta rátaí táille (%s).</translation>
</message>
@@ -3293,6 +4729,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Neamhaird ar sparán dhúbailt %s.</translation>
</message>
<message>
+ <source>Importing…</source>
+ <translation type="unfinished">à iompórtáil…</translation>
+ </message>
+ <message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
<translation type="unfinished">Bloc geineasas mícheart nó ní aimsithe. datadir mícheart don líonra?</translation>
</message>
@@ -3301,10 +4741,22 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Theip ar seiceáil slánchiall túsúchán. Tá %s ag múchadh.</translation>
</message>
<message>
+ <source>Input not found or already spent</source>
+ <translation type="unfinished">Ionchur gan aimsiú nó caite cheana féin</translation>
+ </message>
+ <message>
+ <source>Insufficient dbcache for block verification</source>
+ <translation type="unfinished">Dbcache neamhleor le haghaidh fíorú blocála</translation>
+ </message>
+ <message>
<source>Insufficient funds</source>
<translation type="unfinished">Neamhleor ciste</translation>
</message>
<message>
+ <source>Invalid -i2psam address or hostname: '%s'</source>
+ <translation type="unfinished">Seoladh neamhbhailí -i2psam nó óstainm: '%s'</translation>
+ </message>
+ <message>
<source>Invalid -onion address or hostname: '%s'</source>
<translation type="unfinished">Seoladh neamhbhailí -onion nó óstainm: '%s'</translation>
</message>
@@ -3317,6 +4769,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Cead neamhbhailí P2P: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Méid neamhbhailí le haghaidh %s=1: '%s' (ar a laghad %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Méid neamhbhailí le haghaidh %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Suim neamhbhailí do -%s=&lt;amount&gt;: '%s'</translation>
</message>
@@ -3325,14 +4785,70 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Mascghréas neamhbhailí sonraithe sa geal-liosta: '%s'</translation>
</message>
<message>
+ <source>Invalid port specified in %s: '%s'</source>
+ <translation type="unfinished">Port neamhbhailí sonraithe i %s: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid pre-selected input %s</source>
+ <translation type="unfinished">Ionchur réamhroghnaithe %s neamhbhailí</translation>
+ </message>
+ <message>
+ <source>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">Theip ar éisteacht le naisc isteach (éisteacht ar ais earráid %s)</translation>
+ </message>
+ <message>
+ <source>Loading P2P addresses…</source>
+ <translation type="unfinished">Seoltaí P2P á lódáil…</translation>
+ </message>
+ <message>
+ <source>Loading banlist…</source>
+ <translation type="unfinished">Liosta toirmeasc á lódáil…</translation>
+ </message>
+ <message>
+ <source>Loading block index…</source>
+ <translation type="unfinished">Innéacs bloc á lódáil…</translation>
+ </message>
+ <message>
+ <source>Loading wallet…</source>
+ <translation type="unfinished">Sparán á lódáil…</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Caithfidh uasmheáchan an idirbhirt a bheith idir %d agus %d</translation>
+ </message>
+ <message>
+ <source>Missing amount</source>
+ <translation type="unfinished">Méid ar iarraidh</translation>
+ </message>
+ <message>
+ <source>Missing solving data for estimating transaction size</source>
+ <translation type="unfinished">Sonraí réitigh ar iarraidh le haghaidh meastachán a dhéanamh ar mhéid an idirbhirt</translation>
+ </message>
+ <message>
<source>Need to specify a port with -whitebind: '%s'</source>
<translation type="unfinished">Is gá port a shainiú le -whitebind: '%s'</translation>
</message>
<message>
+ <source>No addresses available</source>
+ <translation type="unfinished">Níl aon seoltaí ar fáil</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation type="unfinished">Níl dóthain tuairisceoirí comhaid ar fáil.</translation>
</message>
<message>
+ <source>Not found pre-selected input %s</source>
+ <translation type="unfinished">Níor aimsíodh ionchur réamhroghnaithe %s</translation>
+ </message>
+ <message>
+ <source>Not solvable pre-selected input %s</source>
+ <translation type="unfinished">Ní féidir ionchur réamhroghnaithe %s a réiteach</translation>
+ </message>
+ <message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Níor socraíodh ach treo, gan cead: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Ní féidir Bearradh a bheidh cumraithe le luach diúltach.</translation>
</message>
@@ -3341,10 +4857,22 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Tá an mód bearrtha neamh-chomhoiriúnach le -txindex.</translation>
</message>
<message>
+ <source>Pruning blockstore…</source>
+ <translation type="unfinished">Blocsiopa á bhearradh…</translation>
+ </message>
+ <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation type="unfinished">Laghdú -maxconnections ó %d go %d, mar gheall ar shrianadh an chórais.</translation>
</message>
<message>
+ <source>Replaying blocks…</source>
+ <translation type="unfinished">Bloic á n-athsheinn…</translation>
+ </message>
+ <message>
+ <source>Rescanning…</source>
+ <translation type="unfinished">à athscanadh…</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
<translation type="unfinished">SQLiteDatabase: Theip ar rith ráiteas chun an bunachar sonraí a fhíorú: %s</translation>
</message>
@@ -3365,6 +4893,18 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Ní aithnítear rannán [%s].</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Níor thug an sínitheoir macalla don seoladh</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">D'fhreagair an sínitheoir seoladh %s gan choinne</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Earráid faighte ag sínitheoir: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Theip ar síniú idirbheart</translation>
</message>
@@ -3385,10 +4925,34 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níl eolaire bloic shonraithe "%s" ann.</translation>
</message>
<message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Níl comhadlann sonraí sonraithe "%s" ann.</translation>
+ </message>
+ <message>
+ <source>Starting network threads…</source>
+ <translation type="unfinished">Snáitheanna líonra á dtosú…</translation>
+ </message>
+ <message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Earráid chórais agus é á shruthlú: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Earráid chórais agus blocchomhad seachtrach á luchtú: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Earráid chórais agus an bloc á shábháil ar an diosca: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Tá an cód foinseach ar fáil ó %s.</translation>
</message>
<message>
+ <source>The specified config file %s does not exist</source>
+ <translation type="unfinished">Níl an comhad cumraíochta sonraithe %s ann</translation>
+ </message>
+ <message>
<source>The transaction amount is too small to pay the fee</source>
<translation type="unfinished">Tá suim an idirbhirt ró-bheag chun an táille a íoc</translation>
</message>
@@ -3397,6 +4961,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Seachnóidh an sparán níos lú ná an táille athsheachadán íosta a íoc.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Níl aon Bhainisteoir ScriptPubKey ann don seoladh seo</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Is bogearraí turgnamhacha é seo.</translation>
</message>
@@ -3409,6 +4977,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Seo an táille idirbhirt a íocfaidh tú má sheolann tú idirbheart.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Ní bhaineann an t-idirbheart %s leis an sparán seo</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Méid an idirbhirt ró-bheag</translation>
</message>
@@ -3417,10 +4989,18 @@ 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 change output index out of range</source>
+ <translation type="unfinished">Innéacs aschuir athraithe idirbhirt as raon</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>
<message>
+ <source>Transaction needs a change address, but we can't generate it.</source>
+ <translation type="unfinished">Teastaíonn seoladh athraithe ón idirbheart, ach ní féidir linn é a ghiniúint.</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation type="unfinished">Idirbheart ró-mhór</translation>
</message>
@@ -3437,6 +5017,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níorbh fhéidir cruthú comhad PID '%s': %s</translation>
</message>
<message>
+ <source>Unable to find UTXO for external input</source>
+ <translation type="unfinished">Ní féidir UTXO a aimsiú le haghaidh ionchur seachtrach</translation>
+ </message>
+ <message>
<source>Unable to generate initial keys</source>
<translation type="unfinished">Ní féidir eochracha tosaigh a ghiniúint</translation>
</message>
@@ -3445,10 +5029,22 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Ní féidir eochracha a ghiniúint</translation>
</message>
<message>
+ <source>Unable to open %s for writing</source>
+ <translation type="unfinished">Ní féidir %s a oscailt chun scríobh</translation>
+ </message>
+ <message>
+ <source>Unable to parse -maxuploadtarget: '%s'</source>
+ <translation type="unfinished">Ní féidir a pharsáil -maxuploadtarget: '%s'</translation>
+ </message>
+ <message>
<source>Unable to start HTTP server. See debug log for details.</source>
<translation type="unfinished">Ní féidir freastalaí HTTP a thosú. Féach loga dífhabhtúcháin le tuilleadh sonraí.</translation>
</message>
<message>
+ <source>Unable to unload the wallet before migrating</source>
+ <translation type="unfinished">Ní féidir an sparán a dhíluchtú roimh aistriú</translation>
+ </message>
+ <message>
<source>Unknown -blockfilterindex value %s.</source>
<translation type="unfinished">Luach -blockfilterindex %s anaithnid.</translation>
</message>
@@ -3465,16 +5061,60 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Líonra anaithnid sonraithe san -onlynet: '%s'</translation>
</message>
<message>
+ <source>Unknown new rules activated (versionbit %i)</source>
+ <translation type="unfinished">Rialacha nua anaithnid curtha i ngníomh (leagan giotán %ii)</translation>
+ </message>
+ <message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Rogha neamhaitheanta "%s" curtha ar fáil i -test=1.</translation>
+ </message>
+ <message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Leibhéal logála domhanda nach dtacaítear leis %s=%s. Luachanna bailí: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Theip ar chruthú comhaid sparán: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">ní thacaítear le acceptstalefeeestimates ar slabhra %s.</translation>
+ </message>
+ <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Catagóir logáil gan tacaíocht %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Earráid: Níorbh fhéidir watch amháin tx %s a chur le sparán faire amháin</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Earráid: Níorbh fhéidir idirbhearta faire amháin a scriosadh.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Tá carachtair neamhshábháilte i nóta tráchta (%s) Gníomhaire Úsáideora.</translation>
</message>
<message>
+ <source>Verifying blocks…</source>
+ <translation type="unfinished">Bloic á bhfíorú…</translation>
+ </message>
+ <message>
+ <source>Verifying wallet(s)…</source>
+ <translation type="unfinished">Sparán(aí) á fhíorú…</translation>
+ </message>
+ <message>
<source>Wallet needed to be rewritten: restart %s to complete</source>
<translation type="unfinished">Ba ghá an sparán a athscríobh: atosaigh %s chun críochnú</translation>
</message>
- </context>
+ <message>
+ <source>Settings file could not be read</source>
+ <translation type="unfinished">Níorbh fhéidir an comhad socruithe a léamh</translation>
+ </message>
+ <message>
+ <source>Settings file could not be written</source>
+ <translation type="unfinished">Níorbh fhéidir an comhad socruithe a scríobh</translation>
+ </message>
+</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ga_IE.ts b/src/qt/locale/bitcoin_ga_IE.ts
index df252f82d5..4f6398d9ff 100644
--- a/src/qt/locale/bitcoin_ga_IE.ts
+++ b/src/qt/locale/bitcoin_ga_IE.ts
@@ -171,6 +171,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cuir isteach an sean pasfhrása agus an pasfhrása nua don sparán.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Leanúint ar aghaidh</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Ar ais</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">Cuimhnigh nach dtugann chriptiú do sparán cosaint go hiomlán do do bitcoins ó bheith goidte ag bogearraí mailíseacha atá ag ionfhabhtú do ríomhaire.</translation>
</message>
@@ -211,10 +219,22 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Bhí an pasfhrása iontráilte le haghaidh díchriptiú an sparán mícheart.</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">Tá an pasfhrása a iontráladh le haghaidh díchriptithe an sparán mícheart. Tá carachtar nialasach ann (ie - beart nialasach). Má socraíodh an pasfhrása le leagan den bhogearra seo roimh 25.0, bain triail eile as gan ach na carachtair suas go dtí — ach gan a bheith san áireamh — an chéad charachtar null. Má éiríonn leis seo, socraigh pasfhrása nua le do thoil chun an cheist seo a sheachaint amach anseo.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Athraíodh pasfhrása sparán go rathúil.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Theip ar athrú pasfhocail</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">Tá an seanphasfhrása a cuireadh isteach le haghaidh díchriptithe an sparán mícheart. Tá carachtar nialasach ann (ie - beart nialasach). Má socraíodh an pasfhrása le leagan den bhogearra seo roimh 25.0, bain triail eile as gan ach na carachtair suas go dtí — ach gan a bheith san áireamh — an chéad charachtar null.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Rabhadh: Tá an eochair Glas Ceannlitreacha ar!</translation>
</message>
@@ -233,21 +253,59 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Eisceacht runaway</translation>
+ </message>
+ <message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished">Tharla earráid mharfach. Ní féidir le %1 leanúint ar aghaidh go sábháilte agus scoirfidh sé.</translation>
</message>
- </context>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">Earráid inmheánach</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">Tharla earráid inmheánach. Déanfaidh %1 iarracht leanúint ar aghaidh go sábháilte. Is fabht gan choinne é seo ar féidir a thuairisciú mar a thuairiscítear thíos.</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">Ar mhaith leat socruithe a athshocrú go luachanna réamhshocraithe, nó deireadh a chur leis gan athruithe a dhéanamh?</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">Tharla earráid mharfach. Cinntigh go bhfuil an comhad socruithe inscríofa, nó bain triail as rith le -nosettings.</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Earráid: %1</translation>
</message>
<message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">Níor scoir %1 go sábháilte fós…</translation>
+ </message>
+ <message>
<source>unknown</source>
<translation type="unfinished">neamhaithnid</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Leabaithe "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Cló réamhshocraithe an chórais "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Saincheaptha…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Suim</translation>
</message>
@@ -256,6 +314,16 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Iontráil seoladh Bitcoin (m.sh.%1)</translation>
</message>
<message>
+ <source>Unroutable</source>
+ <translation type="unfinished">Dothreoraithe</translation>
+ </message>
+ <message>
+ <source>Onion</source>
+ <comment>network name</comment>
+ <extracomment>Name of Tor network in peer info</extracomment>
+ <translation type="unfinished">Oinniún</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">Isteach</translation>
@@ -266,6 +334,31 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Amach</translation>
</message>
<message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">Sealaíocht Iomlán</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">Sealaíocht Bloc</translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <extracomment>Peer connection type established manually through one of several methods.</extracomment>
+ <translation type="unfinished">Lámhleabhar</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Fearacht</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">Seoladh Fetch</translation>
+ </message>
+ <message>
<source>%1 d</source>
<translation type="unfinished">%1 l</translation>
</message>
@@ -288,41 +381,41 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n soicind(í)</numerusform>
+ <numerusform>%n soicind(í)</numerusform>
+ <numerusform>%n soicind(í)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n nóiméad(a)</numerusform>
+ <numerusform>%n nóiméad(a)</numerusform>
+ <numerusform>%n nóiméad(a)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n uair(eanta)</numerusform>
+ <numerusform>%n uair(eanta)</numerusform>
+ <numerusform>%n uair(eanta)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n lá(/a)</numerusform>
+ <numerusform>%n lá(/a)</numerusform>
+ <numerusform>%n lá(/a)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n seachtain(/a)</numerusform>
+ <numerusform>%n seachtain(/a)</numerusform>
+ <numerusform>%n seachtain(/a)</numerusform>
</translation>
</message>
<message>
@@ -332,12 +425,16 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n bliain(/a)</numerusform>
+ <numerusform>%n bliain(/a)</numerusform>
+ <numerusform>%n bliain(/a)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">sparán réamhshocraithe</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -369,6 +466,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Maidir le %1</translation>
</message>
<message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Taispeáin faisnéis faoi %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">Maidir le &amp;Qt</translation>
</message>
@@ -377,10 +478,18 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Taispeáin faisnéis faoi Qt</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Mionathraigh roghanna cumraíochta do %1</translation>
+ </message>
+ <message>
<source>Create a new wallet</source>
<translation type="unfinished">Cruthaigh sparán nua</translation>
</message>
<message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">&amp;Ãoslaghdaigh</translation>
+ </message>
+ <message>
<source>Wallet:</source>
<translation type="unfinished">Sparán:</translation>
</message>
@@ -414,18 +523,62 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Glac</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Roghanna…</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Criptigh Sparán…</translation>
+ </message>
+ <message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">Criptigh na heochracha príobháideacha a bhaineann le do sparán</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Sparán Cúltaca…</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Athraigh Pasfhocal…</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Sínigh &amp;teachtaireacht…</translation>
+ </message>
+ <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">Sínigh teachtaireachtaí le do sheoltaí Bitcoin chun a chruthú gur leat iad</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Fíoraigh teachtaireacht…</translation>
+ </message>
+ <message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
<translation type="unfinished">Teachtaireachtaí a fhíorú lena chinntiú go raibh siad sínithe le seoltaí sainithe Bitcoin</translation>
</message>
<message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Lódáil PSBT ón gcomhad…</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Oscail &amp;URI…</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Dún Sparán…</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Cruthaigh Sparán…</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Dún Gach Sparán…</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation type="unfinished">&amp;Comhad</translation>
</message>
@@ -442,6 +595,26 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Barra uirlisí cluaisíní</translation>
</message>
<message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Ceanntásca á Sioncronú (%1 %)…</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Ag sioncronú le líonra…</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Bloic á n-innéacsú ar an diosca…</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Bloic ar diosca á bpróiseáil…</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Ag nascadh le piaraí…</translation>
+ </message>
+ <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished">Iarr íocaíochtaí (gineann cóid QR agus bitcoin: URIs)</translation>
</message>
@@ -460,9 +633,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>Próiseáladh %n bloc de stair na n-idirbheart.</numerusform>
+ <numerusform>Próiseáladh %n bloc de stair na n-idirbheart.</numerusform>
+ <numerusform>Próiseáladh %n bloc de stair na n-idirbheart.</numerusform>
</translation>
</message>
<message>
@@ -470,6 +643,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">%1 taobh thiar</translation>
</message>
<message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Ag teacht suas…</translation>
+ </message>
+ <message>
<source>Last received block was generated %1 ago.</source>
<translation type="unfinished">Gineadh an bloc deireanach a fuarthas %1 ó shin.</translation>
</message>
@@ -498,6 +675,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Lódáil Idirbheart Bitcoin Sínithe go Páirteach</translation>
</message>
<message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Luchtaigh PSBT ón &amp;gearrthaisce…</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">Lódáil Idirbheart Bitcoin Sínithe go Páirteach ón gearrthaisce</translation>
</message>
@@ -534,10 +715,28 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Dún sparán</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Athchóirigh Sparán…</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Athchóirigh sparán ó chomhad cúltaca</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Dún gach sparán</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Imirce Sparán</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Imirce sparán</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Taispeáin an %1 teachtaireacht chabhrach chun liosta a fháil de roghanna Bitcoin líne na n-orduithe féideartha</translation>
</message>
@@ -550,14 +749,25 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Masc na luachanna sa gcluaisín Forléargas</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Níl aon sparán ar fáil</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Sonraí Sparán</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Luchtaigh Cúltaca Sparán</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">Athchóirigh Sparán</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">Ainm Sparán</translation>
@@ -578,16 +788,56 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<source>%1 client</source>
<translation type="unfinished">%1 cliaint</translation>
</message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">&amp;Folaigh</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">S&amp;conas</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 />
+ <numerusform>%n nasc(í) gníomhacha le líonra Bitcoin.</numerusform>
+ <numerusform>%n nasc(í) gníomhacha le líonra Bitcoin.</numerusform>
+ <numerusform>%n nasc(í) gníomhacha le líonra 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">Cliceáil le haghaidh tuilleadh gníomhartha.</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">Taispeáin cluaisín Piaraí</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Díchumasaigh gníomhaíocht líonra</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Cumasaigh gníomhaíocht líonra</translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Ceanntásca a réamhshioncronú (%1 %)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Earráid agus sparán á chruthú</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Ní féidir sparán nua a chruthú, tiomsaíodh na bogearraí gan tacaíocht sqlite (riachtanach le haghaidh sparán tuairisceora)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Earráid: %1</translation>
</message>
@@ -742,6 +992,30 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáil suim</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Cóipeáil seoladh</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Cóipeáil &amp;lipéad</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Cóipeáil &amp; méid</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">Cóipeáil idirbheart &amp; ID agus innéacs aschuir</translation>
+ </message>
+ <message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">L&amp;ocáil neamhchaite</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">&amp;Díghlasáil neamhchaite</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">Cóipeáil méid</translation>
</message>
@@ -802,7 +1076,79 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<source>Create wallet warning</source>
<translation type="unfinished">Rabhadh cruthú sparán</translation>
</message>
- </context>
+ <message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">Ní féidir sínitheoirí a liostú</translation>
+ </message>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Fuarthas an iomarca sínitheoirí seachtracha</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">Luchtaigh Sparán</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">Sparán á lódáil…</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Imirce sparán</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">An bhfuil tú cinnte gur mian leat an sparán &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">Má dhéantar an sparán a aistriú, déanfar an sparán seo a thiontú go sparán tuairisceora amháin nó níos mó. Beidh gá le cúltaca sparán nua.
+Má tá aon scripteanna faire amháin sa sparán seo, cruthófar sparán nua ina mbeidh na scripteanna faire amháin sin.
+Má tá aon scripteanna intuaslagtha ach nach bhfuil faire orthu sa sparán seo, cruthófar sparán difriúil agus nua ina mbeidh na scripteanna sin.
+
+Cruthóidh an próiseas imirce cúltaca den sparán roimh imirce. Ainmneofar an comhad cúltaca seo &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak agus is féidir é a fháil san eolaire don sparán seo. I gcás imirce mícheart, is féidir an cúltaca a chur ar ais leis an bhfeidhmiúlacht "Athchóirigh Sparán".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Imirce Sparán</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Sparán á Ascnamh &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">D'éirigh le haistriú an sparán '%1'.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Aistríodh scripteanna faire amháin go sparán nua darb ainm '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Aistríodh scripteanna intuaslagtha ach nach bhfuiltear ag faire orthu go sparán nua darb ainm '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Theip ar an imirce</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">D'éirigh leis an Imirce</translation>
+ </message>
+</context>
<context>
<name>OpenWalletActivity</name>
<message>
@@ -814,15 +1160,44 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Rabhadh oscail sparán</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Oscail Sparán</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">Sparán Oscailte&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">Athchóirigh Sparán</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">Sparán á Athchóiriú&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">Theip ar athchóiriú an sparán</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">Athchóirigh rabhadh sparán</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">Athchóirigh teachtaireacht sparán</translation>
+ </message>
+</context>
<context>
<name>WalletController</name>
<message>
@@ -853,6 +1228,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cruthaigh Sparán</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Tá tú céim amháin ar shiúl ó chruthú do sparán nua!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Tabhair ainm le do thoil agus, más mian leat, cumasaigh aon ardroghanna</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Ainm Sparán</translation>
</message>
@@ -889,10 +1272,23 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Déan Sparán Glan</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">Bain úsáid as gléas sínithe seachtrach cosúil le sparán crua-earraí. Cumraigh an script sínitheora sheachtraigh i sainroghanna an sparán ar dtús.</translation>
+ </message>
+ <message>
+ <source>External signer</source>
+ <translation type="unfinished">Sínitheoir seachtrach</translation>
+ </message>
+ <message>
<source>Create</source>
<translation type="unfinished">Cruthaigh</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">Tiomsaithe gan tacaíocht sínithe seachtrach (riachtanach le haghaidh síniú seachtrach)</translation>
+ </message>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -972,9 +1368,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>%n GB de spás ar fáil</numerusform>
+ <numerusform>%n GB de spás ar fáil</numerusform>
+ <numerusform>%n GB de spás ar fáil</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -994,6 +1390,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Roghnaigh eolaire sonraí</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">Ar a laghad stórálfar %1 GB de shonraí sa comhadlann seo, agus fásfaidh sé le himeacht ama.</translation>
</message>
@@ -1005,9 +1405,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</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 />
+ <numerusform>(leor chun cúltacaí a aischur %n lá(laethanta) d'aois)</numerusform>
+ <numerusform>(leor chun cúltacaí a aischur %n lá(laethanta) d'aois)</numerusform>
+ <numerusform>(leor chun cúltacaí a aischur %n lá(laethanta) d'aois)</numerusform>
</translation>
</message>
<message>
@@ -1039,6 +1439,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Mar gurb é seo an chéad uair a lainseáil an clár, is féidir leat a roghnú cá stórálfaidh %1 a chuid sonraí.</translation>
</message>
<message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">Teorainn a chur le blocshlabhra stórála go</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">Teastaíonn an blocshlabhra iomlán a íoslódáil arís chun an socrú seo a fhilleadh. Tá sé níos sciobtha an slabhra iomlán a íoslódáil ar dtús agus é a bhearradh níos déanaí. Díchumasaíodh roinnt ardgnéithe.</translation>
</message>
@@ -1047,6 +1451,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Tá an sioncrónú tosaigh seo an-dhian, agus d’fhéadfadh sé fadhbanna crua-earraí a nochtadh le do ríomhaire nach tugadh faoi deara roimhe seo. Gach uair a ritheann tú %1, leanfaidh sé ar aghaidh ag íoslódáil san áit ar fhág sé as.</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">Nuair a chliceálann tú OK, tosóidh %1 ag íosluchtú agus ag próiseáil slabhra iomlán %4 (%2 GB) ag tosú leis na hidirbhearta is luaithe i %3 nuair a seoladh %4 ar dtús.</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">Má roghnaigh tú stóráil blocshlabhra a theorannú (bearradh), fós caithfear na sonraí stairiúla a íoslódáil agus a phróiseáil, ach scriosfar iad ina dhiaidh sin chun d’úsáid diosca a choinneáil íseal.</translation>
</message>
@@ -1077,6 +1485,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>ShutdownWindow</name>
<message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">Tá %1 ag múchadh…</translation>
+ </message>
+ <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation type="unfinished">Ná múch an ríomhaire go dtí go n-imíonn an fhuinneog seo.</translation>
</message>
@@ -1100,6 +1512,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Líon na mbloic fágtha</translation>
</message>
<message>
+ <source>Unknown…</source>
+ <translation type="unfinished">Anaithnid…</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">ag ríomh…</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Am bloc deireanach</translation>
</message>
@@ -1123,7 +1543,15 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<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">Tá %1 ag sioncronú faoi láthair. Déanfaidh sé é a íoslódáil agus a fíorú ar ceanntásca agus bloic ó phiaraí go dtí barr an blocshlabhra.</translation>
</message>
- </context>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Anaithnid. Ceanntásca á Sioncronú (%1, %2 %)…</translation>
+ </message>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Anaithnid. Ceanntásca a Réamhshioncronú (%1, %2 %)…</translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1155,6 +1583,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Tosaigh %1 ar logáil isteach an chórais</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">Laghdaítear go mór an spás diosca a theastaíonn chun idirbhearta a stóráil má dhéantar bearradh a chumasú. Tá gach bloc fós bailíochtaithe go hiomlán. Chun an socrú seo a thabhairt ar ais ní mór an blockchain iomlán a athíoslódáil.</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation type="unfinished">Méid taisce &amp;bunachar sonraí</translation>
</message>
@@ -1163,6 +1595,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Líon snáitheanna &amp;fíorú scripte</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">Conair iomlán chuig script comhoiriúnach %1 (m.sh. C:\Downloads\hwi.exe nó /Users/you/Downloads/hwi.py). Tabhair aire: is féidir le malware do bhoinn a ghoid!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Seoladh IP an seachfhreastalaí (m.sh. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1175,6 +1611,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Ãoslaghdaigh in ionad scoir an feidhmchlár nuair a bhíonn an fhuinneog dúnta. Nuair a chumasófar an rogha seo, ní dhúnfar an feidhmchlár ach amháin tar éis Scoir a roghnú sa roghchlár.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Cló sa chluaisín Forbhreathnú:</translation>
+ </message>
+ <message>
+ <source>Options set in this dialog are overridden by the command line:</source>
+ <translation type="unfinished">Tá na roghanna atá socraithe sa dialóg seo sáraithe ag an líne ordaithe:</translation>
+ </message>
+ <message>
<source>Open the %1 configuration file from the working directory.</source>
<translation type="unfinished">Oscail an comhad cumraíochta %1 ón eolaire oibre.</translation>
</message>
@@ -1203,14 +1647,44 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Teastaíonn an blocshlabhra iomlán a íoslódáil arís chun an socrú seo a fhilleadh.</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">Uasmhéid taisce bunachar sonraí. Is féidir le taisce níos mó cur le sioncrónú níos tapúla, agus ina dhiaidh sin ní bhíonn an tairbhe chomh soiléir don chuid is mó de chásanna úsáide. Laghdófar úsáid chuimhne má laghdaítear méid an taisce. Roinntear cuimhne mempool neamhúsáidte don taisce seo.</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">Socraigh líon na snáitheanna fíoraithe scripte. Freagraíonn luachanna diúltacha do líon na gcroíthe is mian leat a fhágáil saor sa chóras.</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished">(0 = uath, &lt;0 = fág an méid sin cóir saor)</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">Ligeann sé seo duit féin nó d’uirlis tríú páirtí cumarsáid a dhéanamh leis an nód trí orduithe ordú-líne agus 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">Cumasaigh freastalaí R&amp;PC</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation type="unfinished">Sp&amp;arán</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">Cibé an táille a dhealú ón méid a shocrú mar réamhshocrú nó nach bhfuil.</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">Dealaigh &amp;táille ón méid de réir réamhshocraithe</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation type="unfinished">Saineolach</translation>
</message>
@@ -1227,6 +1701,24 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Caith &amp;sóinseáil neamhdheimhnithe</translation>
</message>
<message>
+ <source>Enable &amp;PSBT controls</source>
+ <extracomment>An options window setting to enable PSBT controls.</extracomment>
+ <translation type="unfinished">Cumasaigh &amp; rialuithe 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">Cibé ar cheart rialuithe PSBT a thaispeáint.</translation>
+ </message>
+ <message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">Sínitheoir Seachtrach (m.sh. sparán crua-earraí)</translation>
+ </message>
+ <message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">&amp;Conair scripte sínithe seachtraí</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">Oscail port cliant Bitcoin go huathoibríoch ar an ródaire. Ní oibríonn sé seo ach nuair a thacaíonn do ródaire le UPnP agus nuair a chumasaítear é.</translation>
</message>
@@ -1235,6 +1727,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Mapáil port ag úsáid &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">Oscail calafort cliant Bitcoin go huathoibríoch ar an ródaire. Ní oibríonn sé seo ach amháin nuair a thacaíonn do ródaire le NAT-PMP agus go bhfuil sé cumasaithe. D'fhéadfadh an port seachtrach a bheith randamach.</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">Port léarscáil le NA&amp;T-PMP</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">Glac le naisc ón taobh amuigh.</translation>
</message>
@@ -1267,6 +1767,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Fuinneog</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">Taispeáin an deilbhín i dtráidire an chórais.</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">&amp;Taispeáin íocón an tráidire</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">Ná taispeáin ach deilbhín tráidire t'éis an fhuinneog a íoslaghdú.</translation>
</message>
@@ -1299,6 +1807,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Roghnaigh an t-aonad foroinnte réamhshocraithe le taispeáint sa chomhéadan agus nuair a sheoltar boinn.</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">URLanna tríú páirtí (m.sh. taiscéalaí bloc) atá le feiceáil sa chluaisín idirbheart mar mhíreanna roghchláir comhthéacs. Cuirtear hais idirbhirt in ionad%s sa URL. Déantar URLanna iolracha a dheighilt le barra ingearach |.</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">URLanna idirbheart tríú páirtí</translation>
+ </message>
+ <message>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished">Gnéithe rialúchán bonn a thaispeáint nó nach.</translation>
</message>
@@ -1319,6 +1835,11 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Cealaigh</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">Tiomsaithe gan tacaíocht sínithe seachtrach (riachtanach le haghaidh síniú seachtrach)</translation>
+ </message>
+ <message>
<source>default</source>
<translation type="unfinished">réamhshocrú</translation>
</message>
@@ -1337,6 +1858,11 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Atosú cliant ag teastáil chun athruithe a ghníomhachtú.</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">Déanfar cúltaca de na socruithe reatha ag "%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">Múchfar an cliant. Ar mhaith leat dul ar aghaidh?</translation>
@@ -1352,6 +1878,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Úsáidtear an comhad cumraíochta chun ardroghanna úsáideora a shonrú a sháraíonn socruithe GUI. Freisin, sáróidh aon roghanna líne na n-orduithe an comhad cumraíochta seo.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Leanúint ar aghaidh</translation>
+ </message>
+ <message>
<source>Cancel</source>
<translation type="unfinished">Cealaigh</translation>
</message>
@@ -1373,6 +1903,13 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
</message>
</context>
<context>
+ <name>OptionsModel</name>
+ <message>
+ <source>Could not read setting "%1", %2.</source>
+ <translation type="unfinished">Níorbh fhéidir socrú "%1", %2 a léamh.</translation>
+ </message>
+</context>
+<context>
<name>OverviewPage</name>
<message>
<source>Form</source>
@@ -1454,6 +1991,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>PSBT Operations</source>
+ <translation type="unfinished">Oibríochtaí PSBT</translation>
+ </message>
+ <message>
<source>Sign Tx</source>
<translation type="unfinished">Sínigh Tx</translation>
</message>
@@ -1466,6 +2007,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáil chuig Gearrthaisce</translation>
</message>
<message>
+ <source>Save…</source>
+ <translation type="unfinished">Sábháil…</translation>
+ </message>
+ <message>
<source>Close</source>
<translation type="unfinished">Dún</translation>
</message>
@@ -1478,6 +2023,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Theip ar síniú idirbheart: %1</translation>
</message>
<message>
+ <source>Cannot sign inputs while wallet is locked.</source>
+ <translation type="unfinished">Ní féidir ionchuir a shíniú agus an sparán glasáilte.</translation>
+ </message>
+ <message>
<source>Could not sign any more inputs.</source>
<translation type="unfinished">Níorbh fhéidir níos mó ionchuir a shíniú.</translation>
</message>
@@ -1510,10 +2059,19 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Sábháil Sonraí Idirbheart</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">Idirbheart Páirt-Sínithe (Dénártha)</translation>
+ </message>
+ <message>
<source>PSBT saved to disk.</source>
<translation type="unfinished">IBSP sábháilte ar dhiosca.</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Seoltar %1 go %2</translation>
+ </message>
+ <message>
<source>own address</source>
<translation type="unfinished">seoladh féin</translation>
</message>
@@ -1546,6 +2104,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Tá síni(ú/the) fós ag teastáil ón idirbheart.</translation>
</message>
<message>
+ <source>(But no wallet is loaded.)</source>
+ <translation type="unfinished">(Ach níl aon sparán luchtaithe.)</translation>
+ </message>
+ <message>
<source>(But this wallet cannot sign transactions.)</source>
<translation type="unfinished">(Ach ní féidir leis an sparán seo idirbhearta a shíniú.)</translation>
</message>
@@ -1581,6 +2143,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Ní URI bailí é 'bitcoin://'. Úsáid 'bitcoin:' ina ionad.</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">Ní féidir iarratas íocaíochta a phróiseáil toisc nach dtacaítear le BIP70.
+De bharr lochtanna slándála forleathan in BIP70, moltar go láidir neamhaird a dhéanamh d’aon treoracha ceannaithe chun sparán a athrú.
+Má tá an earráid seo á fáil agat ba cheart duit iarraidh ar an díoltóir URI atá comhoiriúnach le BIP21 a sholáthar.</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">Ní féidir URI a pharsáil! Is féidir le seoladh neamhbhailí Bitcoin nó paraiméadair URI drochfhoirmithe a bheith mar an chúis.</translation>
</message>
@@ -1597,6 +2167,16 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Gníomhaire Úsáideora</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">Piaraí</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">Aois</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">Treo</translation>
@@ -1640,6 +2220,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>QRImageWidget</name>
<message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Sábháil Ãomhá…</translation>
+ </message>
+ <message>
<source>&amp;Copy Image</source>
<translation type="unfinished">&amp;Cóipeáil Ãomhá</translation>
</message>
@@ -1659,7 +2243,12 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<source>Save QR Code</source>
<translation type="unfinished">Sabháil cód QR.</translation>
</message>
- </context>
+ <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">Ãomhá PNG</translation>
+ </message>
+</context>
<context>
<name>RPCConsole</name>
<message>
@@ -1711,6 +2300,14 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Líon naisc</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Seoltaí Ãitiúla</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Seoltaí líonra go bhfuil do nód Bitcoin úsáid faoi láthair chun cumarsáid a dhéanamh le nóid eile.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Blocshlabhra</translation>
</message>
@@ -1759,10 +2356,34 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Roghnaigh piara chun faisnéis mhionsonraithe a fheiceáil.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Folaigh Sonraí na bPiaraí</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Leagan na sraithe iompair: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Iompar</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Aitheantas an tseisiúin</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Leagan</translation>
</message>
<message>
+ <source>Whether we relay transactions to this peer.</source>
+ <translation type="unfinished">Cibé an ndéanaimid idirbhearta a athsheoladh chuig an bpiaraí seo.</translation>
+ </message>
+ <message>
+ <source>Transaction Relay</source>
+ <translation type="unfinished">Leaschraolacháin Idirbheart</translation>
+ </message>
+ <message>
<source>Starting Block</source>
<translation type="unfinished">Bloc Tosaigh</translation>
</message>
@@ -1775,6 +2396,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Bloic Sioncronaithe</translation>
</message>
<message>
+ <source>Last Transaction</source>
+ <translation type="unfinished">Idirbheart Deiridh</translation>
+ </message>
+ <message>
<source>The mapped Autonomous System used for diversifying peer selection.</source>
<translation type="unfinished">An Córas Uathrialach mapáilte a úsáidtear chun roghnú piaraí a éagsúlú.</translation>
</message>
@@ -1783,6 +2408,36 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">CU Mapáilte</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">Cibé an gcuirfimid seoltaí chuig an bpiaraí seo.</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">Sealaíocht Seoladh</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">Líon iomlán na seoltaí a fuarthas ón bpiaraí seo a próiseáladh (ní áirítear seoltaí a laghdaíodh mar gheall ar theorannú rátaí).</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">Líon iomlán na seoltaí a fuarthas ón bpiaraí seo a thit (nár próiseáladh) mar gheall ar theorannú rátaí.</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">Seoltaí Próiseáilte</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">Seoltaí Ráta-Teoranta</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation type="unfinished">Gníomhaire Úsáideora</translation>
</message>
@@ -1811,14 +2466,51 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Ceadanna</translation>
</message>
<message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">Treo agus cineál an naisc phiara: %1</translation>
+ </message>
+ <message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">Treo/Cineál</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">Teaghrán ID an tseisiúin BIP324 i heicsidheachúlach.</translation>
+ </message>
+ <message>
+ <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
+ <translation type="unfinished">An prótacal líonra a bhfuil an piara seo ceangailte trí: IPv4, IPv6, Oinniún, I2P, nó CJDNS.</translation>
+ </message>
+ <message>
<source>Services</source>
<translation type="unfinished">Seirbhísí</translation>
</message>
<message>
+ <source>High bandwidth BIP152 compact block relay: %1</source>
+ <translation type="unfinished">Bandaleithead ard BIP152 sealaíochta bloc dhlúth: %1</translation>
+ </message>
+ <message>
+ <source>High Bandwidth</source>
+ <translation type="unfinished">Bandaleithid Ard</translation>
+ </message>
+ <message>
<source>Connection Time</source>
<translation type="unfinished">Am Ceangail</translation>
</message>
<message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">Tá achar ama caite ó fuarthas bloc úrscéil a rinne na seiceálacha bailíochta tosaigh ón gcomhghleacaí seo.</translation>
+ </message>
+ <message>
+ <source>Last Block</source>
+ <translation type="unfinished">Bloc Deireanach</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">Chuaigh an t-am caite ó fuarthas idirbheart úrnua a glacadh isteach inár mempool ón bpiaraí seo.</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">Seol Deireanach</translation>
</message>
@@ -1883,6 +2575,68 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Amach:</translation>
</message>
<message>
+ <source>Inbound: initiated by peer</source>
+ <extracomment>Explanatory text for an inbound peer connection.</extracomment>
+ <translation type="unfinished">Isteach: arna thionscnamh ag piaraí</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">Sealaíocht Iomlán Amach: réamhshocraithe</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">Leaschraolacháin Bloc Amach: ní athsheoltar idirbhearta ná seoltaí</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">Lámhleabhar Amach: curtha leis ag úsáid roghanna cumraíochta RPC %1 nó %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">Feeler Amach: gearrthéarmach, le haghaidh seoltaí tástála</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">Faigh Seoladh Amach: gearrthéarmach, chun seoltaí a lorg</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">bhrath: d’fhéadfadh v1 nó v2 a bheith i gcomhghleacaí</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: prótacal iompair gnáththéacs gan chriptiú</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 prótacal iompair criptithe</translation>
+ </message>
+ <message>
+ <source>we selected the peer for high bandwidth relay</source>
+ <translation type="unfinished">roghnaigh muid an piaraí le haghaidh sealaíochta bandaleithead ard</translation>
+ </message>
+ <message>
+ <source>the peer selected us for high bandwidth relay</source>
+ <translation type="unfinished">roghnaigh an piaraí sinn le haghaidh sealaíochta bandaleithead ard</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">níor roghnaíodh aon sealaíochta bandaleithead ard</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óipeáil seoladh</translation>
+ </message>
+ <message>
<source>&amp;Disconnect</source>
<translation type="unfinished">&amp;Scaoil</translation>
</message>
@@ -1891,6 +2645,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">1 &amp;uair</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 l&amp;á</translation>
+ </message>
+ <message>
<source>1 &amp;week</source>
<translation type="unfinished">1 &amp;seachtain</translation>
</message>
@@ -1899,6 +2657,11 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">1 &amp;bhliain</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;Cóipeáil IP/Netmask</translation>
+ </message>
+ <message>
<source>&amp;Unban</source>
<translation type="unfinished">&amp;Díchosc</translation>
</message>
@@ -1907,14 +2670,48 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Gníomhaíocht líonra díchumasaithe</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Faic</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ag rith ordú gan aon sparán</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Fuinneog nód - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Ag rith ordú ag úsáid sparán "%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">Fáilte go consól RPC %1.
+Úsáid saigheada suas agus síos chun an stair a nascleanúint, agus %2 chun an scáileán a ghlanadh.
+Úsáid %3 agus %4 chun an clómhéid a mhéadú nó a laghdú.
+Clóscríobh %5 le haghaidh forbhreathnú ar na horduithe atá ar fáil.
+Chun tuilleadh eolais a fháil faoin gconsól seo a úsáid, clóscríobh %6.
+
+%7 RABHADH: Bhí scamadóirí gníomhach, ag rá le húsáideoirí orduithe a chlóscríobh anseo, ag goid a n-inneachar sparán. Ná húsáid an consól seo gan iarmhairtí ordaithe a thuiscint go hiomlán.%8</translation>
+ </message>
+ <message>
+ <source>Executing…</source>
+ <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
+ <translation type="unfinished">Ag rith…</translation>
+ </message>
+ <message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(piara: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">trí %1</translation>
</message>
@@ -1939,6 +2736,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cosc do</translation>
</message>
<message>
+ <source>Never</source>
+ <translation type="unfinished">Riamh</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation type="unfinished">Anaithnid</translation>
</message>
@@ -2018,6 +2819,46 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáil &amp;URI</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Cóipeáil seoladh</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Cóipeáil &amp;lipéad</translation>
+ </message>
+ <message>
+ <source>Copy &amp;message</source>
+ <translation type="unfinished">Cóipeáil &amp; teachtaireacht</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Cóipeáil &amp; méid</translation>
+ </message>
+ <message>
+ <source>Base58 (Legacy)</source>
+ <translation type="unfinished">Bonn58 (Oidhreacht)</translation>
+ </message>
+ <message>
+ <source>Not recommended due to higher fees and less protection against typos.</source>
+ <translation type="unfinished">Ní mholtar mar gheall ar tháillí níos airde agus cosaint níos lú i gcoinne typos.</translation>
+ </message>
+ <message>
+ <source>Base58 (P2SH-SegWit)</source>
+ <translation type="unfinished">Base58 (P2SH- SegWit)</translation>
+ </message>
+ <message>
+ <source>Generates an address compatible with older wallets.</source>
+ <translation type="unfinished">Gineann seoladh atá comhoiriúnach le sparán níos sine.</translation>
+ </message>
+ <message>
+ <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
+ <translation type="unfinished">Gineann sé seoladh segwit dúchais (BIP-173). Ní thacaíonn roinnt sean-sparán leis.</translation>
+ </message>
+ <message>
+ <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
+ <translation type="unfinished">Is uasghrádú é Bech32m (BIP-350) go Bech32, tá tacaíocht sparán fós teoranta.</translation>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">Níorbh fhéidir sparán a dhíghlasáil.</translation>
</message>
@@ -2029,6 +2870,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<context>
<name>ReceiveRequestDialog</name>
<message>
+ <source>Request payment to …</source>
+ <translation type="unfinished">Iarr íocaíocht chuig…</translation>
+ </message>
+ <message>
<source>Address:</source>
<translation type="unfinished">Seoladh:</translation>
</message>
@@ -2057,6 +2902,18 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáil &amp;Seoladh</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">&amp;Fíoraigh</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">Fíoraigh an seoladh seo ar e.g. scáileán sparán crua-earraí</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Sábháil Ãomhá…</translation>
+ </message>
+ <message>
<source>Payment information</source>
<translation type="unfinished">Faisnéis íocaíochta</translation>
</message>
@@ -2187,10 +3044,26 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Glan gach réimse den fhoirm.</translation>
</message>
<message>
+ <source>Inputs…</source>
+ <translation type="unfinished">Ionchuir…</translation>
+ </message>
+ <message>
+ <source>Choose…</source>
+ <translation type="unfinished">Roghnaigh…</translation>
+ </message>
+ <message>
<source>Hide transaction fee settings</source>
<translation type="unfinished">Folaigh socruithe táillí idirbhirt</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">Sonraigh táille shaincheaptha in aghaidh an kB (1,000 beart) de mhéid fíorúil an idirbhirt.
+
+Nóta: Ós rud é go ríomhtar an táille ar bhonn in aghaidh an bheart, ní thabharfadh ráta táille "100 satoshis in aghaidh an kvB" le haghaidh méid idirbhirt 500 beart fíorúil (leath de 1 kvB) táille ach 50 satoshis ar deireadh thiar.</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">Nuair a bhíonn méid idirbhirt níos lú ná spás sna bloic, féadfaidh mianadóirí chomh maith le nóid athsheachadadh táille íosta a fhorfheidhmiú. Tá sé sách maith an táille íosta seo a íoc, ach bíodh a fhios agat go bhféadfadh idirbheart nach ndeimhnítear riamh a bheith mar thoradh air seo a nuair a bhíonn níos mó éilimh ar idirbhearta bitcoin ná mar is féidir leis an líonra a phróiseáil.</translation>
</message>
@@ -2199,6 +3072,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">D’fhéadfadh idirbheart nach ndeimhnítear riamh a bheith mar thoradh ar tháille ró-íseal (léigh an leid uirlise)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(Níor cuireadh tús leis an táille chliste go fóill. Tógann sé seo cúpla bloc de ghnáth...)</translation>
+ </message>
+ <message>
<source>Confirmation time target:</source>
<translation type="unfinished">Sprioc am dearbhaithe:</translation>
</message>
@@ -2255,6 +3132,20 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">%1 (%2 bloic)</translation>
</message>
<message>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">Sínigh ar an ngléas</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">Ceangail do sparán crua-earraí ar dtús.</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">Socraigh cosán script sínitheora seachtrach i Roghanna -&gt; Sparán</translation>
+ </message>
+ <message>
<source>Cr&amp;eate Unsigned</source>
<translation type="unfinished">Cruthaigh Gan Sín</translation>
</message>
@@ -2271,15 +3162,42 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">%1 go %2</translation>
</message>
<message>
+ <source>To review recipient list click "Show Details…"</source>
+ <translation type="unfinished">Chun liosta na bhfaighteoirí a athbhreithniú cliceáil "Taispeáin Sonraí…"</translation>
+ </message>
+ <message>
+ <source>Sign failed</source>
+ <translation type="unfinished">Theip ar an síniú</translation>
+ </message>
+ <message>
+ <source>External signer not found</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Níor aimsíodh sínitheoir seachtrach</translation>
+ </message>
+ <message>
+ <source>External signer failure</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Teip sínitheora sheachtraigh</translation>
+ </message>
+ <message>
<source>Save Transaction Data</source>
<translation type="unfinished">Sábháil Sonraí Idirbheart</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">Idirbheart Páirt-Sínithe (Dénártha)</translation>
+ </message>
+ <message>
<source>PSBT saved</source>
<extracomment>Popup message when a PSBT has been saved to a file</extracomment>
<translation type="unfinished">IBSP sábháilte</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">Iarmhéid seachtrach:</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">nó</translation>
</message>
@@ -2293,6 +3211,20 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Le do thoil, déan athbhreithniú ar do thogra idirbhirt. Tabharfaidh sé seo Idirbheart Bitcoin Sínithe go Páirteach (IBSP) ar féidir leat a shábháil nó a chóipeáil agus a shíniú ansin le m.sh. sparán as líne %1, nó sparán crua-earraí atá comhoiriúnach le IBSP.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 ó sparán '%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">Ar mhaith leat an t-idirbheart seo a chruthú?</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">Le do thoil, athbhreithnigh d'idirbheart. Is féidir leat an t-idirbheart seo a chruthú agus a sheoladh nó Idirbheart Bitcoin Páirt-Sínithe (PSBT) a chruthú, ar féidir leat a shábháil nó a chóipeáil agus a shíniú ansin le, m.sh., sparán %1 as líne, nó sparán crua-earraí PSBT-comhoiriúnach.</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">Le do thoil, déan athbhreithniú ar d’idirbheart.</translation>
@@ -2310,6 +3242,20 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Iomlán</translation>
</message>
<message>
+ <source>Unsigned Transaction</source>
+ <comment>PSBT copied</comment>
+ <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
+ <translation type="unfinished">Idirbheart Gan Sínithe</translation>
+ </message>
+ <message>
+ <source>The PSBT has been copied to the clipboard. You can also save it.</source>
+ <translation type="unfinished">Tá an PSBT cóipeáilte chuig an ngearrthaisce. Is féidir leat é a shábháil freisin.</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk</source>
+ <translation type="unfinished">PSBT sábháilte ar diosca</translation>
+ </message>
+ <message>
<source>Confirm send coins</source>
<translation type="unfinished">Deimhnigh seol boinn</translation>
</message>
@@ -2348,9 +3294,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>Meastar go dtosóidh an deimhniú laistigh de %n bloc(s).</numerusform>
+ <numerusform>Meastar go dtosóidh an deimhniú laistigh de %n bloc(s).</numerusform>
+ <numerusform>Meastar go dtosóidh an deimhniú laistigh de %n bloc(s).</numerusform>
</translation>
</message>
<message>
@@ -2455,8 +3401,8 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">&amp;Sínigh Teachtaireacht</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">Féadfaidh tú teachtaireachtaí / comhaontuithe a shíniú le do sheoltaí chun a chruthú gur féidir leat bitcoins a sheoltear chucu a fháil. Bí cúramach gan aon rud doiléir nó randamach a shíniú, mar d’fhéadfadh ionsaithe fioscaireachta iarracht ar d’aitheantas a shíniú chucu. Ná sínigh ach ráitis lán-mhionsonraithe a aontaíonn tú leo.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Is féidir leat teachtaireachtaí/comhaontuithe a shíniú le do sheoltaí oidhreachta (P2PKH) lena chruthú gur féidir leat bitcoins a sheoltar chucu a fháil. Bí cúramach gan aon rud doiléir nó randamach a shíniú, mar seans go ndéanfaidh ionsaithe fioscaireachta iarracht tú a mhealladh chun d'aitheantas a shíniú leo. Ná sínigh ach ráitis mhionsonraithe a n-aontaíonn tú leo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -2543,8 +3489,8 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Seiceáil an seoladh le do thoil agus triail arís.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Ní thagraíonn an seoladh a iontráladh d’eochair.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">Ní thagraíonn an seoladh isteach d'eochair leagáide (P2PKH). Ní thacaítear le síniú teachtaireachta do SegWit agus cineálacha seoltaí eile nach P2PKH iad sa leagan seo de %1. Seiceáil an seoladh agus bain triail eile as.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -2588,6 +3534,17 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
</message>
</context>
<context>
+ <name>SplashScreen</name>
+ <message>
+ <source>(press q to shutdown and continue later)</source>
+ <translation type="unfinished">(brúigh q chun múchadh agus lean ar aghaidh ar ball)</translation>
+ </message>
+ <message>
+ <source>press q to shutdown</source>
+ <translation type="unfinished">brúigh q chun múchadh</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -2595,6 +3552,16 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">faoi choimhlint le idirbheart le %1 dearbhuithe</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/neamhdhearbhaithe, i linn cuimhne</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/neamhdhearbhaithe, ní sa linn cuimhne</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">tréigthe</translation>
@@ -2656,9 +3623,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
- <numerusform />
+ <numerusform>aibíonn i %n bloc(anna) eile</numerusform>
+ <numerusform>aibíonn i %n bloc(anna) eile</numerusform>
+ <numerusform>aibíonn i %n bloc(anna) eile</numerusform>
</translation>
</message>
<message>
@@ -2710,6 +3677,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Innéacs aschuir</translation>
</message>
<message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Níor fíoraíodh an teastas)</translation>
+ </message>
+ <message>
<source>Merchant</source>
<translation type="unfinished">Ceannaí</translation>
</message>
@@ -2895,6 +3866,55 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Ãosmhéid</translation>
</message>
<message>
+ <source>Range…</source>
+ <translation type="unfinished">Raon…</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Cóipeáil seoladh</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Cóipeáil &amp;lipéad</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Cóipeáil &amp; méid</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">Cóipeáil idirbheart &amp;ID</translation>
+ </message>
+ <message>
+ <source>Copy &amp;raw transaction</source>
+ <translation type="unfinished">Cóipeáil &amp;amh-idirbheart</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">Cóipeáil idirbheart agus sonraí iomlána</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">&amp;Taispeáin sonraí idirbhirt</translation>
+ </message>
+ <message>
+ <source>Increase transaction &amp;fee</source>
+ <translation type="unfinished">Méadaigh idirbheart &amp; táille</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">Idirbheart&amp;tréigean</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">&amp;Cuir lipéad seolta in eagar</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">Taispeáin i %1</translation>
+ </message>
+ <message>
<source>Export Transaction History</source>
<translation type="unfinished">Easpórtáil Stair Idirbheart</translation>
</message>
@@ -2944,6 +3964,10 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Easpórtáil Rathúil</translation>
</message>
<message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">Sábháladh stair an idirbhirt go rathúil chuig %1.</translation>
+ </message>
+ <message>
<source>Range:</source>
<translation type="unfinished">Raon:</translation>
</message>
@@ -3023,6 +4047,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Táille nua:</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">Rabhadh: D’fhéadfadh sé seo an táille bhreise a íoc trí aschuir athraithe a laghdú nó trí ionchuir a chur leis, nuair is gá. Féadfaidh sé aschur athraithe nua a chur leis mura bhfuil ceann ann cheana. D'fhéadfadh na hathruithe seo príobháideacht a sceitheadh.</translation>
+ </message>
+ <message>
<source>Confirm fee bump</source>
<translation type="unfinished">Dearbhaigh preab táille</translation>
</message>
@@ -3035,6 +4063,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">IBSP cóipeáilte</translation>
</message>
<message>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Cóipeáil PSBT bump táille chuig an ngearrthaisce</translation>
+ </message>
+ <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Ní féidir síniú idirbheart.</translation>
</message>
@@ -3043,8 +4075,12 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níorbh fhéidir feidhmiú idirbheart</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">sparán réamhshocraithe</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Earráid sínitheora</translation>
+ </message>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">Ní féidir an seoladh a thaispeáint</translation>
</message>
</context>
<context>
@@ -3062,6 +4098,11 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Sparán Chúltaca</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Sonraí Sparán</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Theip ar cúltacú</translation>
</message>
@@ -3093,20 +4134,84 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Tá %s truaillithe. Triail an uirlis sparán bitcoin-wallet a úsáid chun tharrtháil nó chun cúltaca a athbhunú.</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">Theip ar %s an staid snapshot -assumeutxo a bhailíochtú. Léiríonn sé seo fadhb crua-earraí, nó fabht sna bogearraí, nó droch-mhodhnú bogearraí a cheadaigh pictiúr neamhbhailí a luchtú. Mar thoradh air seo, stopfar an nód agus stopfaidh sé de úsáid a bhaint as staid ar bith a tógadh ar an seat, ag athshocrú airde an tslabhra ó%dgo%d. Ar an gcéad atosú eile, athchromfar ar an nód ag sioncronú ó %d gan úsáid a bhaint as sonraí seat. Tuairiscigh an teagmhas seo do %s lena n-áirítear conas a fuair tú an pictiúr. Fágfar an slabhrashlabhra neamhbhailí ar an diosca ar eagla go mbeadh sé ina chuidiú leis an tsaincheist ba chúis leis an earráid seo a dhiagnóisiú.</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">Iarraidh %s éisteacht ar phort %u. Meastar go bhfuil an port seo "olc" agus dá bhrí sin ní dócha go nascfaidh piaraí ar bith leis. Féach doc/p2p-bad-ports.md le haghaidh sonraí agus liosta iomlán.</translation>
+ </message>
+ <message>
+ <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
+ <translation type="unfinished">Ní féidir an sparán a íosghrádú ó leagan %igo leagan%i. Leagan sparán gan athrú.</translation>
+ </message>
+ <message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
<translation type="unfinished">Ní féidir glas a fháil ar eolaire sonraí %s. Is dócha go bhfuil %s ag rith cheana.</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">Ní féidir sparán scoilte neamh-HD a uasghrádú ó leagan%igo leagan%i gan uasghrádú chun tacú le heochrach réamh-scoilte. Úsáid leagan %i nó níl aon leagan sonraithe.</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">Ní féidir spás diosca le haghaidh %sa chur san áireamh sna blocchomhaid. Stórálfar thart ar %u GB de shonraí san eolaire seo.</translation>
+ </message>
+ <message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
<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 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">Earráid agus an sparán á lódáil. Éilíonn Sparán go n-íoslódálfar bloic, agus ní thacaíonn bogearraí faoi láthair le sparán a luchtú agus bloic á n-íoslódáil as ord nuair a úsáidtear snapshots assumeutxo. Ba cheart go mbeadh Sparán in ann luchtú go rathúil nuair a shroicheann sioncronú nód an airde %s</translation>
+ </message>
+ <message>
+ <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
+ <translation type="unfinished">Earráid agus %s á léamh! Seans go bhfuil sonraí idirbhirt in easnamh nó mícheart. Sparán athscanadh.</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
+ <translation type="unfinished">Earráid agus%s á léamh! Seans go bhfuil sonraí idirbhirt in easnamh nó mícheart. Sparán athscanadh.</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">Earráid: Tá taifead aitheantóra Dumpfile mícheart. Fuair ​​​​tú "%s", bhíothas ag súil le "%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">Earráid: Ní thacaítear leis an leagan Dumpfile. Ní thacaíonn an leagan seo de bitcoin-sparán ach le leagan 1 dumpfiles. Fuair ​​​​tú dumpfile le leagan %s</translation>
+ </message>
+ <message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">Earráid: Ní thacaíonn sparán oidhreachta ach na cineálacha seoltaí "oidhreacht", "p2sh-segwit", agus "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">Earráid: Ní féidir tuairisceoirí a tháirgeadh don sparán oidhreachta seo. Bí cinnte pasfhrása an sparán a sholáthar má tá sé criptithe.</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">Tá comhad %s ann cheana. Má tá tú cinnte gurb é seo a theastaíonn uait, bog é as an mbealach ar dtú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 neamhbhailí nó truaillithe (%s). Má chreideann tú gur fabht é seo, cuir in iúl do %s é le do thoil. Mar shruth oibre, is féidir leat an comhad (%s) a bhogadh as an mbealach (athainmnigh, bog nó scrios) chun ceann nua a chruthú ar an gcéad thús eile.</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>
<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">Le do thoil seiceáil go bhfuil dáta agus am do ríomhaire ceart! Má tá do chlog mícheart, ní oibreoidh %s i gceart.</translation>
+ <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">Níor soláthraíodh aon chomhad dumpála. Chun createfromdump a úsáid, ní mór -dumpfile=&lt;filename&gt; a sholáthar.</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">Níor soláthraíodh aon chomhad dumpála. Chun Dumpáil a úsáid, ní mór -dumpfile=&lt;filename&gt;a sholáthar.</translation>
+ </message>
+ <message>
+ <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
+ <translation type="unfinished">Níor soláthraíodh formáid comhaid sparán. Chun createfromdump a úsáid, ní mór -format=&lt;format&gt; a sholáthar.</translation>
</message>
<message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
@@ -3117,10 +4222,18 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Bearradh cumraithe faoi bhun an íosmhéid %d MiB. Úsáid uimhir níos airde le do thoil.</translation>
</message>
<message>
+ <source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
+ <translation type="unfinished">Níl an modh prúnaí ag luí le -reindex-chainstate. Úsáid lán-reindex ina ionad sin.</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">Bearradh: téann sioncrónú deireanach an sparán thar sonraí bearrtha. Ní mór duit -reindex (déan an blockchain iomlán a íoslódáil arís i gcás nód bearrtha)</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">Theip ar athainmniú '%s' -&gt; '%s'. Ba cheart duit é seo a réiteach tríd an gcomhadlann achomair neamhbhailí %s a bhogadh nó a scriosadh de láimh, nó beidh an earráid chéanna agat arís ar an gcéad tosaithe eile.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: Leagan scéime sparán sqlite anaithnid %d. Ní thacaítear ach le leagan %d</translation>
</message>
@@ -3161,6 +4274,30 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Ní féidir bloic a aithrise. Beidh ort an bunachar sonraí a atógáil ag úsáid -reindex-chainstate.</translation>
</message>
<message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">Cuireadh formáid comhaid sparán anaithnid "%s" ar fáil. Tabhair ceann de "bdb" nó "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">Leibhéal logála catagóir ar leith nach dtacaítear leis %1$s=%2$s. Bhíothas ag súil le %1$s=1:2. Catagóirí bailí: %3$s. Leibhéil loga bailí: %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">Aimsíodh formáid bhunachar sonraí chainstáit nach dtacaítear léi. Atosaigh le -reindex-chainstate. Déanfaidh sé seo an bunachar sonraí slabhrach a atógáil.</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">Sparán cruthaithe go rathúil. Tá an cineál sparán oidhreachta á dhímheas agus bainfear an tacaíocht chun sparán oidhreachta a chruthú agus a oscailt amach anseo.</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">D'éirigh leis an sparán a lódáil. Tá an cineál sparán oidhreachta á dhímheas agus bainfear an tacaíocht chun sparán oidhreachta a chruthú agus a oscailt amach anseo. Is féidir sparán oidhreachta a aistriú chuig sparán tuairisceora le sparán imirceach.</translation>
+ </message>
+ <message>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">Rabhadh: Ní mheaitseálann formáid sparán Dumpfile "%s" an fhormáid ordaithe sonraithe "%s".</translation>
+ </message>
+ <message>
<source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
<translation type="unfinished">Rabhadh: Eochracha príobháideacha braite i sparán {%s} le heochracha príobháideacha díchumasaithe</translation>
</message>
@@ -3169,6 +4306,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Rabhadh: Is cosúil nach n-aontaímid go hiomlán lenár piaraí! B’fhéidir go mbeidh ort uasghrádú a dhéanamh, nó b’fhéidir go mbeidh ar nóid eile uasghrádú.</translation>
</message>
<message>
+ <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
+ <translation type="unfinished">Teastaíonn bailíochtú sonraí finné maidir le bloic tar éis airde %d. Atosaigh le -reindex le do thoil.</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">Ní mór duit an bunachar sonraí a atógáil ag baint úsáide as -reindex chun dul ar ais go mód neamhbhearrtha. Déanfaidh sé seo an blockchain iomlán a athlódáil</translation>
</message>
@@ -3181,14 +4322,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Caithfidh -maxmempool a bheith ar a laghad %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Tharla earráid mharfach inmheánach, féach debug.log le haghaidh sonraí</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Ní féidir réiteach seoladh -%s: '%s'</translation>
</message>
<message>
+ <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
+ <translation type="unfinished">Ní féidir -forcednsseed a shocrú go fíor agus -dnsseed á shocrú go bréagach.</translation>
+ </message>
+ <message>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
<translation type="unfinished">Ní féidir -peerblockfilters a shocrú gan -blockfilterindex.</translation>
</message>
@@ -3197,6 +4338,174 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Ní féidir scríobh chuig eolaire sonraí '%s'; seiceáil ceadanna.</translation>
</message>
<message>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">Tá%s socraithe an-ard! D’fhéadfaí táillí chomh mór seo a íoc ar idirbheart amháin.</translation>
+ </message>
+ <message>
+ <source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
+ <translation type="unfinished">Ní féidir naisc ar leith a sholáthar agus tá addrman chun naisc amach a aimsiú ag an am céanna.</translation>
+ </message>
+ <message>
+ <source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
+ <translation type="unfinished">Earráid agus %s á lódáil: sparán an tsínitheora sheachtraigh á luchtú gan tacaíocht sínitheoir seachtrach a chur le chéile</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">Earráid agus %s á léamh! Léann na heochracha go léir i gceart, ach seans go bhfuil sonraí idirbhirt nó meiteashonraí seolta in easnamh nó mícheart.</translation>
+ </message>
+ <message>
+ <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Earráid: Ní féidir sonraí an leabhair seoltaí sa sparán a shainaithint mar go mbaineann siad le sparán aistrithe</translation>
+ </message>
+ <message>
+ <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
+ <translation type="unfinished">Earráid: Tuairisceoirí dúblacha a cruthaíodh le linn imirce. Seans go bhfuil do sparán truaillithe.</translation>
+ </message>
+ <message>
+ <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Earráid: Ní féidir idirbheart %s sa sparán a aithint gur le sparán aistrithe é</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Theip ar tháillí tuairte a ríomh, toisc go mbraitheann UTXOanna neamhdhearbhaithe ar bhraisle ollmhór idirbheart neamhdheimhnithe.</translation>
+ </message>
+ <message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Theip ar bhaint an tsainstáit seat seat (%s). Bain de láimh é roimh atosú.
+</translation>
+ </message>
+ <message>
+ <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
+ <translation type="unfinished">Theip ar an gcomhad peers.dat neamhbhailí a athainmniú. Bog nó scrios é agus bain triail eile as.</translation>
+ </message>
+ <message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Theip ar mheastachán na dtáillí. Tá fallbackfee díchumasaithe. Fan cúpla bloc nó cumasaigh %s.</translation>
+ </message>
+ <message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Theip ar chomhad blocála a shruthlú go diosca. Is dócha gur earráid I/O é seo.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Theip ar shruthlú an chomhaid chealaigh go diosca. Is dócha gur earráid I/O é seo.</translation>
+ </message>
+ <message>
+ <source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
+ <translation type="unfinished">Roghanna neamh-chomhoiriúnacha: -dnsseed=1 sonraíodh go sainráite, ach cuireann -onlynet cosc ​​ar naisc le 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">Méid neamhbhailí le haghaidh %s=&lt;amount&gt;: '%s' (ní mór an táille sealaíochta nóiméad de %s a bheith ann ar a laghad chun idirbhearta bhfostú a chosc)</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Tá an t-uasmheáchan idirbhirt níos lú ná meáchan idirbhirt gan ionchuir</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Tá meáchan uasta idirbheart ró-íseal, ní féidir freastal ar aschur athraithe</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
+ <translation type="unfinished">Naisc amach teoranta do CJDNS (-onlynet=cjdns) ach ní chuirtear -cjdnsreachable ar fáil</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">Tá naisc amach teoranta do Tor (-onlynet=onion) ach tá cosc ​​sainráite ar an seachfhreastalaí chun líonra Tor a bhaint amach: -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">Naisc amach teoranta do Tor (-onlynet=onion) ach ní thugtar an seachfhreastalaí chun líonra Tor a bhaint amach: ní thugtar aon seachfhreastalaí, -oinniún nó -listenonion</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
+ <translation type="unfinished">Tá naisc amach teoranta do i2p (-onlynet=i2p) ach ní chuirtear -i2psam ar fáil</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Theip ar athainmniú '%s' -&gt; '%s'. Ní féidir eolaire leveldb an tslabhra cúlra a ghlanadh.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Sáraíonn meascán na n-ionchur réamhroghnaithe agus an rogha ionchuir uathoibríoch sparán an t-uasmheáchan idirbhirt. Bain triail as méid níos lú a sheoladh nó UTXO do sparán a chomhdhlúthú de láimh</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">Sáraíonn méid an ionchuir an t-uasmheáchan. Bain triail as méid níos lú a sheoladh nó UTXO do sparán a chomhdhlúthú de láimh</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">Ní chlúdaíonn méid iomlán na monaí réamhroghnaithe sprioc an idirbhirt. Ceadaigh le do thoil ionchuir eile a roghnú go huathoibríoch nó cuir níos mó bonn san áireamh de láimh</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">Éilíonn an t-idirbheart ceann scríbe amháin de luach neamh-0, táille neamh-0, nó ionchur réamhroghnaithe</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">Theip ar bhailíochtú a dhéanamh ar achomair UTXO. Atosaigh chun gnáthíoslódáil na mbloc tosaigh a atosú, nó bain triail as pictiúr eile a lódáil.</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">Tá UTXOanna neamhdheimhnithe ar fáil, ach cruthaítear slabhra idirbheart a ndiúltóidh an mempool dóibh má dhéantar iad a chaitheamh</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">Fuarthas iontráil oidhreachta gan choinne sa sparán tuairisceora. Sparán %s á lódáil
+
+Seans gur cuireadh isteach ar an sparán nó gur cruthaíodh é le hintinn mhailíseach.
+</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">Tuairisceoir neamhaitheanta aimsithe. Sparán %s á lódáil
+
+Seans gur cruthaíodh an sparán ar leagan níos nuaí.
+Bain triail as an leagan bogearraí is déanaí a rith.
+</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">Is cosúil go bhfuil dáta agus am do ríomhaire níos mó ná %d nóiméad as sioncronú leis an líonra, seans go dteipfidh ar chomhdhearcadh dá bharr. Tar éis duit clog do ríomhaire a dheimhniú, níor cheart go mbeadh an teachtaireacht seo le feiceáil a thuilleadh nuair a atosóidh tú do nód. Gan atosú, ba cheart go stopfadh sé ag taispeáint go huathoibríoch tar éis duit nasc a dhéanamh le líon imleor piaraí nua amach, a d'fhéadfadh roinnt ama a ghlacadh. Is féidir leat an réimse `timeoffset` de na modhanna RPC `getpeerinfo` agus `getnetworkinfo` a iniúchadh chun tuilleadh faisnéise a fháil.</translation>
+ </message>
+ <message>
+ <source>
+Unable to cleanup failed migration</source>
+ <translation type="unfinished">
+Ní féidir an t-imirce theip a ghlanadh</translation>
+ </message>
+ <message>
+ <source>
+Unable to restore backup of wallet.</source>
+ <translation type="unfinished">
+Ní féidir cúltaca an sparán a chur ar ais.</translation>
+ </message>
+ <message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">ní féidir ceangaltán bán a úsáid ach amháin le haghaidh naisc isteach (ritheadh ​​​​"amach")</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Tharla earráid mharfach inmheánach, féach debug.log le haghaidh sonraí:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Ní bhfuarthas sonraí Assumeutxo don bhlocshlabhra '%s' a tugadh.</translation>
+ </message>
+ <message>
+ <source>Block verification was interrupted</source>
+ <translation type="unfinished">Cuireadh isteach ar an bhfíorú blocála</translation>
+ </message>
+ <message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
<translation type="unfinished">Ní chuirtear socrú cumraíochta do %s i bhfeidhm ach ar líonra %s nuair atá sé sa rannán [%s].</translation>
</message>
@@ -3205,6 +4514,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Cóipcheart (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bloc truaillithe aimsithe a léirigh teip crua-earraí féideartha.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Braitheadh bunachar sonraí bloic truaillithe</translation>
</message>
@@ -3229,6 +4542,22 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Lódáil déanta</translation>
</message>
<message>
+ <source>Dump file %s does not exist.</source>
+ <translation type="unfinished">Níl an comhad dumpála %s ann.</translation>
+ </message>
+ <message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Teip seiceála sláintíochta cripteagrafaíochta cuar éilipseach. Tá %s ag múchadh.</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Earráid agus db txn á dhéanamh chun idirbhearta sparán a bhaint</translation>
+ </message>
+ <message>
+ <source>Error creating %s</source>
+ <translation type="unfinished">Earráid cruthaithe %s</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation type="unfinished">Earráid ag túsú bunachar sonraí bloic</translation>
</message>
@@ -3261,30 +4590,162 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Earráid ag oscailt bunachar sonraí bloic</translation>
</message>
<message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Earráid agus an comhad cumraíochta á léamh: %s</translation>
+ </message>
+ <message>
<source>Error reading from database, shutting down.</source>
<translation type="unfinished">Earráid ag léamh ón mbunachar sonraí, ag múchadh.</translation>
</message>
<message>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">Earráid agus an chéad taifead eile á léamh ón mbunachar sonraí sparán</translation>
+ </message>
+ <message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Earráid agus db txn á thosú chun idirbhearta sparán a bhaint</translation>
+ </message>
+ <message>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Earráid: Ní féidir an ceann scríbe a bhaint as an scriptpubkey ginte</translation>
+ </message>
+ <message>
+ <source>Error: Couldn't create cursor into database</source>
+ <translation type="unfinished">Earráid: Níorbh fhéidir an cúrsóir a chruthú sa bhunachar sonraí</translation>
+ </message>
+ <message>
<source>Error: Disk space is low for %s</source>
<translation type="unfinished">Earráid: Tá spás ar diosca íseal do %s</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">Earráid: Ní hionann seiceála Dumpfile. Ríomh %s, bhíothas ag súil le %s</translation>
+ </message>
+ <message>
+ <source>Error: Failed to create new watchonly wallet</source>
+ <translation type="unfinished">Earráid: Theip ar chruthú sparán faire amháin nua</translation>
+ </message>
+ <message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">Earráid: Fuair ​​​​tú eochair nach heicsidheachúlach í: %s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">Earráid: Fuair ​​tú luach nach heicsidheachúlach é: %s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">Earráid: Rith keypool amach, glaoigh ar keypoolrefill ar dtús</translation>
</message>
<message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">Earráid: Seiceáil in easnamh</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">Earráid: Níl seoladh %s ar fáil.</translation>
+ </message>
+ <message>
+ <source>Error: This wallet already uses SQLite</source>
+ <translation type="unfinished">Earráid: Úsáideann an sparán seo SQLite cheana féin</translation>
+ </message>
+ <message>
+ <source>Error: This wallet is already a descriptor wallet</source>
+ <translation type="unfinished">Earráid: Is sparán tuairisceora é an sparán seo cheana féin</translation>
+ </message>
+ <message>
+ <source>Error: Unable to begin reading all records in the database</source>
+ <translation type="unfinished">Earráid: Ní féidir tosú ag léamh gach taifead sa bhunachar sonraí</translation>
+ </message>
+ <message>
+ <source>Error: Unable to make a backup of your wallet</source>
+ <translation type="unfinished">Earráid: Ní féidir cúltaca a dhéanamh de do sparán</translation>
+ </message>
+ <message>
+ <source>Error: Unable to parse version %u as a uint32_t</source>
+ <translation type="unfinished">Earráid: Ní féidir leagan%u a pharsáil mar uint32_t</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read all records in the database</source>
+ <translation type="unfinished">Earráid: Ní féidir gach taifead sa bhunachar sonraí a léamh</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Earráid: Ní féidir an taifead aimsitheoir bloc is fearr sa sparán a léamh</translation>
+ </message>
+ <message>
+ <source>Error: Unable to remove watchonly address book data</source>
+ <translation type="unfinished">Earráid: Ní féidir sonraí leabhar seoltaí faire amháin a bhaint</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write record to new wallet</source>
+ <translation type="unfinished">Earráid: Ní féidir taifead a scríobh chuig an sparán nua</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Earráid: Ní féidir an taifead aimsitheoir bloc is fearr ar an sparán intuaslagtha a scríobh</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Earráid: Ní féidir an taifead aimsitheoir bloc is fearr le sparán faire amháin a scríobh</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Earráid: theip ar chóip leabhar seoltaí do sparán %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Earráid: ní féidir idirbheart bunachar sonraí a chur i gcrích le haghaidh sparán %s</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Theip ar nascadh an bhloc is fearr (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Theip ar dhínascadh an bhloc.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Theip ar éisteacht ar aon phort. Úsáid -listen=0 más é seo atá uait.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Theip ar léamh an bhloc.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Theip athscanadh ar an sparán le linn túsúchán</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Theip ar thús a chur leis na hinnéacsanna, dúnadh.</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Theip ar fhíorú an mbunachar sonraí</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Theip ar scríobh an bhloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Theip ar scríobh chuig an mbunachar sonraí innéacs bloc.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Theip ar scríobh chuig an mbunachar sonraí boinn.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Theip ar scríobh sonraí cealaigh.</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Teip ag baint an idirbhirt: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Tá an ráta táillí (%s) níos ísle ná an socrú íosta rátaí táille (%s).</translation>
</message>
@@ -3293,6 +4754,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Neamhaird ar sparán dhúbailt %s.</translation>
</message>
<message>
+ <source>Importing…</source>
+ <translation type="unfinished">à iompórtáil…</translation>
+ </message>
+ <message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
<translation type="unfinished">Bloc geineasas mícheart nó ní aimsithe. datadir mícheart don líonra?</translation>
</message>
@@ -3301,10 +4766,22 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Theip ar seiceáil slánchiall túsúchán. Tá %s ag múchadh.</translation>
</message>
<message>
+ <source>Input not found or already spent</source>
+ <translation type="unfinished">Ionchur gan aimsiú nó caite cheana féin</translation>
+ </message>
+ <message>
+ <source>Insufficient dbcache for block verification</source>
+ <translation type="unfinished">Dbcache neamhleor le haghaidh fíorú blocála</translation>
+ </message>
+ <message>
<source>Insufficient funds</source>
<translation type="unfinished">Neamhleor ciste</translation>
</message>
<message>
+ <source>Invalid -i2psam address or hostname: '%s'</source>
+ <translation type="unfinished">Seoladh neamhbhailí -i2psam nó óstainm: '%s'</translation>
+ </message>
+ <message>
<source>Invalid -onion address or hostname: '%s'</source>
<translation type="unfinished">Seoladh neamhbhailí -onion nó óstainm: '%s'</translation>
</message>
@@ -3317,6 +4794,14 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Cead neamhbhailí P2P: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Méid neamhbhailí le haghaidh %s=&lt;amount&gt;: '%s' (ar a laghad %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Méid neamhbhailí le haghaidh %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Suim neamhbhailí do -%s=&lt;amount&gt;: '%s'</translation>
</message>
@@ -3325,14 +4810,70 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Mascghréas neamhbhailí sonraithe sa geal-liosta: '%s'</translation>
</message>
<message>
+ <source>Invalid port specified in %s: '%s'</source>
+ <translation type="unfinished">Port neamhbhailí sonraithe i %s: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid pre-selected input %s</source>
+ <translation type="unfinished">Ionchur réamhroghnaithe %s neamhbhailí</translation>
+ </message>
+ <message>
+ <source>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">Theip ar éisteacht le naisc isteach (éisteacht ar ais earráid %s)</translation>
+ </message>
+ <message>
+ <source>Loading P2P addresses…</source>
+ <translation type="unfinished">Seoltaí P2P á lódáil…</translation>
+ </message>
+ <message>
+ <source>Loading banlist…</source>
+ <translation type="unfinished">Liosta toirmeasc á lódáil…</translation>
+ </message>
+ <message>
+ <source>Loading block index…</source>
+ <translation type="unfinished">Innéacs bloc á lódáil…</translation>
+ </message>
+ <message>
+ <source>Loading wallet…</source>
+ <translation type="unfinished">Sparán á lódáil…</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Caithfidh uasmheáchan an idirbhirt a bheith idir %d agus %d</translation>
+ </message>
+ <message>
+ <source>Missing amount</source>
+ <translation type="unfinished">Méid ar iarraidh</translation>
+ </message>
+ <message>
+ <source>Missing solving data for estimating transaction size</source>
+ <translation type="unfinished">Sonraí réitigh ar iarraidh le haghaidh meastachán a dhéanamh ar mhéid an idirbhirt</translation>
+ </message>
+ <message>
<source>Need to specify a port with -whitebind: '%s'</source>
<translation type="unfinished">Is gá port a shainiú le -whitebind: '%s'</translation>
</message>
<message>
+ <source>No addresses available</source>
+ <translation type="unfinished">Níl aon seoltaí ar fáil</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation type="unfinished">Níl dóthain tuairisceoirí comhaid ar fáil.</translation>
</message>
<message>
+ <source>Not found pre-selected input %s</source>
+ <translation type="unfinished">Níor aimsíodh ionchur réamhroghnaithe %s</translation>
+ </message>
+ <message>
+ <source>Not solvable pre-selected input %s</source>
+ <translation type="unfinished">Ní féidir ionchur réamhroghnaithe %s a réiteach</translation>
+ </message>
+ <message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Níor socraíodh ach treo, gan cead: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Ní féidir Bearradh a bheidh cumraithe le luach diúltach.</translation>
</message>
@@ -3341,10 +4882,22 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Tá an mód bearrtha neamh-chomhoiriúnach le -txindex.</translation>
</message>
<message>
+ <source>Pruning blockstore…</source>
+ <translation type="unfinished">Blocsiopa á bhearradh…</translation>
+ </message>
+ <message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
<translation type="unfinished">Laghdú -maxconnections ó %d go %d, mar gheall ar shrianadh an chórais.</translation>
</message>
<message>
+ <source>Replaying blocks…</source>
+ <translation type="unfinished">Bloic á n-athsheinn…</translation>
+ </message>
+ <message>
+ <source>Rescanning…</source>
+ <translation type="unfinished">à athscanadh…</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
<translation type="unfinished">SQLiteDatabase: Theip ar rith ráiteas chun an bunachar sonraí a fhíorú: %s</translation>
</message>
@@ -3365,6 +4918,18 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Ní aithnítear rannán [%s].</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Níor thug an sínitheoir macalla don seoladh</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">D'fhreagair an sínitheoir seoladh %s gan choinne</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Earráid faighte ag sínitheoir: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Theip ar síniú idirbheart</translation>
</message>
@@ -3385,10 +4950,34 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níl eolaire bloic shonraithe "%s" ann.</translation>
</message>
<message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Níl comhadlann sonraí sonraithe "%s" ann.</translation>
+ </message>
+ <message>
+ <source>Starting network threads…</source>
+ <translation type="unfinished">Snáitheanna líonra á dtosú…</translation>
+ </message>
+ <message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Earráid chórais agus é á shruthlú: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Earráid chórais agus blocchomhad seachtrach á luchtú: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Earráid chórais agus an bloc á shábháil ar an diosca: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Tá an cód foinseach ar fáil ó %s.</translation>
</message>
<message>
+ <source>The specified config file %s does not exist</source>
+ <translation type="unfinished">Níl an comhad cumraíochta sonraithe %s ann</translation>
+ </message>
+ <message>
<source>The transaction amount is too small to pay the fee</source>
<translation type="unfinished">Tá suim an idirbhirt ró-bheag chun an táille a íoc</translation>
</message>
@@ -3397,6 +4986,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Seachnóidh an sparán níos lú ná an táille athsheachadán íosta a íoc.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Níl aon Bhainisteoir ScriptPubKey ann don seoladh seo</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Is bogearraí turgnamhacha é seo.</translation>
</message>
@@ -3409,6 +5002,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Seo an táille idirbhirt a íocfaidh tú má sheolann tú idirbheart.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Ní bhaineann an t-idirbheart %s leis an sparán seo</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Méid an idirbhirt ró-bheag</translation>
</message>
@@ -3417,10 +5014,18 @@ 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 change output index out of range</source>
+ <translation type="unfinished">Innéacs aschuir athraithe idirbhirt as raon</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>
<message>
+ <source>Transaction needs a change address, but we can't generate it.</source>
+ <translation type="unfinished">Teastaíonn seoladh athraithe ón idirbheart, ach ní féidir linn é a ghiniúint.</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation type="unfinished">Idirbheart ró-mhór</translation>
</message>
@@ -3437,6 +5042,10 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níorbh fhéidir cruthú comhad PID '%s': %s</translation>
</message>
<message>
+ <source>Unable to find UTXO for external input</source>
+ <translation type="unfinished">Ní féidir UTXO a aimsiú le haghaidh ionchur seachtrach</translation>
+ </message>
+ <message>
<source>Unable to generate initial keys</source>
<translation type="unfinished">Ní féidir eochracha tosaigh a ghiniúint</translation>
</message>
@@ -3445,10 +5054,22 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Ní féidir eochracha a ghiniúint</translation>
</message>
<message>
+ <source>Unable to open %s for writing</source>
+ <translation type="unfinished">Ní féidir %s a oscailt chun scríobh</translation>
+ </message>
+ <message>
+ <source>Unable to parse -maxuploadtarget: '%s'</source>
+ <translation type="unfinished">Ní féidir a pharsáil -maxuploadtarget: '%s'</translation>
+ </message>
+ <message>
<source>Unable to start HTTP server. See debug log for details.</source>
<translation type="unfinished">Ní féidir freastalaí HTTP a thosú. Féach loga dífhabhtúcháin le tuilleadh sonraí.</translation>
</message>
<message>
+ <source>Unable to unload the wallet before migrating</source>
+ <translation type="unfinished">Ní féidir an sparán a dhíluchtú roimh aistriú</translation>
+ </message>
+ <message>
<source>Unknown -blockfilterindex value %s.</source>
<translation type="unfinished">Luach -blockfilterindex %s anaithnid.</translation>
</message>
@@ -3465,16 +5086,60 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Líonra anaithnid sonraithe san -onlynet: '%s'</translation>
</message>
<message>
+ <source>Unknown new rules activated (versionbit %i)</source>
+ <translation type="unfinished">Rialacha nua anaithnid curtha i ngníomh (leagan giotán %ii)</translation>
+ </message>
+ <message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Rogha neamhaitheanta "%s" curtha ar fáil i -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Leibhéal logála domhanda nach dtacaítear leis %s=%s. Luachanna bailí: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Theip ar chruthú comhaid sparán: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">ní thacaítear le acceptstalefeeestimates ar slabhra %s.</translation>
+ </message>
+ <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Catagóir logáil gan tacaíocht %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Earráid: Níorbh fhéidir watch amháin tx %s a chur le sparán faire amháin</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Earráid: Níorbh fhéidir idirbhearta faire amháin a scriosadh.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Tá carachtair neamhshábháilte i nóta tráchta (%s) Gníomhaire Úsáideora.</translation>
</message>
<message>
+ <source>Verifying blocks…</source>
+ <translation type="unfinished">Bloic á bhfíorú…</translation>
+ </message>
+ <message>
+ <source>Verifying wallet(s)…</source>
+ <translation type="unfinished">Sparán(aí) á fhíorú…</translation>
+ </message>
+ <message>
<source>Wallet needed to be rewritten: restart %s to complete</source>
<translation type="unfinished">Ba ghá an sparán a athscríobh: atosaigh %s chun críochnú</translation>
</message>
- </context>
+ <message>
+ <source>Settings file could not be read</source>
+ <translation type="unfinished">Níorbh fhéidir an comhad socruithe a léamh</translation>
+ </message>
+ <message>
+ <source>Settings file could not be written</source>
+ <translation type="unfinished">Níorbh fhéidir an comhad socruithe a scríobh</translation>
+ </message>
+</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_gl.ts b/src/qt/locale/bitcoin_gl.ts
index df9362d664..53e038ecd0 100644
--- a/src/qt/locale/bitcoin_gl.ts
+++ b/src/qt/locale/bitcoin_gl.ts
@@ -84,11 +84,24 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Exportar Lista de Enderezos</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">Ficheiro separado por comas</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">Houbo un erro tentando gardar a lista de enderezos en %1. Por favor proba de novo.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Enviando enderezos - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recibindo enderezos - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exportación falida</translation>
</message>
@@ -171,6 +184,10 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Introduce a frase contrasinal anterior mais a nova frase contrasinal para a carteira.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</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">Recorda que encriptar a tua carteira non protexe completamente que os teus bitcoins poidan ser roubados por malware que afecte ó teu computador.</translation>
</message>
@@ -211,10 +228,22 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">O contrasinal introducido para a desencriptación do moedeiro foi incorrecto.</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">A frase de acceso introducida para o descifrado da carteira é incorrecta. Contén un carácter nulo (é dicir, un byte cero). Se a frase de paso se estableceu cunha versión deste software anterior á 25.0, téntao de novo con só os caracteres ata, pero sen incluír, o primeiro carácter nulo. Se se realiza correctamente, establece unha nova frase de acceso para evitar este problema no futuro.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Cambiouse con éxito o contrasinal do moedeiro.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Produciuse un erro no cambio de frase de contrasinal</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">A contrasinal antiga introducida para o descifrado da carteira é incorrecta. Contén un carácter nulo (é dicir, un byte cero). Se a frase de paso se estableceu cunha versión deste software anterior á 25.0, téntao de novo con só os caracteres ata, pero sen incluír, o primeiro carácter nulo.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Aviso: O Bloqueo de Maiúsculas está activo!</translation>
</message>
@@ -233,13 +262,33 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">O ficheiro de configuración %1 pode estar danado ou non válido.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Excepción de fuga</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Produciuse un erro fatal. %1 xa non pode continuar con seguridade e sairá.</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">Erro interno</translation>
</message>
- </context>
+ <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">Produciuse un erro interno. %1 tentará continuar con seguridade. Este é un erro inesperado que se pode informar como se describe a continuación.</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 aínda non saíu con seguridade...</translation>
+ </message>
+ <message>
<source>unknown</source>
<translation type="unfinished">descoñecido</translation>
</message>
@@ -289,7 +338,11 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">moedeiro por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -382,10 +435,22 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">&amp;Opcións...</translation>
</message>
<message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Cifrar carteira...</translation>
+ </message>
+ <message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">Encriptar as claves privadas que pertencen ao teu moedeiro</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Copia de seguranza da carteira...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Cambiar a frase de contrasinal...</translation>
+ </message>
+ <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">Asina mensaxes cos teus enderezos Bitcoin para probar que che pertencen</translation>
</message>
@@ -501,10 +566,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Mostra a %1 mensaxe de axuda para obter unha lista cas posibles opcións de línea de comando de Bitcoin </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">moedeiro por defecto</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Non hai moedeiros dispoñíbeis</translation>
</message>
@@ -736,10 +797,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">moedeiro por defecto</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir Moedeiro</translation>
@@ -1595,10 +1652,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Por favor comproba a dirección e proba de novo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">A dirección introducida non se refire a ninguna clave.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Cancelouse o desbloqueo do moedeiro.</translation>
</message>
@@ -1876,6 +1929,11 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Exportar Historial de Transaccións</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">Ficheiro separado por comas</translation>
+ </message>
+ <message>
<source>Confirmed</source>
<translation type="unfinished">Confirmado</translation>
</message>
@@ -1937,11 +1995,7 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<source>Send Coins</source>
<translation type="unfinished">Moedas Enviadas</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">moedeiro por defecto</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_gl_ES.ts b/src/qt/locale/bitcoin_gl_ES.ts
index 854aebfc6f..47951fa6f2 100644
--- a/src/qt/locale/bitcoin_gl_ES.ts
+++ b/src/qt/locale/bitcoin_gl_ES.ts
@@ -2,10 +2,6 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Fai Click co botón dereito para editar o enderezo ou etiqueta</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation type="unfinished">Crea un novo enderezo</translation>
</message>
@@ -84,11 +80,24 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Exporta a Lista de Enderezos</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">Ficheiro separado por comas</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">Houbo un erro tentando gardar a lista de enderezos en %1. Por favor proba de novo.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Enviando enderezos - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recibindo enderezos - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exportación Fallida</translation>
</message>
@@ -167,6 +176,10 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Introduce a frase contrasinal anterior mais a nova frase contrasinal para a carteira.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</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">Recorda que encriptar a tua carteira non protexe completamente que os teus bitcoins poidan ser roubados por malware que afecte ó teu computador.</translation>
</message>
@@ -207,10 +220,22 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">A frase contrasinal introducida para o desencriptamento da carteira é incorrecto.</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">A frase de acceso introducida para o descifrado da carteira é incorrecta. Contén un carácter nulo (é dicir, un byte cero). Se a frase de paso se estableceu cunha versión deste software anterior á 25.0, téntao de novo con só os caracteres ata, pero sen incluír, o primeiro carácter nulo. Se se realiza correctamente, establece unha nova frase de acceso para evitar este problema no futuro.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">A frase contrasinal da carteira mudouse correctamente.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Produciuse un erro no cambio de frase de contrasinal</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">Produciuse un erro non cambio de frase de contrasinal</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Aviso: ¡A tecla Bloq. Mayús está activada!</translation>
</message>
@@ -229,13 +254,33 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">O ficheiro de configuración %1 pode estar danado ou non válido.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Excepción de fuga</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Produciuse un erro fatal. %1 xa non pode continuar con seguridade e sairá.</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">Erro interno</translation>
</message>
- </context>
+ <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">Produciuse un erro interno. %1 tentará continuar con seguridade. Este é un erro inesperado que se pode informar como se describe a continuación.</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 aínda non saíu con seguridade...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Cantidade</translation>
</message>
@@ -281,7 +326,11 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Carteira por defecto</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -374,10 +423,22 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">&amp;Opcións...</translation>
</message>
<message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Cifrar carteira...</translation>
+ </message>
+ <message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">Encripta as claves privadas que pertencen á túa carteira</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Copia de seguranza da carteira...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Cambiar a frase de contrasinal...</translation>
+ </message>
+ <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">Asina mensaxes cos teus enderezos de Bitcoin para probar que che pertencen</translation>
</message>
@@ -489,10 +550,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Mostra a %1 mensaxe de axuda para obter unha lista cas posibles opcións de línea de comando de Bitcoin </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Carteira por defecto</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Non hai carteiras dispoñibles</translation>
</message>
@@ -724,10 +781,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Carteira por defecto</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir carteira</translation>
@@ -1061,6 +1114,11 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">&amp;Copiar enderezo</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">Ficheiro separado por comas</translation>
+ </message>
+ <message>
<source>Confirmed</source>
<translation type="unfinished">Confirmada</translation>
</message>
@@ -1089,13 +1147,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Carteira por defecto</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_gu.ts b/src/qt/locale/bitcoin_gu.ts
index 54f2cd1741..146b9e2e24 100644
--- a/src/qt/locale/bitcoin_gu.ts
+++ b/src/qt/locale/bitcoin_gu.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">નવà«àª‚</translation>
+ <translation type="unfinished">&amp; નવà«àª‚</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -94,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>
@@ -168,21 +176,167 @@ Signing is only possible with addresses of the type 'legacy'.</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;/2&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>Continue</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>
- </context>
+ <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>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>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation type="unfinished">આઈપી/નેટમાસà«àª• </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>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>
+ <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">àªàª• જીવલેણ ભૂલ આવી. તપાસો કે સેટિંગà«àª¸ ફાઇલ લખી શકાય તેવી છે, અથવા -nosettings સાથે ચલાવવાનો પà«àª°àª¯àª¾àª¸ કરો.</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>
+ <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">Bitcoin સરનામà«àª‚ દાખલ કરો (દા.ત. %1 )</translation>
+ </message>
+ <message>
+ <source>Unroutable</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>
@@ -192,25 +346,58 @@ Signing is only possible with addresses of the type 'legacy'.</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>None</source>
+ <translation type="unfinished">કોઈ નહિ</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">ઉપલબà«àª§ નથી</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>1%n સેકનà«àª¡</numerusform>
+ <numerusform>%n સેકનà«àª¡à«‹</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>1%n મિનિટ</numerusform>
+ <numerusform>1%n મિનિટો</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>1%n કલાક</numerusform>
+ <numerusform>%n કલાકો</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -234,72 +421,1005 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">મૂળભૂત વૉલેટ</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">બહાર નીકળો</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">&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">&amp;ઘટાડો</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;મોકલો</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;પાસફà«àª°à«‡àª &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">સંદેશાઓની ખાતરી કરવા માટે કે તેઓ નિરà«àª¦àª¿àª·à«àªŸ 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">ખોલો&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>
+ </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">
- <numerusform />
- <numerusform />
+ <numerusform>ટà«àª°àª¾àª¨à«àªà«‡àª•à«àª¶àª¨ ઇતિહાસના પà«àª°à«‹àª¸à«‡àª¸à«àª¡ 1%n બà«àª²à«‹àª•(ઓ)</numerusform>
+ <numerusform>ટà«àª°àª¾àª¨à«àªà«‡àª•à«àª¶àª¨ ઇતિહાસના પà«àª°à«‹àª¸à«‡àª¸à«àª¡ %nબà«àª²à«‹àª•(ઓ)</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>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">આંશિક રીતે સહી કરેલ બિટકોઈન ટà«àª°àª¾àª¨à«àªà«‡àª•à«àª¶àª¨ લોડ કરો</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">&amp;કà«àª²àª¿àªªàª¬à«‹àª°à«àª¡ માંથી PSBT લોડ કરો...</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>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>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</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>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>1%n બિટકોઈન નેટવરà«àª• સાથે સકà«àª°àª¿àª¯ જોડાણ(ઓ).</numerusform>
+ <numerusform>%n બિટકોઈન નેટવરà«àª• સાથે સકà«àª°àª¿àª¯ જોડાણ(ઓ).</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">વધૠકà«àª°àª¿àª¯àª¾àª“ માટે કà«àª²àª¿àª• કરો.</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 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>
+ <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;લેબલ</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">નકલ &amp;રકમ</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;ક</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">બિનખરà«àªšàª¿àª¤ &amp;અનલૉક</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">નકલ જથà«àª¥à«‹</translation>
+ </message>
+ <message>
+ <source>Copy fee</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>Copy change</source>
+ <translation type="unfinished">ફેરફારની નકલ કરો</translation>
+ </message>
+ <message>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1લોક કરેલ)</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation type="unfinished">ઇનપà«àªŸ દીઠ +/-%1 સતોશી(ઓ) બદલાઈ શકે છે.</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>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>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">પાકીટને ખૂબ લાંબા સમય સà«àª§à«€ બંધ કરવાથી જો કાપણી સકà«àª·àª® હોય તો સમગà«àª° સાંકળને ફરીથી સમનà«àªµàª¯àª¿àª¤ કરવી પડી શકે છે.</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>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>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 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>
+ <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>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;સરનામà«àª‚</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>
+ <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>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 />
- <numerusform />
+ <numerusform>1%n GB ની જગà«àª¯àª¾ ઉપલબà«àª§ છે</numerusform>
+ <numerusform>%n GB ની જગà«àª¯àª¾ ઉપલબà«àª§ છે</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>(1%n GB ની જરૂર છે)</numerusform>
+ <numerusform>(%n GB ની જરૂર છે)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>(સંપૂરà«àª£ સાંકળ માટે 1%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 />
- <numerusform />
+ <numerusform>(બૅકઅપ 1%n દિવસ(ઓ) જૂના પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤ કરવા માટે પૂરતà«àª‚)</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>
@@ -307,27 +1427,781 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Welcome to %1.</source>
<translation type="unfinished">સà«àªµàª¾àª—ત છે %1.</translation>
</message>
- </context>
+ <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> 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">આ પà«àª°àª¾àª°àª‚ભિક સિંકà«àª°àª¨àª¾àª‡àªà«‡àª¶àª¨ ખૂબ જ માગણી કરે છે, અને તમારા કમà«àªªà«àª¯à«àªŸàª° સાથેની હારà«àª¡àªµà«‡àª° સમસà«àª¯àª¾àª“નો પરà«àª¦àª¾àª«àª¾àª¶ કરી શકે છે જે અગાઉ કોઈનà«àª‚ ધà«àª¯àª¾àª¨ ગયà«àª‚ ન હતà«àª‚. દરેક વખતે જà«àª¯àª¾àª°à«‡ તમે ચાલૠકરો %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સંપૂરà«àª£ ડાઉનલોડ અને પà«àª°àª•à«àª°àª¿àª¯àª¾ કરવાનà«àª‚ શરૂ કરશે%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>
+ <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>
- </context>
+ <message>
+ <source>Esc</source>
+ <translation type="unfinished">Esc (બહાર)</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;મà«àª–à«àª¯</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;પà«àª°àª¾àª°àª‚ભ કરો</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;ડેટાબેઠકેશનà«àª‚ કદ</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">સà«àª•à«àª°àª¿àªªà«àªŸ અને ચકાસણી દોરિયોની સંખà«àª¯àª¾</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>
+ <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>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation type="unfinished">પૂરા પાડવામાં આવેલ ડિફોલà«àªŸ SOCKS5 પà«àª°à«‹àª•à«àª¸à«€àª¨à«‹ ઉપયોગ આ નેટવરà«àª• પà«àª°àª•àª¾àª° દà«àªµàª¾àª°àª¾ સાથીદારો સà«àª§à«€ પહોંચવા માટે થાય છે કે કેમ તે બતાવે છે.</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">જà«àª¯àª¾àª°à«‡ વિનà«àª¡à«‹ બંધ હોય તà«àª¯àª¾àª°à«‡ àªàªªà«àª²àª¿àª•à«‡àª¶àª¨àª®àª¾àª‚થી બહાર નીકળવાને બદલે નાનà«àª‚ કરો. જà«àª¯àª¾àª°à«‡ આ વિકલà«àªª સકà«àª·àª® હશે, તà«àª¯àª¾àª°à«‡ મેનà«àª®àª¾àª‚ બહાર નીકળો પસંદ કરà«àª¯àª¾ પછી જ àªàªªà«àª²àª¿àª•à«‡àª¶àª¨ બંધ થશે.</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>
+ </message>
+ <message>
+ <source>Open Configuration File</source>
+ <translation type="unfinished">રૂપરેખાંકન ફાઇલ ખોલો</translation>
+ </message>
+ <message>
+ <source>Reset all client options to default.</source>
+ <translation type="unfinished">બધા કà«àª²àª¾àª¯àª‚ટ વિકલà«àªªà«‹àª¨à«‡ ડિફોલà«àªŸ પર ફરીથી સેટ કરો.</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation type="unfinished">&amp;રીસેટ વિકલà«àªªà«‹</translation>
+ </message>
+ <message>
+ <source>&amp;Network</source>
+ <translation type="unfinished">&amp;નેટવરà«àª•</translation>
+ </message>
+ <message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">સà«àªŸà«‹àª°à«‡àªœàª¨à«‡ કાપો અને અવરોધિત કરો</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain.</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">મહતà«àª¤àª® ડેટાબેઠકેશ કદ. àªàª• મોટી કેશ àªàª¡àªªà«€ સમનà«àªµàª¯àª¨àª®àª¾àª‚ યોગદાન આપી શકે છે, જે પછી મોટાભાગના ઉપયોગના કેસોમાં લાભ ઓછો ઉચà«àªšàª¾àª°àªµàª¾àª®àª¾àª‚ આવે છે. કેશનà«àª‚ કદ ઘટાડવાથી મેમરીનો વપરાશ ઘટશે. આ કેશ માટે નહિ વપરાયેલ મેમà«àªªà«‚લ મેમરી શેર કરવામાં આવી છે.</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>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">વૉલેટ</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>
+ </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>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">સિકà«àª•à«‹ અને નિયંતà«àª°àª£ સà«àªµàª¿àª§àª¾àª“ સકà«àª·àª® કરો</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">જો તમે અપà«àª°àª®àª¾àª£àª¿àª¤ ફેરફારના ખરà«àªšàª¨à«‡ અકà«àª·àª® કરો છો, તો જà«àª¯àª¾àª‚ સà«àª§à«€ તે વà«àª¯àªµàª¹àª¾àª°àª®àª¾àª‚ ઓછામાં ઓછી àªàª• પà«àª·à«àªŸàª¿ ન થાય તà«àª¯àª¾àª‚ સà«àª§à«€ વà«àª¯àªµàª¹àª¾àª°àª®àª¾àª‚થી ફેરફારનો ઉપયોગ કરી શકાતો નથી. આ તમારા બેલેનà«àª¸àª¨à«€ ગણતરી કેવી રીતે કરવામાં આવે છે તેની પણ અસર કરે છે.</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</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>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">રાઉટર પર બિટકોઇન કà«àª²àª¾àª¯àª‚ટ પોરà«àªŸàª¨à«‡ આપમેળે ખોલો. આ તà«àª¯àª¾àª°à«‡ જ કામ કરે છે જà«àª¯àª¾àª°à«‡ તમારà«àª‚ રાઉટર 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">ઇનકમિંગ કનેકà«àª¶àª¨à«àª¸àª¨à«‡ મંજૂરી આપો</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation type="unfinished">SOCKS5 પà«àª°à«‹àª•à«àª¸à«€ દà«àªµàª¾àª°àª¾ Bitcoin નેટવરà«àª•àª¥à«€ કનેકà«àªŸ થાઓ.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">SOCKS5 પà«àª°à«‹àª•à«àª¸à«€ (ડિફોલà«àªŸ પà«àª°à«‹àª•à«àª¸à«€) દà«àªµàª¾àª°àª¾ &amp;કનેકà«àªŸ કરો:</translation>
+ </message>
+ <message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">પà«àª°à«‹àª•à«àª¸à«€ IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">&amp;પોરà«àªŸ:</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;ટà«àª°à«‡ આઇકન બતાવો</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;ટાસà«àª•àª¬àª¾àª°àª¨à«‡ બદલે ટà«àª°à«‡àª®àª¾àª‚ નાની કરો</translation>
+ </message>
+ <message>
+ <source>M&amp;inimize on close</source>
+ <translation type="unfinished">બંધ થવા પર નાનà«àª‚ કરો</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">&amp;પà«àª°àª¦àª°à«àª¶àª¿àª¤ કરો</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation type="unfinished">વપરાશકરà«àª¤àª¾ ઈનà«àªŸàª°àª«à«‡àª¸ અને ભાષા:</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;àªàª•àª®:</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">તૃતીય-પકà«àª· URL (દા.ત. બà«àª²à«‹àª• àªàª•à«àª¸àªªà«àª²à«‹àª°àª°) જે વà«àª¯àªµàª¹àª¾àª°à«‹ ટેબમાં સંદરà«àª­ મેનૂ આઇટમ તરીકે દેખાય છે. URL માં %s ટà«àª°àª¾àª¨à«àªà«‡àª•à«àª¶àª¨ હેશ દà«àªµàª¾àª°àª¾ બદલવામાં આવે છે. બહà«àªµàª¿àª§ URL ને વરà«àªŸàª¿àª•àª² બાર દà«àªµàª¾àª°àª¾ અલગ કરવામાં આવે છે |.</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">&amp;તૃતીય-પકà«àª· વà«àª¯àªµàª¹àª¾àª° URLs</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">ટોર ઓનિયન સેવાઓ માટે અલગ SOCKS5 પà«àª°à«‹àª•à«àª¸à«€ દà«àªµàª¾àª°àª¾ બિટકોઇન નેટવરà«àª• સાથે કનેકà«àªŸ થાઓ.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">ટોર ઓનિયન સેવાઓ દà«àªµàª¾àª°àª¾ સાથીદારો સà«àª§à«€ પહોંચવા માટે અલગ SOCKS&amp;5 પà«àª°à«‹àª•à«àª¸à«€àª¨à«‹ ઉપયોગ કરો:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;બરાબર</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;રદ કરો</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">રૂપરેખાંકન ફાઇલનો ઉપયોગ અદà«àª¯àª¤àª¨ વપરાશકરà«àª¤àª¾ વિકલà«àªªà«‹àª¨à«‹ ઉલà«àª²à«‡àª– કરવા માટે થાય છે જે GUI સેટિંગà«àª¸àª¨à«‡ ઓવરરાઇડ કરે છે. વધà«àª®àª¾àª‚, કોઈપણ આદેશ-વાકà«àª¯ વિકલà«àªªà«‹ આ રૂપરેખાંકન ફાઈલને ઓવરરાઈડ કરશે.</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>
+ <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>
+ <source>Could not read setting "%1", %2.</source>
+ <translation type="unfinished">સેટિંગ "%1", %2 વાંચી શકાયà«àª‚ નથી.</translation>
+ </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">વિહંગાવલોકન ટેબ માટે ગોપનીયતા મોડ સકà«àª°àª¿àª¯ કરà«àª¯à«‹. મૂલà«àª¯à«‹àª¨à«‡ અનમાસà«àª• કરવા માટે, સેટિંગà«àª¸-&gt;માસà«àª• મૂલà«àª¯à«‹àª¨à«‡ અનચેક કરો.</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">સાઇન Tx</translation>
+ </message>
+ <message>
+ <source>Broadcast Tx</source>
+ <translation type="unfinished">બà«àª°à«‹àª¡àª•àª¾àª¸à«àªŸ Tx</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">વà«àª¯àªµàª¹àª¾àª°àª¨à«àª‚ સફળતાપૂરà«àªµàª• પà«àª°àª¸àª¾àª°àª£ થયà«àª‚! ટà«àª°àª¾àª¨à«àªà«‡àª•à«àª¶àª¨ આઈડી: %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>
+ <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">બિટકોઇન શરૂ કરી શકતા નથી: કà«àª²àª¿àª•-ટà«-પે હેનà«àª¡àª²àª°</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 વિશà«àª²à«‡àª·àª¿àª¤ કરી શકાતà«àª‚ નથી! આ અમાનà«àª¯ Bitcoin સરનામà«àª‚ અથવા દૂષિત 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>Ping</source>
+ <extracomment>Title of Peers Table column which indicates the current latency of the connection with the peer.</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>
</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">દિશા</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>
@@ -338,6 +2212,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -349,30 +2228,657 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;છબી સાચવો…</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">&amp;છબી કોપી કરો</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">QR કોડમાં URI ને àªàª¨à«àª•à«‹àª¡ કરવામાં ભૂલ.</translation>
+ </message>
+ <message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">QR કોડ સપોરà«àªŸ ઉપલબà«àª§ નથી.</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation type="unfinished">QR કોડ સાચવો</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;માહિતી</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;રીસેટ કરો</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">પà«àª°àª¾àªªà«àª¤</translation>
+ </message>
+ <message>
<source>Sent</source>
<translation type="unfinished">મોકલેલ</translation>
</message>
- </context>
+ <message>
+ <source>&amp;Peers</source>
+ <translation type="unfinished">&amp;સાથીઓ</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>Session ID</source>
+ <translation type="unfinished">પà«àª°àª•à«àª°àª¿àª¯àª¾ નંબર</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>
+ <message>
+ <source>Transaction Relay</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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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>
+ </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">પિંગ સમય</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">હાલમાં બાકી પિંગનો સમયગાળો.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation type="unfinished">પિંગ રાહ જà«àª“</translation>
+ </message>
+ <message>
+ <source>Min Ping</source>
+ <translation type="unfinished">નà«àª¯à«‚નતમ પિંગ</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>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>Ctrl++</source>
+ <extracomment>Main shortcut to increase the RPC console font size.</extracomment>
+ <translation type="unfinished">કંટà«àª°à«‹àª²++</translation>
+ </message>
+ <message>
+ <source>Ctrl+=</source>
+ <extracomment>Secondary shortcut to increase the RPC console font size.</extracomment>
+ <translation type="unfinished">કંટà«àª°à«‹àª²+=</translation>
+ </message>
+ <message>
+ <source>Ctrl+-</source>
+ <extracomment>Main shortcut to decrease the RPC console font size.</extracomment>
+ <translation type="unfinished">કંટà«àª°à«‹àª²+-</translation>
+ </message>
+ <message>
+ <source>Ctrl+_</source>
+ <extracomment>Secondary shortcut to decrease the RPC console font size.</extracomment>
+ <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>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation type="unfinished">1 &amp;કલાક</translation>
+ </message>
+ <message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 &amp;દિવસ</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 &amp;અઠવાડિયà«àª‚</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 &amp;વરà«àª·</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;કોપી IP/Netmask</translation>
+ </message>
+ <message>
+ <source>&amp;Unban</source>
+ <translation type="unfinished">&amp;અપà«àª°àª¤àª¿àª¬àª‚ધ</translation>
+ </message>
+ <message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">નેટવરà«àª• પà«àª°àªµà«ƒàª¤à«àª¤àª¿ અકà«àª·àª® છે</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">કોઈ નહિ</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">કોઈપણ વૉલેટ વિના આદેશનો અમલ</translation>
+ </message>
+ <message>
+ <source>Ctrl+I</source>
+ <translation type="unfinished">કંટà«àª°à«‹àª²+I</translation>
+ </message>
+ <message>
+ <source>Ctrl+T</source>
+ <translation type="unfinished">કંટà«àª°à«‹àª²+T</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished">કંટà«àª°à«‹àª²+N</translation>
+ </message>
+ <message>
+ <source>Ctrl+P</source>
+ <translation type="unfinished">કંટà«àª°à«‹àª²+P</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;રકમ:</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;લેબલ:</translation>
+ </message>
+ <message>
+ <source>&amp;Message:</source>
+ <translation type="unfinished">&amp;સંદેશ:</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">ચà«àª•àªµàª£à«€àª¨à«€ વિનંતી સાથે જોડવા માટેનો વૈકલà«àªªàª¿àª• સંદેશ, જે વિનંતી ખોલવામાં આવશે તà«àª¯àª¾àª°à«‡ પà«àª°àª¦àª°à«àª¶àª¿àª¤ થશે. નોંધ: Bitcoin નેટવરà«àª• પર ચà«àª•àªµàª£à«€ સાથે સંદેશ મોકલવામાં આવશે નહીં.</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;નવà«àª‚ પà«àª°àª¾àªªà«àª¤ કરવાનà«àª‚ સરનામà«àª‚ બનાવો</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;લેબલ</translation>
+ </message>
+ <message>
+ <source>Copy &amp;message</source>
+ <translation type="unfinished">નકલ &amp; સંદેશ</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">નકલ &amp;રકમ</translation>
+ </message>
+ <message>
+ <source>Not recommended due to higher fees and less protection against typos.</source>
+ <translation type="unfinished">વધૠફી અને ટાઇપો સામે ઓછા રકà«àª·àª£àª¨à«‡ કારણે ભલામણ કરવામાં આવતી નથી.</translation>
+ </message>
+ <message>
+ <source>Generates an address compatible with older wallets.</source>
+ <translation type="unfinished">જૂના પાકીટ સાથે સà«àª¸àª‚ગત સરનામà«àª‚ જનરેટ કરે છે.</translation>
+ </message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">વૉલેટ અનલૉક કરી શકાયà«àª‚ નથી.</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>Wallet:</source>
+ <translation type="unfinished">વૉલેટ:</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">કૉપિ &amp;URI </translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;છબી સાચવો…</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>
@@ -384,9 +2890,78 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>SendCoinsDialog</name>
<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>Hide</source>
<translation type="unfinished">છà«àªªàª¾àªµà«‹</translation>
</message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">ફોરà«àª®àª¨àª¾ તમામ કà«àª·à«‡àª¤à«àª°à«‹ સાફ કરો.</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <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>
+ <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>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>Total Amount</source>
+ <translation type="unfinished">કà«àª² રકમ</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -400,7 +2975,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;લેબલ:</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">કà«àª²àª¿àªªàª¬à«‹àª°à«àª¡àª®àª¾àª‚થી સરનામà«àª‚ પેસà«àªŸ કરો</translation>
+ </message>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">કà«àª²àª¿àªªàª¬à«‹àª°à«àª¡àª®àª¾àª‚થી સરનામà«àª‚ પેસà«àªŸ કરો</translation>
+ </message>
+ </context>
+<context>
<name>TransactionDesc</name>
+ <message>
+ <source>Date</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 numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -416,6 +3029,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">તારીખ</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">પà«àª°àª•àª¾àª°</translation>
</message>
@@ -431,11 +3048,31 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>TransactionView</name>
<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>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>Type</source>
<translation type="unfinished">પà«àª°àª•àª¾àª°</translation>
</message>
@@ -458,6 +3095,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -469,5 +3110,14 @@ 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>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">વૉલેટ ડેટા</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">રદ કરો</translation>
+ </message>
+</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_hak.ts b/src/qt/locale/bitcoin_hak.ts
index ca7723785c..4ad802e718 100644
--- a/src/qt/locale/bitcoin_hak.ts
+++ b/src/qt/locale/bitcoin_hak.ts
@@ -10,10 +10,6 @@
<translation type="unfinished">新增一個ä½å€</translation>
</message>
<message>
- <source>&amp;New</source>
- <translation type="unfinished">新增 &amp;N</translation>
- </message>
- <message>
<source>Copy the currently selected address to the system clipboard</source>
<translation type="unfinished">把目å‰é€‰æ‹©çš„地å€å¤åˆ¶åˆ°ç³»ç»Ÿç²˜è´´æ¿ä¸­</translation>
</message>
@@ -179,6 +175,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -261,6 +265,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>
@@ -432,7 +440,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -510,7 +518,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -521,16 +529,8 @@ Signing is only possible with addresses of the type 'legacy'.</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>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -541,22 +541,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -573,32 +561,20 @@ Signing is only possible with addresses of the type 'legacy'.</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;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <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>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -610,7 +586,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>
@@ -640,15 +616,15 @@ 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>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -734,7 +710,7 @@ 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帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -745,10 +721,6 @@ 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>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -786,15 +758,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</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;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -806,26 +778,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ <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>
@@ -927,11 +889,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -946,14 +908,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -966,22 +920,10 @@ 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>
@@ -1006,10 +948,6 @@ 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>
@@ -1045,11 +983,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1141,10 +1075,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1194,7 +1124,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1245,7 +1175,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
</context>
<context>
@@ -1284,7 +1214,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1307,7 +1237,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1315,7 +1245,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1352,7 +1282,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1383,7 +1313,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <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>
@@ -1391,7 +1321,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>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>
@@ -1437,7 +1367,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1448,15 +1378,15 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</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>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1468,7 +1398,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1480,7 +1410,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1508,7 +1438,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1519,11 +1449,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1535,11 +1465,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</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>
@@ -2290,10 +2220,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2400,6 +2326,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2462,7 +2392,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>
@@ -2568,7 +2498,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2592,6 +2522,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2627,7 +2561,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2817,11 +2751,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2959,7 +2893,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2973,9 +2907,9 @@ For more information on using this console, type %6.
<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字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–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>
@@ -3090,6 +3024,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>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3098,6 +3036,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3229,7 +3172,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>
@@ -3286,10 +3229,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3299,7 +3238,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>
@@ -3374,10 +3313,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>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>
@@ -3430,6 +3365,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3808,7 +3750,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3946,11 +3888,6 @@ 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>
@@ -3960,11 +3897,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
@@ -4014,6 +3947,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4027,7 +3964,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <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>
@@ -4055,7 +3992,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%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>
@@ -4094,10 +4033,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4206,10 +4141,6 @@ 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>
@@ -4344,6 +4275,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4361,7 +4296,7 @@ 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">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4452,14 +4387,34 @@ Unable to restore backup of wallet.</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: 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">錯誤:keypool已用完,請先é‡æ–°å‘¼å«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>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4512,6 +4467,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4520,6 +4479,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4544,6 +4511,10 @@ Unable to restore backup of wallet.</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>
@@ -4716,10 +4687,6 @@ Unable to restore backup of wallet.</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. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts
index e3979b07e4..17fc4dc382 100644
--- a/src/qt/locale/bitcoin_he.ts
+++ b/src/qt/locale/bitcoin_he.ts
@@ -15,7 +15,7 @@
</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>
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">× × ×œ×¡×¤×§ ×ת הסיסמה הישנה ולתת סיסמה חדשה ל×רנק.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">המשך</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -398,6 +406,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ג״ב</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">×רנק בררת מחדל</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -692,6 +704,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>
@@ -705,10 +725,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">×רנק בררת מחדל</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">×ין ××¨× ×§×™× ×–×ž×™× ×™×</translation>
</message>
@@ -793,6 +809,10 @@ Signing is only possible with addresses of the type 'legacy'.</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
@@ -1008,6 +1028,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>
@@ -1018,10 +1045,6 @@ 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>
@@ -1597,6 +1620,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">בקובץ ההגדרות ניתן לציין ×פשרויות מתקדמות ×שר יקבלו עדיפות על ההגדרות בממשק הגרפי. כמו כן, ×פשרויות בשורת הפקודה יקבלו עדיפות על קובץ ההגדרות.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">המשך</translation>
+ </message>
+ <message>
<source>Cancel</source>
<translation type="unfinished">ביטול</translation>
</message>
@@ -2158,6 +2185,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">פעילות הרשת נוטרלה</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">לל×</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">מבצע פקודה ×œ×œ× ×›×œ ×רנק</translation>
</message>
@@ -2721,10 +2752,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">חתימה על הו&amp;דעה</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>
@@ -2809,10 +2836,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -3327,11 +3350,7 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Could not commit transaction</source>
<translation type="unfinished">שילוב העסקה נכשל</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">×רנק בררת מחדל</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3383,12 +3402,16 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s משובש. נסו להשתמש בכלי ×”×רנק bitcoin-wallet כדי להציל ×ו לשחזר מגיבוי..</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>Distributed under the MIT software license, see the accompanying file %s or %s</source>
<translation type="unfinished">מופץ תחת רשיון התוכנה של MIT, ר××” קובץ מלווה %s ×ו %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>
+ <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>
@@ -3455,10 +3478,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">‎-maxmempool חייב להיות לפחות %d מ״ב</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">שגי××” פטלית פנימית ×ירעה, לפירוט ר××” ×ת לוג הדיב××’.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">×œ× ×ž×¦×œ×™×— לפענח -%s כתובת: '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hi.ts b/src/qt/locale/bitcoin_hi.ts
index 414670e7a2..8f77bdc79c 100644
--- a/src/qt/locale/bitcoin_hi.ts
+++ b/src/qt/locale/bitcoin_hi.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>
@@ -15,7 +15,7 @@
</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>
@@ -27,7 +27,7 @@
</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,7 +35,7 @@
</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>
@@ -43,7 +43,7 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">मिटाना</translation>
+ <translation type="unfinished">डिलीट करें</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -55,7 +55,7 @@
</message>
<message>
<source>C&amp;hoose</source>
- <translation type="unfinished">&amp;चà¥à¤œà¤¼</translation>
+ <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>
@@ -69,19 +69,19 @@ 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;लेबल कॉपी करें</translation>
</message>
<message>
<source>&amp;Edit</source>
- <translation type="unfinished">&amp;à¤à¤¡à¥€à¤Ÿ</translation>
+ <translation type="unfinished">&amp;बदलाव करें</translation>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">पता की सूची को निरà¥à¤¯à¤¾à¤¤ करें</translation>
+ <translation type="unfinished">पते की सूची को à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ करें</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -94,8 +94,12 @@ 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>Exporting Failed</source>
- <translation type="unfinished">निरà¥à¤¯à¤¾à¤¤ विफल हो गया है</translation>
+ <translation type="unfinished">à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ नहीं हो पाया</translation>
</message>
</context>
<context>
@@ -121,7 +125,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">पासफ़à¥à¤°à¥‡à¤œà¤¼ मे पà¥à¤°à¤µà¥‡à¤¶ करें</translation>
+ <translation type="unfinished">पासफà¥à¤°à¥‡à¥› दरà¥à¤œ करें</translation>
</message>
<message>
<source>New passphrase</source>
@@ -405,10 +409,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -422,101 +422,25 @@ Signing is only possible with addresses of the type 'legacy'.</source>
 </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">अपने बिटकॉइन पतों के साथ संदेशों पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करके साबित करें कि वे आपके हैं |</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;लोड करें…</translation>
- </message>
- <message>
- <source>Open &amp;URI…</source>
- <translation type="unfinished"> &amp;यूआरआई खोलिये…</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>
- </message>
- <message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;फ़ाइल</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <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>
+ <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>
- <numerusform>टà¥à¤°à¤¾à¤¨à¤œà¥‡à¤•à¥à¤¶à¤¨ हिसà¥à¤Ÿà¥à¤°à¥€ के बà¥à¤²à¥‰à¤• संसाधित किठगठहै %n .</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
</translation>
</message>
<message>
- <source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">पीà¤à¤¸à¤¬à¥€à¤Ÿà¥€ को &amp;कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ से लोड करें…</translation>
- </message>
- <message>
<source>Migrate Wallet</source>
<translation type="unfinished">वॉलेट माइगà¥à¤°à¥‡à¤Ÿ करें</translation>
</message>
@@ -533,6 +457,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>Error creating wallet</source>
+ <translation type="unfinished">बटवा निरà¥à¤®à¤¾à¤£ में गलती</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">तà¥à¤°à¥à¤Ÿà¤¿: %1</translation>
</message>
@@ -608,7 +556,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>
@@ -651,13 +599,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">कॉपी बाइटà¥à¤¸</translation>
</message>
<message>
+ <source>Copy change</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>
@@ -682,6 +639,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>MigrateWalletActivity</name>
<message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">वॉलेट माइगà¥à¤°à¥‡à¤Ÿ करें</translation>
+ </message>
+ <message>
<source>Migrate Wallet</source>
<translation type="unfinished">वॉलेट माइगà¥à¤°à¥‡à¤Ÿ करें</translation>
</message>
@@ -695,6 +656,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>CreateWalletDialog</name>
+ <message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">आपके नठबटवे के निरà¥à¤®à¤¾à¤£ से आप सिरà¥à¤« à¤à¤• कदम दूर है</translation>
+ </message>
+ </context>
+<context>
<name>Intro</name>
<message numerus="yes">
<source>%n GB of space available</source>
@@ -1373,10 +1341,6 @@ For more information on using this console, type %6.
<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>
@@ -1556,6 +1520,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>Copy change</source>
+ <translation type="unfinished">कॉपी चैंज</translation>
+ </message>
+ <message>
<source>%1 (%2 blocks)</source>
<translation type="unfinished">%1 (%2 बà¥à¤²à¤¾à¤•à¤¸)</translation>
</message>
@@ -1732,11 +1700,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>
@@ -1826,10 +1790,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>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>
@@ -1922,10 +1882,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>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>
@@ -2217,10 +2173,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>
@@ -2346,11 +2298,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Send Coins</source>
<translation type="unfinished">सेनà¥à¤¡ कॉइनà¥à¤¸</translation>
</message>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ में कापी किया गया</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -2366,6 +2313,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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 अनà¥à¤°à¥‹à¤§ %u पोरà¥à¤Ÿ पर सà¥à¤¨à¤¨à¥‡ का. इस बंदरगाह को "खराब" माना जाता है और इस पà¥à¤°à¤•à¤¾à¤° यह संभावना नहीं है कि कोई भी सहकरà¥à¤®à¥€ इससे जà¥à¤¡à¤¼à¥‡à¤—ा। विवरण और पूरी सूची के लिठdoc/p2p-bad-ports.md देखें।</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 के लिठडिसà¥à¤• सà¥à¤¥à¤¾à¤¨ बà¥à¤²à¥‰à¤• फ़ाइलों को समायोजित नहीं कर सकता है। इस निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ में लगभग %u GB डेटा संगà¥à¤°à¤¹à¥€à¤¤ किया जाà¤à¤—ा।</translation>
</message>
@@ -2400,7 +2351,8 @@ The wallet might have been tampered with or created with malicious intent.
</source>
<translation type="unfinished">डिसà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¤° वॉलेट में अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¶à¤¿à¤¤ विरासत पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ मिली। %s बटà¥à¤† लोड हो रहा है
-हो सकता है कि वॉलेट से छेड़छाड़ की गई हो या दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ इरादे से बनाया गया हो।</translation>
+हो सकता है कि वॉलेट से छेड़छाड़ की गई हो या दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ इरादे से बनाया गया हो।
+</translation>
</message>
<message>
<source>Error: Cannot extract destination from the generated scriptpubkey</source>
diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts
index e843aed672..c157aca5cc 100644
--- a/src/qt/locale/bitcoin_hr.ts
+++ b/src/qt/locale/bitcoin_hr.ts
@@ -176,6 +176,10 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Unesite staru i novu lozinku za novÄanik.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nastavi</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">Zapamtite da Å¡ifriranje vaÅ¡eg novÄanika ne može u potpunosti zaÅ¡tititi vaÅ¡e bitcoinove od zloćudnog softvera kojim se zarazi vaÅ¡e raÄunalo.</translation>
</message>
@@ -393,7 +397,11 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<numerusform>%n godina</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">uobiÄajeni novÄanik</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -483,7 +491,7 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
</message>
<message>
<source>&amp;Options…</source>
- <translation type="unfinished">&amp;Postavke</translation>
+ <translation type="unfinished">&amp;Opcije</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
@@ -519,7 +527,7 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;UÄitaj PSBT iz datoteke</translation>
+ <translation type="unfinished">&amp;UÄitaj PSBT iz datoteke...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -690,10 +698,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Sakrij vrijednost u tabu Pregled </translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">uobiÄajeni novÄanik</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nema dostupnih novÄanika</translation>
</message>
@@ -1028,10 +1032,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Upozorenje kod otvaranja novÄanika</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">uobiÄajeni novÄanik</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otvorite novÄanik</translation>
@@ -2395,6 +2395,10 @@ Ako imate ovu grešku, od trgovca zatražite URI koji je kompatibilan sa BIP21.<
<translation type="unfinished">Mrežna aktivnost iskljuÄena</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ništa</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">IzvrÅ¡ava se naredba bez bilo kakvog novÄanika</translation>
</message>
@@ -2742,8 +2746,7 @@ Za više informacija o korištenju ove konzile, utipkajte %6.
</message>
<message>
<source>Hide transaction fee settings</source>
- <translation type="unfinished">Sakrijte postavke za transakcijske provizije
-</translation>
+ <translation type="unfinished">Sakrijte postavke za transakcijske provizije</translation>
</message>
<message>
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
@@ -3073,10 +3076,6 @@ Napomena: Budući da se naknada raÄuna po bajtu, naknada od "100 satoÅ¡ija po k
<translation type="unfinished">&amp;Potpišite poruku</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">Možete potpisati poruke/dogovore svojim adresama kako biste dokazali da možete pristupiti bitcoinima poslanim na te adrese. Budite oprezni da ne potpisujte niÅ¡ta nejasno ili nasumiÄno, jer napadi phishingom vas mogu prevariti da prepiÅ¡ite svoj identitet njima. Potpisujte samo detaljno objaÅ¡njene izjave s kojima se slažete.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin adresa pomoću koje ćete potpisati poruku</translation>
</message>
@@ -3161,10 +3160,6 @@ Napomena: Budući da se naknada raÄuna po bajtu, naknada od "100 satoÅ¡ija po k
<translation type="unfinished">Molim provjerite adresu i pokušajte ponovo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Unesena adresa ne odnosi se na kljuÄ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">OtkljuÄavanje novÄanika je otkazano.</translation>
</message>
@@ -3728,10 +3723,6 @@ Idi na Datoteka &gt; Otvori novÄanik za uÄitanje novÄanika.
<source>Can't display address</source>
<translation type="unfinished">Ne mogu prikazati adresu</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">uobiÄajeni novÄanik</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3844,10 +3835,6 @@ Idi na Datoteka &gt; Otvori novÄanik za uÄitanje novÄanika.
<translation type="unfinished">Format datoteke novÄanika nije dostupan. Kako biste koristili reatefromdump, -format=&lt;format&gt; mora biti osiguran.</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">Molimo provjerite jesu li datum i vrijeme na vaÅ¡em raÄunalu toÄni. Ako je vaÅ¡ sat krivo namjeÅ¡ten, %s neće raditi ispravno.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Molimo vas da doprinijete programu %s ako ga smatrate korisnim. Posjetite %s za više informacija.</translation>
</message>
@@ -3932,10 +3919,6 @@ Idi na Datoteka &gt; Otvori novÄanik za uÄitanje novÄanika.
<translation type="unfinished">-maxmempool mora biti barem %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Dogodila se kobna greška, vidi detalje u debug.log.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Ne može se razriješiti adresa -%s: '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts
index a2f27b94a0..f3c9416193 100644
--- a/src/qt/locale/bitcoin_hu.ts
+++ b/src/qt/locale/bitcoin_hu.ts
@@ -184,6 +184,14 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Ãrja be a tárca régi és új jelmondatát.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Tovább</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Vissza</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">Ne feledje, hogy a tárca titkosítása nem nyújt teljes védelmet az adathalász programok fertőzésével szemben.</translation>
</message>
@@ -303,6 +311,18 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">ismeretlen</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Beágyazva "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Alapértelmezett betűtípus "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Egyedi…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Összeg</translation>
</message>
@@ -413,7 +433,11 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<numerusform>%n év</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">alapértelmezett tárca</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -491,7 +515,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Tárcatitkosító jelmondat megváltoztatása</translation>
+ <translation type="unfinished">Tárcatitkosító jelszó megváltoztatása</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -519,7 +543,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">Jelmondat &amp;megváltoztatása…</translation>
+ <translation type="unfinished">Jelszó &amp;megváltoztatása…</translation>
</message>
<message>
<source>Sign &amp;message…</source>
@@ -527,7 +551,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Üzenetek aláírása a Bitcoin-címeivel, amivel bizonyíthatja, hogy az Öné</translation>
+ <translation type="unfinished">Üzenetek aláírása a Bitcoin-címeivel, amivel bizonyíthatja hogy a cím az Öné</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -551,7 +575,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Tárca létrehozása...</translation>
+ <translation type="unfinished">Tárca készítése…</translation>
</message>
<message>
<source>Close All Wallets…</source>
@@ -607,7 +631,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">Paran&amp;cssori opciók</translation>
+ <translation type="unfinished">Paran&amp;cssor kapcsolók</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -637,7 +661,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Figyelmeztetés</translation>
+ <translation type="unfinished">Figyelem</translation>
</message>
<message>
<source>Information</source>
@@ -681,11 +705,11 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Tárca megnyitása</translation>
+ <translation type="unfinished">Tárca Megnyitása</translation>
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">Egy tárca megnyitása</translation>
+ <translation type="unfinished">Tárca megnyitása</translation>
</message>
<message>
<source>Close wallet</source>
@@ -726,17 +750,13 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Értékek elrejtése az Ãttekintés fülön</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">alapértelmezett tárca</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nincs elérhető tárca</translation>
</message>
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Tárca adat</translation>
+ <translation type="unfinished">Tárca adatai</translation>
</message>
<message>
<source>Load Wallet Backup</source>
@@ -976,11 +996,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&amp;ímke másolása</translation>
+ <translation type="unfinished">Címke &amp;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>
@@ -1139,10 +1159,6 @@ A migrációs folyamat készít biztonsági mentést a tárcáról migrálás el
<translation type="unfinished">Tárca-megnyitási figyelmeztetés</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">alapértelmezett tárca</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Tárca megnyitása</translation>
@@ -1598,6 +1614,10 @@ A migrációs folyamat készít biztonsági mentést a tárcáról migrálás el
<translation type="unfinished">Az alkalmazásból való kilépés helyett az eszköztárba kicsinyíti az alkalmazást az ablak bezárásakor. Ez esetben az alkalmazás csak a Kilépés menüponttal zárható be.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">A Főoldal fül betűtípusa:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Ebben az ablakban megadott beállítások felülbírálásra kerültek a parancssori kapcsolók által:</translation>
</message>
@@ -2329,10 +2349,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2439,6 +2455,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Irány/Típus</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">A BIP324 munkamenet-azonosító hex formátumban.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">A hálózati protokoll amin keresztül ez a partner kapcsolódik: IPv4, IPv6, Onion, I2P vagy CJDNS.</translation>
</message>
@@ -2631,10 +2651,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Hálózati tevékenység letiltva</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Semmi</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Parancs végrehajtása tárca nélkül</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Csomópont ablak - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Parancs végrehajtása a "%1" tárca használatával</translation>
</message>
@@ -3347,8 +3375,8 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Üzenet &amp;aláírása</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">Címeivel aláírhatja az üzeneteket/egyezményeket, amivel bizonyíthatja, hogy át tudja venni az ezekre a címekre küldött bitcoin-t. Vigyázzon, hogy ne írjon alá semmi félreérthetőt, mivel adathalász támadásokkal megpróbálhatják becsapni, hogy az azonosságát átírja másokra. Csak olyan részletes állításokat írjon alá, amivel egyetért.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Aláírhat üzeneteket/megállapodásokat a régí típusú (P2PKH) címeivel amivel bizonyítja, hogy fogadni és elkölteni is tudja az oda küldött bitcoint. Legyen óvatos és ne írjon alá semmilyen ködös vagy véletlenszerű üzenetet, mivel adathalászok megkísérelhetik rávenni a személyazonosságának átruházására. Csak olyan alaposan részletezett állításokat írjon alá amivel teljesen egyetért.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3435,8 +3463,8 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Ellenőrizze a címet és próbálja meg újra.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">A megadott cím nem hivatkozik egy kulcshoz sem.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">A megadott cím nem régi típusú (P2PKH) kulcsra hivatkozik. Üzenetek aláírása SegWit és más nem P2PKH típusú címekkel nem támogatott a jelenlegi %1 verzióban. Kérjük ellenőrizze a címet majd próbálja újra.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -4011,9 +4039,8 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">PSBT másolva</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Vágólapra másolva</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Díj emelési PSBT a vágólapra másolva</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4024,12 +4051,12 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">A tranzakciót nem lehet elküldeni</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Nem lehet a címet megjeleníteni</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Aláíró hiba</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">alapértelmezett tárca</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Nem lehet a címet megjeleníteni</translation>
</message>
</context>
<context>
@@ -4049,7 +4076,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 adat</translation>
+ <translation type="unfinished">Tárca adatai</translation>
</message>
<message>
<source>Backup Failed</source>
@@ -4163,10 +4190,6 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Nincs tárca fájlformátum megadva. A createfromdump használatához -format=&lt;format&gt; megadása kötelező.</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">Ellenőrizze, hogy helyesen van-e beállítva a gépén a dátum és az idő! A %s nem fog megfelelően működni, ha rosszul van beállítva az óra.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Kérjük támogasson, ha hasznosnak találta a %s-t. Az alábbi linken további információt találhat a szoftverről: %s.</translation>
</message>
@@ -4275,10 +4298,6 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">-maxmempool legalább %d MB kell legyen.</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Súlyos belső hiba történt, részletek a debug.log-ban</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">-%s cím feloldása nem sikerült: '%s'</translation>
</message>
@@ -4292,7 +4311,7 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Nem lehet írni a '%s' könyvtárba; ellenőrizze a jogosultságokat.</translation>
+ <translation type="unfinished">Nem tudok írni a '%s' könyvtárba, ellenőrizd a jogosultságokat.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -4327,6 +4346,12 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Nem sikerült a láncállapot pillanatkép könyvtárat (%s) eltávolítani. Távolítsa el kézzel újraindítás előtt.
+</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>
@@ -4335,6 +4360,14 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Díjbecslés sikertelen. Alapértelmezett díj letiltva. Várjon néhány blokkot vagy engedélyezze ezt: %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Nem sikerült a blokk fájlt lemezre írni. Ez valószínű I/O hiba következménye.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Nem sikerült a visszavonási fájlt lemezre írni. Ez valószínű I/O hiba következménye.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Összeférhetetlen beállítások: -dnsseed=1 lett megadva, de az -onlynet megtiltja az IPv4/IPv6 kapcsolatokat</translation>
</message>
@@ -4343,6 +4376,14 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Érvénytelen összeg: %s=&lt;amount&gt;: '%s' (legalább a minrelay összeg azaz %s kell legyen, hogy ne ragadjon be a tranzakció)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Maximális tranzakciós súly kevesebb, mint a bemenetek nélküli tranzakció súlya</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Maximális tranzakciós súly túl alacsony, nincs hely a visszajáró kimenetnek</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">A kilépő kapcsolatok CJDNS-re korlátozottak (-onlynet=cjdns) de nincs megadva -cjdnsreachable</translation>
</message>
@@ -4359,6 +4400,14 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">A kilépő kapcsolatok i2p-re korlátozottak (-onlynet=i2p) de nincs megadva -i2psam</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Nem sikerült az '%s' -&gt; '%s' átnevezés. Nem lehet kitisztítani a háttér láncállapot leveldb könyvtárat.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Az előre kiválasztott bemenetek és a tárca automatikus bemeneteinek kombinációja meghaladja a maximális tranzakciós súlyt. Kérjük próbáljon kisebb összeget küldeni vagy kézzel egyesítse a tárca UTXO-it.</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">A bemenetek mérete meghaladja a maximum súlyt. Kérjük próbáljon kisebb összeget küldeni vagy kézzel egyesítse a tárca UTXO-it.</translation>
</message>
@@ -4401,6 +4450,10 @@ Kérjük próbálja futtatni a legújabb szoftver verziót.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">A számítógépének órája több mint %d perces eltérést mutat a hálózatéhoz képest, ez hátráltathatja a konszenzusra jutást. Miután megbizonyosodott az óra helyességéről ennek az üzenetnek nem szabad megjelennie a csomópont újraindítása után. Újraindítás nélkül nem jelenik meg többször miután elegendő új kimenő partnerhez csatlakozott, ami eltarthat egy ideig. További információért tanulmányozhatja a `timeoffset` mezőt a `getpeerinfo` és a `getnetworkinfo` RPC parancsokban.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4413,6 +4466,18 @@ Unable to restore backup of wallet.</source>
A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">A whitebind csak bejövő kapcsolatokhoz használható ("out" lett megadva)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Végzetes belső hiba történt, részletek a debug.log fájlban:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Nem található assumeutxo adat a megadott blokk ellenőrzőösszeghez '%s'.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">Blokkok ellenőrzése megszakítva</translation>
</message>
@@ -4425,6 +4490,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Szerzői jog (C) fenntartva %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Hibás blokk találata valószínűleg hardver hibára utal.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Sérült blokk-adatbázis észlelve</translation>
</message>
@@ -4453,6 +4522,14 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">A %s elérési úton fájl nem létezik.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Elliptikus görbés kriptográfia épségi ellenőrzése sikertelen. %s most leáll.</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Hiba a tárca tranzakciókat eltávolító adatbázis tranzakció létrehozása közben</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Hiba %s létrehozása közben</translation>
</message>
@@ -4501,6 +4578,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">A tárca-adatbázisból a következő rekord beolvasása sikertelen.</translation>
</message>
<message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Hiba a tárca tranzakciókat eltávolító adatbázis tranzakció indítása közben</translation>
+ </message>
+ <message>
<source>Error: Cannot extract destination from the generated scriptpubkey</source>
<translation type="unfinished">Hiba: Nem lehet kinyerni a célt az előállított scriptpubkey-ből</translation>
</message>
@@ -4585,10 +4666,30 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem lehet írni a figyelő tárca legfelső blokkját megadó rekordot</translation>
</message>
<message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Hiba: címjegyzék másolása sikertelen ehhez a tárcához: %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Hiba: adatbázis tranzakció végrehajtása sikertelen ehhez a tárcához: %s</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Sikertelen a legjobb blokkhoz (%s) csatlakozás.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Blokk szétkapcsolása nem sikerült.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Blokk olvasása nem sikerült.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Indítás közben nem sikerült átfésülni a tárcát</translation>
</message>
@@ -4601,6 +4702,26 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Adatbázis ellenőrzése sikertelen</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Blokk írása nem sikerült.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">A blokk-index adatbázis írása nem sikerült.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Az érme-adatbázis írása nem sikerült.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Visszavonási adatok írása nem sikerült.</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Tranzakció eltávolítása nem sikerült: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">A választott díj (%s) alacsonyabb mint a beállított minimum díj (%s)</translation>
</message>
@@ -4693,6 +4814,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Tárca betöltése…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Maximális tranzakciós súlynak %d és %d között kell lennie.</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Hiányzó összeg</translation>
</message>
@@ -4721,6 +4846,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Nem megoldható az előre kiválasztott bemenet %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Csak az irány lett beállítva, engedélyek nem: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Ritkított üzemmódot nem lehet negatív értékkel konfigurálni.</translation>
</message>
@@ -4765,6 +4894,18 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Ismeretlen bekezdés [%s]</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Az aláíró nem jelzett vissza címet</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Az aláíró váratlan címet jelzett vissza: %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Aláíró hibát jelzett: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Tranzakció aláírása sikertelen</translation>
</message>
@@ -4793,6 +4934,18 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hálózati szálak indítása…</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Rendszerhiba lemezre írás közben: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Rendszerhiba külső blokk fájl betöltése közben: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Rendszerhiba blokk lemezre mentése közben: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">A forráskód elérhető innen: %s.</translation>
</message>
@@ -4809,6 +4962,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">A tárca nem fog a minimális továbbítási díjnál kevesebbet fizetni. </translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Nem tartozik ScriptPubKeyManager ehhez a címhez</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Ez egy kísérleti szoftver.</translation>
</message>
@@ -4821,6 +4978,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Ez a tranzakció díja, amelyet kifizet, ha tranzakciót indít.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">A %s tranzakció nem tartozik ehhez a tárcához</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Tranzakció összege túl alacsony</translation>
</message>
@@ -4845,10 +5006,6 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Túl nagy tranzakció</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Nem sikerült a memóriát lefoglalni -maxsigcachesize számára: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Ezen a számítógépen nem lehet ehhez társítani: %s (a bind ezzel a hibával tért vissza: %s)</translation>
</message>
@@ -4909,6 +5066,10 @@ 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>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Ismeretlen beállítás "%s" lett megadva itt: -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
@@ -4929,6 +5090,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem sikerült hozzáadni a megfigyelt %s tranzakciót a figyelő tárcához</translation>
</message>
<message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Hiba: Nem lehet törölni csak megfigyelt tranzakciókat.</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 975959d8b5..864787803d 100644
--- a/src/qt/locale/bitcoin_id.ts
+++ b/src/qt/locale/bitcoin_id.ts
@@ -79,6 +79,14 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Terjadi sebuah kesalahan saat mencoba menyimpan daftar alamat ke %1. Silakan coba lagi.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Alamat pengirim - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Penerima alamat - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Gagal Mengekspor</translation>
</message>
@@ -87,7 +95,7 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<name>AddressTableModel</name>
<message>
<source>Address</source>
- <translation type="unfinished">Alamat</translation>
+ <translation type="unfinished">0x5a52E96BAcdaBb82fd05763E25335261B270Efcb</translation>
</message>
<message>
<source>(no label)</source>
@@ -259,6 +267,18 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</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">Error yang fatal telah terjadi. Periksa bahwa file pengaturan dapat ditulis atau coba jalankan dengan -nosettings</translation>
</message>
+ <message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Di embed "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Font bawaan sistem "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Pilihan...</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -295,10 +315,102 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">wallet default</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Ubah kata kunci yang digunakan untuk enkripsi dompet</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Enkripsi wallet...</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">Enkripsi private key yang dimiliki dompet Anda</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Cadangkan Dompet...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Ganti kata sandi...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Tanda tangani dan kirim pessan...</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Tanda tangani sebuah pesan menggunakan alamat Bitcoin Anda untuk membuktikan bahwa Anda adalah pemiliknya</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Verifikasi pesan...</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Verifikasi pesan untuk memastikan bahwa pesan tersebut ditanda tangani oleh suatu alamat Bitcoin tertentu</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Muat PSBT dari file...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Buka &amp;URI...</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Tutup Dompet...</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Bikin dompet...</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Tutup semua dompet...</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Berkas</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Pengaturan</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Bantuan</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Baris tab</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Singkronisasi Header (%1%)...</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Mensinkronisasi dengan jaringan</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Mengindeks blok pada disk...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Memproses blok pada disk ...</translation>
+ </message>
+ <message>
<source>Connecting to peers…</source>
<translation type="unfinished">Menghubungkan ke peers...</translation>
</message>
@@ -321,7 +433,7 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<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>%n blok riwayat transaksi diproses.</numerusform>
</translation>
</message>
<message>
@@ -357,6 +469,50 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Terbaru</translation>
</message>
<message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Muat transaksi Bitcoin yang ditandatangani seperapat</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Masukkan PSBT dari &amp;clipboard</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">Muat transaksi Bitcoin yang ditandatangani seperapat dari clipboard</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Jendela Node</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Buka konsol debug dan diagnosa node</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">Address &amp;Pengirim</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">Address &amp;Penerima</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">Buka URI bitcoin:</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Buka Wallet</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Buka sebuah wallet</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Tutup wallet</translation>
+ </message>
+ <message>
<source>Restore Wallet…</source>
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
<translation type="unfinished">Pulihkan Dompet…</translation>
@@ -391,10 +547,6 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Mask nilai yang ada di tab Overview</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">wallet default</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Tidak ada wallet tersedia</translation>
</message>
@@ -426,23 +578,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<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 koneksi yang aktif ke jaringan Bitcoin</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
<message>
@@ -488,19 +628,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<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>
@@ -525,6 +656,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Migrasi dompet</translation>
</message>
<message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Anda yakin ingin memindahkan dompet &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.
@@ -553,6 +688,10 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<translation type="unfinished">Skrip hanya lihat telah dimigrasikan ke dompet yang baru '%1'.</translation>
</message>
<message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Skrip hanya lihat telah diimigrasikan ke dompet baru yang bernama '%1'.</translation>
+ </message>
+ <message>
<source>Migration failed</source>
<translation type="unfinished">Migrasi gagal</translation>
</message>
@@ -572,10 +711,6 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<translation type="unfinished">Peringatan membuka wallet</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">wallet default</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>
@@ -974,6 +1109,10 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<translation type="unfinished">Minimalisasi aplikasi ketika jendela ditutup. Ketika pilihan ini dipilih, aplikasi akan menutup seluruhnya jika anda memilih Keluar di menu yang tersedia.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Font pada tab Overview:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Set opsi pengaturan pada jendela dialog ini tertutup oleh baris perintah:</translation>
</message>
@@ -1112,6 +1251,10 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<source>PSBT Operations</source>
<translation type="unfinished">Operasi PBST</translation>
</message>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Mengirim %1 ke %2</translation>
+ </message>
</context>
<context>
<name>PeerTableModel</name>
@@ -1154,10 +1297,6 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<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>
@@ -1184,6 +1323,10 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<translation type="unfinished">Jumlah total alamat yang diterima dari rekan ini yang dihapus (tidak diproses) karena pembatasan tarif.</translation>
</message>
<message>
+ <source>Node window</source>
+ <translation type="unfinished">Jendela Node</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Waktu blok terakhir</translation>
</message>
@@ -1244,6 +1387,10 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<translation type="unfinished">Salin Perubahan</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 dari dompet '%2'</translation>
+ </message>
+ <message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
@@ -1286,6 +1433,10 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
<numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Sertifikat tidak terverifikasi)</translation>
+ </message>
</context>
<context>
<name>TransactionTableModel</name>
@@ -1318,18 +1469,6 @@ Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadan
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Disalin ke clipboard</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">wallet default</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
@@ -1350,7 +1489,7 @@ wallet</translation>
<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>
+ <translation type="unfinished">%s gagal memvalidasi status snapshot -asumsikan UTXO (Keluaran Transaksi yang tidak terpakai). 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. Status rantai snapshot yang tidak valid akan dibiarkan di disk jika hal ini 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>
@@ -1382,7 +1521,7 @@ wallet</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>
+ <translation type="unfinished">Tingkat penebangan khusus kategori yang tidak didukung %1$s=%2$s. Diharapkan %1$s=&lt;category&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>
@@ -1397,6 +1536,10 @@ wallet</translation>
<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>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">Tidak dapat menulis ke direktori data '%s'; periksa izinnya.</translation>
+ </message>
+ <message>
<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>
@@ -1422,7 +1565,7 @@ wallet</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>
+ <translation type="unfinished">Estimasi biaya gagal. Biaya cadangan 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>
@@ -1430,7 +1573,7 @@ wallet</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>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;amount&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>
@@ -1507,10 +1650,18 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Verifikasi Blok terganggu</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Kesalahan dalam melakukan db txn untuk penghapusan transaksi dompet</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">Kesalahan membaca file konfigurasi: %s</translation>
</message>
<message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Kesalahan memulai db txn untuk penghapusan transaksi 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>
</message>
@@ -1539,20 +1690,44 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Kesalahan: Tidak dapat membaca semua catatan dalam database</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Kesalahan: Tidak dapat membaca catatan pencari blok terbaik dompet</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Kesalahan: Tidak dapat menghapus data buku alamat yang hanya dilihat</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Kesalahan: Tidak dapat menulis catatan pencari blok terbaik dompet solvable</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Kesalahan: Tidak dapat menulis catatan pencari blok terbaik dompet watchonly</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Kesalahan: penyalinan daftar kontak gagal untuk dompet %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Kesalahan: database transaksi tidak dapat dilakukan untuk dompet %s</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">Gagal memulai indeks, mematikan..</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Gagal menghapus transaksi: %s</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>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;amount&gt;: '%s' (harus minimal %s)</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
@@ -1583,8 +1758,8 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<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>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transaksi %s tidak termasuk dompet ini</translation>
</message>
<message>
<source>Unable to find UTXO for external input</source>
@@ -1599,8 +1774,20 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Tingkat penebangan global yang tidak didukung %s = %s. Nilai yang valid: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Pembuatan berkas dompet gagal: %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>
+ <message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Kesalahan: Tidak mampu menambahkan watchonly tx %s ke dompet watchonly</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Kesalahan: Tidak mampu menghapus transaksi watchonly.</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 83410574dd..8a2cf107e1 100644
--- a/src/qt/locale/bitcoin_it.ts
+++ b/src/qt/locale/bitcoin_it.ts
@@ -184,6 +184,14 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Inserisci la vecchia passphrase e la nuova passphrase per il portafoglio.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continua</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Indietro</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">Ricorda che la cifratura del portafoglio non protegge del tutto i tuoi bitcoin dal furto da parte di malware che infettasse il tuo computer.</translation>
</message>
@@ -197,7 +205,7 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Il tuo portafoglio è ora cifrato.</translation>
+ <translation type="unfinished">Il tuo portafoglio ora è cifrato.</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>
@@ -402,7 +410,11 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<numerusform>%n anni</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">portafoglio predefinito</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -427,7 +439,7 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
<message>
<source>Quit application</source>
- <translation type="unfinished">Chiudi applicazione</translation>
+ <translation type="unfinished">Chiudi l'applicazione</translation>
</message>
<message>
<source>&amp;About %1</source>
@@ -560,19 +572,19 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizzando Headers (1%1%)...</translation>
+ <translation type="unfinished">Sincronizzazione Intestazioni in corso (1%1%)...</translation>
</message>
<message>
<source>Synchronizing with network…</source>
- <translation type="unfinished">Sincronizzando con la rete...</translation>
+ <translation type="unfinished">Sincronizzazione con la rete in corso...</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
- <translation type="unfinished">Indicizzando i blocchi su disco...</translation>
+ <translation type="unfinished">Indicizzazione dei blocchi su disco in corso...</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Processando i blocchi su disco...</translation>
+ <translation type="unfinished">Elaborazione dei blocchi su disco in corso...</translation>
</message>
<message>
<source>Connecting to peers…</source>
@@ -635,7 +647,7 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Carica Partially Signed Bitcoin Transaction</translation>
+ <translation type="unfinished">Carica Transazione Bitcoin Parzialmente Firmata (PSBT)</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -712,10 +724,6 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Maschera gli importi nella sezione "Panoramica"</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portafoglio predefinito</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nessun portafoglio disponibile</translation>
</message>
@@ -1080,7 +1088,7 @@ Il processo di migrazione creerà un backup del portafoglio prima della migrazio
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">Migra Wallet</translation>
+ <translation type="unfinished">Migra Portafoglio</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1118,10 +1126,6 @@ Il processo di migrazione creerà un backup del portafoglio prima della migrazio
<translation type="unfinished">Avviso apertura portafoglio</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portafoglio predefinito</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Apri Portafoglio</translation>
@@ -2253,6 +2257,14 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Numero di connessioni</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Indirizzi Locali</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Indirizzi di rete che il tuo nodo Bitcoin sta usando per comunicare con altri nodi.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Catena di Blocchi</translation>
</message>
@@ -2297,6 +2309,10 @@ 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>Hide Peers Detail</source>
+ <translation type="unfinished">Nascondi Dettagli Peers</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versione del livello di trasporto (transport layer): %1</translation>
</message>
@@ -2305,10 +2321,6 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<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>
@@ -2595,6 +2607,10 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Attività di rete disabilitata</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nessuno</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Esecuzione del comando senza alcun portafoglio</translation>
</message>
@@ -3297,8 +3313,8 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">&amp;Firma Messaggio</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">È possibile firmare messaggi/accordi con i propri indirizzi in modo da dimostrare di poter ricevere bitcoin attraverso di essi. Presta attenzione a non firmare dichiarazioni vaghe o casuali, perché attacchi di phishing potrebbero cercare di indurti ad apporre la firma su di esse. Firma esclusivamente dichiarazioni completamente dettagliate e delle quali condividi in pieno il contenuto.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">È possibile firmare messaggi/accordi con i tuoi indirizzi (P2PKH) legacy per dimostrare di poter ricevere bitcoin attraverso di essi. Presta attenzione a non firmare dichiarazioni vaghe o casuali, perché attacchi di phishing potrebbero cercare di indurti ad apporre la firma su di esse. Firma esclusivamente dichiarazioni completamente dettagliate e delle quali condividi in pieno il contenuto.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3385,8 +3401,8 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Per favore controlla l'indirizzo e prova di nuovo.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">L'indirizzo bitcoin inserito non è associato a nessuna chiave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">L'indirizzo inserito non si riferisce a una chiave legacy (P2PKH). La firma dei messaggi per SegWit e altri tipi di indirizzi non P2PKH non è supportata in questa versione di %1. Controlla l'indirizzo e riprova.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3958,9 +3974,8 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">PSBT copiata</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiato negli appunti</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Aumento delle tariffe PSBT copiato negli appunti</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3971,12 +3986,12 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Non è stato possibile completare la transazione</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Non è possibile mostrare l'indirizzo</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Errore del firmatario</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portafoglio predefinito</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Non è possibile mostrare l'indirizzo</translation>
</message>
</context>
<context>
@@ -4110,10 +4125,6 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Nessun formato assegnato al file del portafoglio. Per usare createfromdump, -format=&lt;format&gt; deve essere fornito.</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">Per favore controllate che la data del computer e l'ora siano corrette! Se il vostro orologio è sbagliato %s non funzionerà correttamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Per favore contribuite se ritenete %s utile. Visitate %s per maggiori informazioni riguardo il software.</translation>
</message>
@@ -4222,10 +4233,6 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">-maxmempool deve essere almeno %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Si è verificato un errore interno fatale, consultare debug.log per i dettagli</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Impossobile risolvere l'indirizzo -%s: '%s'</translation>
</message>
@@ -4274,6 +4281,12 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Impossibile rimuovere la directory dello stato della catena dello snapshot (1%s). Rimuovilo manualmente prima di riavviare.
+</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>
@@ -4282,6 +4295,14 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">La stima della tariffa non è riuscita. La Commissione di riserva è disabilitata. Attendere qualche blocco o abilitare %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Lo scaricamento del file di blocco su disco non è riuscito. Questo è probabilmente il risultato di un errore I/O.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Lo scaricamento del file di annullamento su disco non è riuscito. Questo è probabilmente il risultato di un errore I/O.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opzioni incompatibili: -dnsseed=1 è stato specificato esplicitamente, ma -onlynet vieta le connessioni a IPv4/IPv6</translation>
</message>
@@ -4290,6 +4311,14 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Importo non valido per %s=&lt;amount&gt;: '%s' (deve essere almeno la commissione minrelay di %s per evitare transazioni bloccate)</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Il peso massimo della transazione è inferiore al peso della transazione senza input</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Il peso massimo della transazione è troppo basso, non può contenere il resto di ritorno</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Le connessioni in uscita sono limitate a CJDNS (-onlynet=cjdns) ma -cjdnsreachable non è fornito.</translation>
</message>
@@ -4306,6 +4335,14 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Le connessioni in uscita sono limitate a i2p (-onlynet=i2p), ma -i2psam non è fornito.</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Rinominazione di '%s' -&gt; '%s' fallita. Impossibile ripulire la directory di background chainstate leveldb.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">La combinazione degli input preselezionati e della selezione automatica degli input del portafoglio supera il peso massimo della transazione. Prova ad inviare un importo inferiore o a consolidare manualmente gli UTXO del portafoglio.</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">La dimensione degli inputs supera il peso massimo. Si prega di provare a inviare una quantità inferiore o a consolidare manualmente gli UTXO del portafoglio.</translation>
</message>
@@ -4348,6 +4385,10 @@ Provare a eseguire l'ultima versione del software.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">La data e l'ora del computer sembrano essere più di %d minuti fuori sicnronismo con la rete, questo potrebbe causare un errore di consenso. Dopo aver confermato l'orario del computer, questo messaggio non dovrebbe più apparire al riavvio del nodo. Senza un riavvio, dovrebbe smettere di apparire automaticamente dopo che ci si è connessi a un numero sufficiente di nuovi nodi, il che può richiedere del tempo. È possibile ispezionare il campo `timeoffset` dei metodi RPC `getpeerinfo` e `getnetworkinfo` per ottenere maggiori informazioni.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4360,6 +4401,18 @@ Unable to restore backup of wallet.</source>
Non in grado di ripristinare il backup del portafoglio.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind può essere usato solo per le connessioni in entrata ("out" è stato passato)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Si è verificato un errore interno fatale, vedere debug.log per i dettagli: </translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Dati Assumeutxo non trovati per il blockhash fornito '%s'.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">La verifica del blocco è stata interrotta</translation>
</message>
@@ -4372,6 +4425,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Diritto d'autore (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">È stato trovato un blocco corrotto che indica un potenziale guasto hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Rilevato database blocchi corrotto</translation>
</message>
@@ -4400,6 +4457,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Il dumpfile %s non esiste.</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Errore nel controllo di integrità della crittografia a curva ellittica. %s in spegnimento. </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>
@@ -4548,10 +4609,22 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore: la transazione database non può essere eseguita per il portafoglio %s</translation>
</message>
<message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Non è stato possibile connettersi al blocco migliore (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Non è stato possibile scollegare il blocco.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Errore nella lettura del blocco.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Impossibile ripetere la scansione del portafoglio durante l'inizializzazione</translation>
</message>
@@ -4564,10 +4637,31 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore nella verifica del database</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Errore nella scrittura del blocco.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Non è stato possibile scrivere sul database degli indici di blocco.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Impossibile scrivere sul database delle monete.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished"> 
+Errore nella scrittura dei dati di ripristino.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">La rimozione della transazione è fallita: %s</translation>
</message>
<message>
+ <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
+ <translation type="unfinished">Il tasso di conversione(%s) è inferiore al minore tasso di conversione delle impostazioni(%s)</translation>
+ </message>
+ <message>
<source>Ignoring duplicate -wallet %s.</source>
<translation type="unfinished">Ignorando il duplicato -wallet %s.</translation>
</message>
@@ -4656,6 +4750,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Caricando il portafoglio...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Il peso massimo della transazione deve essere tra %d e %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Quantità mancante</translation>
</message>
@@ -4684,6 +4782,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Ingresso pre-selezionato non risolvibile %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">È stata impostata solo la direzione, senza autorizzazioni: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Prune non può essere configurato con un valore negativo.</translation>
</message>
@@ -4728,6 +4830,18 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">La sezione [%s] non è riconosciuta</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">Signer non ha generato un indirizzo di ritorno</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">Signer ha generato un indirizzo imprevisto %s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">Signer restituito un errore: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Firma transazione fallita</translation>
</message>
@@ -4756,6 +4870,19 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">L'esecuzione delle threads della rete sta iniziando...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Errore di sistema in fase di svuotamento: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished"> Errore di sistema in fase di caricamento del file di blocco esterno: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished"> 
+Errore di sistema in fase di salvataggio del blocco nel disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">Il codice sorgente è disponibile in %s</translation>
</message>
@@ -4772,6 +4899,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Il portafoglio eviterà di pagare meno della tariffa minima di trasmissione.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Non c'è uno ScriptPubKeyManager per questo indirizzo</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Questo è un software sperimentale.</translation>
</message>
@@ -4812,10 +4943,6 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Transazione troppo grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossibile allocare memoria per -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Impossibile associarsi a %s su questo computer (l'associazione ha restituito l'errore %s)</translation>
</message>
@@ -4876,6 +5003,10 @@ 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>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opzione non riconosciuta "%s" fornita in -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
@@ -4909,7 +5040,7 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
</message>
<message>
<source>Verifying wallet(s)…</source>
- <translation type="unfinished">Verificando il(i) portafoglio(portafogli)...</translation>
+ <translation type="unfinished">Verifica portafoglio(portafogli) in corso...</translation>
</message>
<message>
<source>Wallet needed to be rewritten: restart %s to complete</source>
diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts
index bdd23b7c04..1b9a9c3ab0 100644
--- a/src/qt/locale/bitcoin_ja.ts
+++ b/src/qt/locale/bitcoin_ja.ts
@@ -3,7 +3,8 @@
<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>
@@ -64,8 +65,7 @@
<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">ã“れらã¯æ”¯æ‰•ã„ã‚’å—ã‘å–ã‚‹ãŸã‚ã®ã€ã‚ãªãŸã® Bitcoin アドレスã§ã™ã€‚æ–°ã—ã„アドレスを作æˆã™ã‚‹ã«ã¯å—å–タブ内ã®ã€Œæ–°ã—ã„å—å–用アドレスを作æˆã€ãƒœã‚¿ãƒ³ã‚’使用ã—ã¾ã™ã€‚
-ç½²åã¯ã€ã‚¿ã‚¤ãƒ—ãŒã€Œãƒ¬ã‚¬ã‚·ãƒ¼ã€ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã¿å¯èƒ½ã§ã™ã€‚</translation>
+ <translation type="unfinished">ã“ã‚ŒãŒæ”¯æ‰•ã„ã‚’å—ã‘å–ã‚‹ãŸã‚ã®ã‚ãªãŸã®ãƒ“ットコインアドレスã§ã™ã€‚æ–°ã—ã„アドレスを作æˆã™ã‚‹ã«ã¯ã€å—信タブã®ã€Œæ–°ã—ã„å—信アドレスを作æˆã€ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦ãã ã•ã„。署åã¯ã€Œãƒ¬ã‚¬ã‚·ãƒ¼ã€ã‚¿ã‚¤ãƒ—ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã®ã¿å¯èƒ½ã§ã™ã€‚</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -81,7 +81,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">アドレス帳をエクスãƒãƒ¼ãƒˆ</translation>
+ <translation type="unfinished">アドレス帳データをエクスãƒãƒ¼ãƒˆã™ã‚‹</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ウォレット用ã®æ—§ãƒ‘スフレーズã¨æ–°ãƒ‘スフレーズを入力ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">続ã‘ã‚‹</translation>
+ </message>
+ <message>
+ <source>Back</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">ウォレットを暗å·åŒ–ã—ã¦ã‚‚ã€ã‚³ãƒ³ãƒ”ュータã«æ„ŸæŸ“ã—ãŸãƒžãƒ«ã‚¦ã‚§ã‚¢ãªã©ã«ã‚ˆã‚‹ Bitcoin ã®ç›—難を完全ã«é˜²ãã“ã¨ã¯ã§ããªã„ã“ã¨ã«ã”注æ„ãã ã•ã„。</translation>
</message>
@@ -303,6 +311,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>
@@ -417,7 +437,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished">%1 KB</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">デフォルトウォレット</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -511,7 +535,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>
@@ -519,15 +543,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>
@@ -535,7 +559,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>
@@ -543,11 +567,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>
@@ -555,7 +579,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">ウォレットを作æˆ...</translation>
+ <translation type="unfinished">ウォレットを作æˆâ€¦</translation>
</message>
<message>
<source>Close All Wallets…</source>
@@ -579,23 +603,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>
@@ -653,7 +677,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">部分的ã«ç½²åã•ã‚ŒãŸBitcoinã®å–引を読ã¿è¾¼ã‚€</translation>
+ <translation type="unfinished">部分的ã«ç½²åã•ã‚ŒãŸãƒ“ットコインã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’読ã¿è¾¼ã¿</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -661,7 +685,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">部分的ã«ç½²åã•ã‚ŒãŸBitcoinã®å–引をクリップボードã‹ã‚‰èª­ã¿è¾¼ã‚€</translation>
+ <translation type="unfinished">部分的ã«ç½²åã•ã‚ŒãŸãƒ“ットコインã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’クリップボードã‹ã‚‰èª­ã¿è¾¼ã¿</translation>
</message>
<message>
<source>Node window</source>
@@ -723,19 +747,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Mask values</source>
- <translation type="unfinished">値を隠㙠(&amp;M)</translation>
+ <translation type="unfinished">&amp;値を隠ã™</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>
+ <translation type="unfinished">ウォレットã¯åˆ©ç”¨ã§ãã¾ã›ã‚“</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -775,23 +795,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">éš ã™ (&amp;H)</translation>
+ <translation type="unfinished">éš ã™</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">表示 (&amp;h)</translation>
+ <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>Bitcoinãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã® %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>
+ <translation type="unfinished">クリックã—ã¦ã€ã‚ˆã‚Šå¤šãã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’表示。</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -801,16 +821,16 @@ 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>
@@ -952,11 +972,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>
@@ -964,7 +984,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>
@@ -988,7 +1008,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ã¨ã‚¢ã‚¦ãƒˆãƒ—ットã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’コピー(&amp;I)</translation>
+ <translation type="unfinished">å–引IDã¨ã‚¢ã‚¦ãƒˆãƒ—ットã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’コピー</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
@@ -1000,7 +1020,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>
@@ -1032,11 +1052,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>
@@ -1057,7 +1077,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>
@@ -1105,7 +1125,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">ウォレットを移行ã™ã‚‹</translation>
+ <translation type="unfinished">ウォレットã®ç§»è¡Œ</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1143,10 +1163,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1594,6 +1610,10 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -2331,10 +2351,6 @@ BIP70ã«ã¯åºƒç¯„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼ä¸Šã®å•é¡ŒãŒã‚ã‚‹ã®ã§ã€ã‚¦ã‚©ãƒ¬
<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>
@@ -2441,6 +2457,10 @@ BIP70ã«ã¯åºƒç¯„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼ä¸Šã®å•é¡ŒãŒã‚ã‚‹ã®ã§ã€ã‚¦ã‚©ãƒ¬
<translation type="unfinished">æ–¹å‘/タイプ</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">BIP324 ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ ID ã®16進文字列</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, or CJDNS.</translation>
</message>
@@ -2633,10 +2653,18 @@ BIP70ã«ã¯åºƒç¯„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼ä¸Šã®å•é¡ŒãŒã‚ã‚‹ã®ã§ã€ã‚¦ã‚©ãƒ¬
<translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ´»å‹•ãŒåœæ­¢ã—ã¾ã—ãŸ</translation>
</message>
<message>
+ <source>None</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>
@@ -2885,7 +2913,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>
@@ -3184,7 +3212,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>%1 kvB</source>
<comment>PSBT transaction creation</comment>
<extracomment>When reviewing a newly created PSBT (via Send flow), the transaction fee is shown, with "virtual size" of the transaction displayed for context</extracomment>
- <translation type="unfinished"> %1 kvB</translation>
+ <translation type="unfinished">%1kvB</translation>
</message>
<message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
@@ -3244,10 +3272,6 @@ 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">
@@ -3272,7 +3296,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>
@@ -3356,8 +3380,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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">ã‚ãªãŸãŒæ‰€æœ‰ã—ã¦ã„るアドレスã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚„契約書ã«ç½²åã‚’ã™ã‚‹ã“ã¨ã§ã€ãれらã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¸é€ã‚‰ã‚ŒãŸ Bitcoin ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã‚‹ã“ã¨ã‚’証明ã§ãã¾ã™ã€‚フィッシング攻撃者ãŒã‚ãªãŸã‚’騙ã—ã¦ã€ã‚ãªãŸã®èº«åˆ†æƒ…å ±ã«ç½²åã•ã›ã‚ˆã†ã¨ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€ã‚ˆãã‚ã‹ã‚‰ãªã„ã‚‚ã®ã‚„ランダムãªæ–‡å­—列ã«å¯¾ã—ã¦ç½²åã—ãªã„ã§ãã ã•ã„。ã‚ãªãŸãŒåŒæ„ã—ãŸã€ã‚ˆã詳細ã®è¨˜ã•ã‚ŒãŸæ–‡è¨€ã«ã®ã¿ç½²åã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">ã‚ãªãŸã®æ‰€æœ‰ã—ã¦ã„るレガシー(P2PKH)アドレスã«ã‚ˆã‚Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚„åˆæ„書ã«ç½²åã‚’ã™ã‚‹ã“ã¨ã§ã€ãれらアドレスã«å¯¾ã—ã¦é€ã‚‰ã‚ŒãŸãƒ“ットコインをå—ã‘å–ã‚‹ã“ã¨ãŒã§ãã‚‹ã“ã¨ã‚’証明ã§ãã¾ã™ã€‚フィッシング攻撃ã«ã‚ˆã‚Šä¸æ­£ã«ã‚ãªãŸã®è­˜åˆ¥æƒ…報を署åã•ã›ã‚‰ã‚Œã¦ã—ã¾ã†ã“ã¨ã‚’防ããŸã‚ã«ã€ä¸æ˜Žç¢ºãªã‚‚ã®ã‚„ランダムãªã‚‚ã®ã«å¯¾ã—ã¦ç½²åã—ãªã„よã†æ³¨æ„ã—ã¦ãã ã•ã„。ã‚ãªãŸãŒåŒæ„ã—ãŸã€ã‚ˆã詳細ã®è¨˜ã•ã‚ŒãŸæ–‡è¨€ã«ã®ã¿ç½²åã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3444,8 +3468,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>The entered address does not refer to a key.</source>
- <translation type="unfinished">入力ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«ç´ã¥ãéµãŒã‚ã‚Šã¾ã›ã‚“。</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">入力ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãƒ¬ã‚¬ã‚·ãƒ¼ (P2PKH) éµã‚’指ã—ã¦ã„ã¾ã›ã‚“。 SegWit ãŠã‚ˆã³ãã®ä»–ã®éž P2PKH アドレス タイプã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ç½²åã¯ã€%1ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。アドレスを確èªã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3748,7 +3772,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>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
@@ -4019,9 +4043,8 @@ 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>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">手数料引ã上ã’ã®PSBTをクリップボードã«ã‚³ãƒ”ーã—ã¾ã—ãŸ</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4032,12 +4055,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>
+ <source>Signer error</source>
+ <translation type="unfinished">サイナーエラー</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">デフォルトウォレット</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">アドレスを表示ã§ãã¾ã›ã‚“</translation>
</message>
</context>
<context>
@@ -4171,10 +4194,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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">ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®æ—¥ä»˜ã¨æ™‚刻ãŒæ­£ã—ã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„ï¼ PCã®æ™‚計ãŒæ­£ã—ããªã„å ´åˆ %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>
@@ -4283,10 +4302,6 @@ 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>
@@ -4335,6 +4350,12 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">未承èªã® UTXO ã¯æœªæ‰¿èªã®å–引ã®å·¨å¤§ãªã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«ä¾å­˜ã—ã¦ã„ã‚‹ãŸã‚ã€ãƒãƒ³ãƒ—料金ã®è¨ˆç®—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
</message>
<message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">スナップショットã®chainstateディレクトリ(%s)を削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚å†èµ·å‹•ã™ã‚‹å‰ã«æ‰‹å‹•ã§å‰Šé™¤ã—ã¦ãã ã•ã„。
+</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>
@@ -4343,6 +4364,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">手数料推定ã«å¤±æ•—ã—ã¾ã—ãŸã€‚代替手数料ãŒç„¡åŠ¹ã§ã™ã€‚数ブロック待ã¤ã‹ã€%s オプションを有効ã«ã—ã¦ãã ã•ã„。</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">ブロックファイルã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã“ã‚Œã¯I/Oエラーã®çµæžœã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">å…ƒã¸æˆ»ã™ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã“ã‚Œã¯I/Oエラーã®çµæžœã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚</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>
@@ -4351,6 +4380,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s=&lt;amount&gt; オプションã«å¯¾ã™ã‚‹ä¸æ­£ãªé‡‘é¡: '%s' (å–引ã®åœæ»žé˜²æ­¢ã®ãŸã‚ã€æœ€å°ä¸­ç¶™æ‰‹æ•°æ–™ã® %s より大ãã„å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰</translation>
</message>
<message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">最大トランザクションweightãŒã‚¤ãƒ³ãƒ—ットã®ãªã„トランザクションweightよりもå°ã•ã„</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">最大トランザクションweightãŒä½Žã™ãŽã‚‹ãŸã‚ã€ãŠé‡£ã‚Šç”¨ã®ã‚¢ã‚¦ãƒˆãƒ—ットã«å¯¾å¿œã§ãã¾ã›ã‚“</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>
@@ -4367,6 +4404,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">アウトãƒã‚¦ãƒ³ãƒ‰æŽ¥ç¶šãŒi2p (-onlynet=i2p)ã«åˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ãŒã€-i2psamãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">「%sã€-&gt;「%sã€ã¸ã®å称変更ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§chainstate leveldbディレクトリã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ãŒã§ãã¾ã›ã‚“。</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">事å‰ã«é¸æŠžã•ã‚ŒãŸã‚¤ãƒ³ãƒ—ットã¨ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®è‡ªå‹•ã‚¤ãƒ³ãƒ—ットé¸æŠžã®çµ„ã¿åˆã‚ã›ãŒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®æœ€å¤§weightを超ãˆã¾ã—ãŸã€‚より少ãªã„金é¡ã‚’é€ä¿¡ã™ã‚‹ã‹ã€ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®UTXOを手動ã§çµ±åˆã—ã¦ã¿ã¦ãã ã•ã„</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>
</message>
@@ -4409,6 +4454,10 @@ Please try running the latest software version.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">コンピューターã®æ—¥ä»˜ã¨æ™‚é–“ãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¨%d分以上ãšã‚Œã¦ã„るよã†ã§ã™ã€‚ã“ã‚Œã¯ã‚³ãƒ³ã‚»ãƒ³ã‚µã‚¹ã‚¨ãƒ©ãƒ¼ã«ã¤ãªãŒã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚コンピューターã®æ™‚計を確èªã—ãŸå¾Œã€ãƒŽãƒ¼ãƒ‰ã‚’å†èµ·å‹•ã™ã‚‹ã¨ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•ã‚Œãªããªã‚Šã¾ã™ã€‚å†èµ·å‹•ã—ãªã„å ´åˆã¯ã€å分ãªæ•°ã®æ–°ã—ã„アウトãƒã‚¦ãƒ³ãƒ‰ãƒ”ã‚¢ã«æŽ¥ç¶šã™ã‚‹ã¨è¡¨ç¤ºã•ã‚Œãªããªã‚Šã¾ã™ãŒã€ã“ã‚Œã«ã¯æ™‚é–“ãŒã‹ã‹ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚`getpeerinfo` RPCãŠã‚ˆã³ `getnetworkinfo` RPCメソッドã®`timeoffset`フィールドを調ã¹ã‚‹ã¨è©³ç´°ãŒå¾—られã¾ã™ã€‚</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4421,6 +4470,18 @@ Unable to restore backup of wallet.</source>
ウォレットã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を復元ã§ãã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebindã¯å—信接続ã®ã¿ã«ä½¿ç”¨ã§ãã¾ã™ï¼ˆ"out"ãŒæ¸¡ã•ã‚Œã¾ã—ãŸï¼‰</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">致命的ãªå†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚詳細ã¯ãƒ‡ãƒãƒƒã‚°ç”¨ã®ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ« debug.log ã‚’å‚ç…§ã—ã¦ãã ã•ã„:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">指定ã•ã‚ŒãŸãƒ–ロックãƒãƒƒã‚·ãƒ¥ã€Œ%sã€ã«å¯¾ã™ã‚‹assumeutxoデータãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">ブロック検証ãŒä¸­æ–­ã•ã‚Œã¾ã—ãŸ</translation>
</message>
@@ -4429,6 +4490,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">%s ã®è¨­å®šã¯ã€ [%s] セクションã«æ›¸ã‹ã‚ŒãŸå ´åˆã®ã¿ %s ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸é©ç”¨ã•ã‚Œã¾ã™ã€‚</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">潜在的ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢éšœå®³ã‚’示ã™ç ´æブロックãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">ç ´æã—ãŸãƒ–ロック データベースãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ</translation>
</message>
@@ -4457,6 +4522,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ダンプファイル %s ãŒå­˜åœ¨ã—ã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">楕円曲線暗å·ã®å¥å…¨æ€§ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸã€‚%sを終了ã—ã¾ã™ã€‚</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">ウォレットトランザクションã®å‰Šé™¤ã®ãŸã‚db txnã®ã‚³ãƒŸãƒƒãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">%sã®ä½œæˆã‚¨ãƒ©ãƒ¼</translation>
</message>
@@ -4505,6 +4578,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ウォレットデータベースã‹ã‚‰æ¬¡ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®èª­ã¿å–ã‚Šã§ã‚¨ãƒ©ãƒ¼</translation>
</message>
<message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">ウォレットトランザクションã®å‰Šé™¤ã®ãŸã‚ã®db txnã®é–‹å§‹ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ</translation>
+ </message>
+ <message>
<source>Error: Cannot extract destination from the generated scriptpubkey</source>
<translation type="unfinished">エラー: 生æˆã•ã‚ŒãŸscriptpubkeyã‹ã‚‰å®›å…ˆã‚’抽出ã§ãã¾ã›ã‚“</translation>
</message>
@@ -4589,10 +4666,30 @@ Unable to restore backup of wallet.</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 connect best block (%s).</source>
+ <translation type="unfinished">ベストブロック(%s)ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">ブロックã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">åˆæœŸåŒ–中ã«ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã®å†ã‚¹ã‚­ãƒ£ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
</message>
@@ -4605,6 +4702,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">データベースã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">ブロックã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">ブロックインデックスデータベースã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">コインデータベースã¸ã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</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>
@@ -4697,6 +4814,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ウォレットã®èª­ã¿è¾¼ã¿ä¸­â€¦</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">最大トランザクションweightã¯%dã‹ã‚‰%dã®é–“ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">金é¡ä¸è¶³</translation>
</message>
@@ -4725,6 +4846,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">事å‰é¸æŠžã•ã‚ŒãŸã‚¤ãƒ³ãƒ—ット%sãŒè§£æ±ºã§ãã¾ã›ã‚“</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">æ–¹å‘ã®ã¿ãŒè¨­å®šã•ã‚Œã¦ãŠã‚Šã€æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">剪定モードã®è¨­å®šå€¤ã¯è² ã®å€¤ã«ã¯ã§ãã¾ã›ã‚“。</translation>
</message>
@@ -4769,6 +4894,18 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">セクションå [%s] ã¯èªè­˜ã•ã‚Œã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">サイナーãŒã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’エコーã—ã¾ã›ã‚“ã§ã—ãŸ</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">サイナーãŒäºˆæœŸã—ãªã„アドレス%sをエコーã—ã¾ã—ãŸ</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">サイナーãŒã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã—ãŸ: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">å–引ã®ç½²åã«å¤±æ•—ã—ã¾ã—ãŸ</translation>
</message>
@@ -4797,6 +4934,18 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¹ãƒ¬ãƒƒãƒ‰ã®èµ·å‹•ä¸­â€¦</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">フラッシュ中ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">外部ブロックファイルã®ãƒ­ãƒ¼ãƒ‰ä¸­ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">ブロックをディスクã«ä¿å­˜ä¸­ã«ã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">ソースコード㯠%s ã‹ã‚‰å…¥æ‰‹ã§ãã¾ã™ã€‚</translation>
</message>
@@ -4813,6 +4962,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ウォレットã¯æœ€å°ä¸­ç¶™æ‰‹æ•°æ–™ã‚’下回る金é¡ã¯æ”¯æ‰•ã„ã¾ã›ã‚“。</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã¯ScriptPubKeyManagerãŒã‚ã‚Šã¾ã›ã‚“</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">ã“ã‚Œã¯å®Ÿé¨“用ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚</translation>
</message>
@@ -4825,6 +4978,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>
@@ -4849,10 +5006,6 @@ Unable to restore backup of wallet.</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 ã«ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“(%s エラーãŒè¿”ã•ã‚Œã¾ã—ãŸï¼‰</translation>
</message>
@@ -4913,6 +5066,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">ä¸æ˜Žãªæ–°ãƒ«ãƒ¼ãƒ«ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ãƒˆã•ã‚Œã¾ã—㟠(versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished"> -test=&lt;option&gt;ã§æä¾›ã•ã‚ŒãŸã‚ªãƒ—ション「%sã€ãŒèªè­˜ã•ã‚Œã¾ã›ã‚“。</translation>
+ </message>
+ <message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
<translation type="unfinished">未サãƒãƒ¼ãƒˆã®ãƒ­ã‚°ãƒ¬ãƒ™ãƒ« %s=%s。 æ­£ã—ã„値ã¯: %s。</translation>
</message>
@@ -4933,6 +5090,10 @@ Unable to restore backup of 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_ka.ts b/src/qt/locale/bitcoin_ka.ts
index e15938e277..157fcc3376 100644
--- a/src/qt/locale/bitcoin_ka.ts
+++ b/src/qt/locale/bitcoin_ka.ts
@@ -176,6 +176,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">შეიყვáƒáƒœáƒ”თ ძველი სáƒáƒ˜áƒ“უმლრფრáƒáƒ–რდრáƒáƒ®áƒáƒšáƒ˜ სáƒáƒ˜áƒ“უმლრფრáƒáƒ–რსáƒáƒ¤áƒ£áƒšáƒ˜áƒ¡áƒ—ვის</translation>
</message>
<message>
+ <source>Continue</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>
@@ -368,7 +372,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">ნáƒáƒ’ულისხმევი სáƒáƒ¤áƒ£áƒšáƒ”</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -433,6 +441,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -642,10 +654,6 @@ 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>No wallets available</source>
<translation type="unfinished">áƒáƒ  áƒáƒ áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული სáƒáƒ¤áƒ£áƒšáƒ”.</translation>
</message>
@@ -923,10 +931,6 @@ 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>
@@ -2333,10 +2337,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -2780,11 +2780,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">მáƒáƒœáƒ”ტების გáƒáƒ’ზáƒáƒ•áƒœáƒ</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">ნáƒáƒ’ულისხმევი სáƒáƒ¤áƒ£áƒšáƒ”</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2844,10 +2840,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>Corrupted block database detected</source>
<translation type="unfinished">შენიშნულირბლáƒáƒ™áƒ—რბáƒáƒ–ის დáƒáƒ–იáƒáƒœáƒ”ბáƒ</translation>
</message>
diff --git a/src/qt/locale/bitcoin_kk.ts b/src/qt/locale/bitcoin_kk.ts
index d40c6e56a1..4346f22521 100644
--- a/src/qt/locale/bitcoin_kk.ts
+++ b/src/qt/locale/bitcoin_kk.ts
@@ -481,7 +481,7 @@
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 артта</translation>
+ <translation type="unfinished">%1 қалмады</translation>
</message>
<message>
<source>Catching up…</source>
@@ -489,7 +489,7 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Қате</translation>
+ <translation type="unfinished">қате</translation>
</message>
<message>
<source>Warning</source>
@@ -497,7 +497,7 @@
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Ðқпарат</translation>
+ <translation type="unfinished">ИнформациÑ</translation>
</message>
<message>
<source>Up to date</source>
diff --git a/src/qt/locale/bitcoin_kk@latin.ts b/src/qt/locale/bitcoin_kk@latin.ts
index 981b8a191c..af3d2abe58 100644
--- a/src/qt/locale/bitcoin_kk@latin.ts
+++ b/src/qt/locale/bitcoin_kk@latin.ts
@@ -481,7 +481,7 @@
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 артта</translation>
+ <translation type="unfinished">%1 қалмады</translation>
</message>
<message>
<source>Catching up…</source>
@@ -489,7 +489,7 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Қате</translation>
+ <translation type="unfinished">қате</translation>
</message>
<message>
<source>Warning</source>
@@ -497,7 +497,7 @@
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Ðқпарат</translation>
+ <translation type="unfinished">ИнформациÑ</translation>
</message>
<message>
<source>Up to date</source>
diff --git a/src/qt/locale/bitcoin_km.ts b/src/qt/locale/bitcoin_km.ts
index e62aee0aff..36d0852039 100644
--- a/src/qt/locale/bitcoin_km.ts
+++ b/src/qt/locale/bitcoin_km.ts
@@ -184,6 +184,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">វាយបញ្ចូលឃ្លាសម្ងាážáŸ‹áž…ាស់ និងឃ្លាសសម្លាážáŸ‹ážáŸ’មី សម្រាប់កាបូបចលáŸážážšáž”ស់អ្នក។</translation>
</message>
<message>
+ <source>Continue</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">សូមចងចាំážáž¶áž€áž¶ážšáž¢áŸŠáž·áž“គ្រីបកាបូបរបស់អ្នកមិនអាចការពារបានពáŸáž‰áž›áŸáž‰áž“ូវ bitcoins របស់អ្នកពីការលួចដោយមáŸážšáŸ„គដែលឆ្លងកុំព្យូទáŸážšážšáž”ស់អ្នក។</translation>
</message>
@@ -372,7 +376,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished"> %1 kB</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">កាបូបលំនាំដើម</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -400,6 +408,14 @@ 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">&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">អំពី &amp;Qt</translation>
</message>
@@ -642,6 +658,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">កាបូបMigrate</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">ážáž˜áŸ’លៃMask​(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">ážáž˜áŸ’លៃMaskនៅក្នុងážáŸáž”ទិដ្ឋភាពទូទៅ</translation>
+ </message>
+ <message>
<source>No wallets available</source>
<translation type="unfinished">មិនមានកាបូបអáŸáž¡áž·áž…ážáŸ’រូនិច</translation>
</message>
@@ -667,15 +695,23 @@ 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;W)</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>
+ <translation type="unfinished">លាក់(&amp;H)</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">S&amp;របៀប</translation>
+ <translation type="unfinished">របៀប(&amp;S)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -706,6 +742,10 @@ 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>
@@ -888,6 +928,14 @@ Signing is only possible with addresses of the type 'legacy'.</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>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">អាច +/- %1 satoshi(s)ច្រើនក្នុងការបញ្ជូលមួយ។</translation>
</message>
@@ -1900,6 +1948,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">សកម្មភាពបណ្ážáž¶áž‰ ážáŸ’រូវបានដាក់អោយប្រើការលែងបាន។</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">មិន</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ប្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž”ញ្ជារដោយគ្មានកាបូបអáŸáž¡áž·áž…ážáŸ’រូនិច។</translation>
</message>
@@ -1908,6 +1960,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ctrl+T</translation>
</message>
<message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">ប្រážáŸ’ážáž·áž”ážáŸ’ážáž·áž”ញ្ចារដោយប្រើ​ ៉​%1​​ ៉ កាបូបអáŸáž¡áž·áž…ážáŸ’រូនិច</translation>
+ </message>
+ <message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished">កំពុង​ប្រážáž·áž”ážáŸ’ážáž·â€¦</translation>
@@ -2027,7 +2083,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2078,7 +2138,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>Payment information</source>
<translation type="unfinished">áž–áŸážáŸáž˜áž¶áž“ទូរទាážáŸ‹áž”្រាក់</translation>
</message>
- </context>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">សំណើរសុំទូរទាážáŸ‹áž”្រាក់ដល់​ %1</translation>
+ </message>
+</context>
<context>
<name>RecentRequestsTableModel</name>
<message>
@@ -2091,7 +2155,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(គ្មាន​ស្លាក​)</translation>
+ <translation type="unfinished">(គ្មាន​ស្លាក​សញ្ញា)</translation>
</message>
<message>
<source>(no message)</source>
@@ -2233,6 +2297,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>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>
@@ -2247,6 +2315,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">កំណážáŸ‹áž‘ីážáž¶áŸ†áž„script អ្នកចុះហážáŸ’ážáž›áŸážáž¶ážáž¶áž„ក្រៅនៅក្នុងជម្រើស -&gt; កាបូប</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>
@@ -2291,6 +2363,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>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>
@@ -2334,6 +2411,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 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>
@@ -2341,6 +2422,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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">
@@ -2350,7 +2435,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>
@@ -2545,6 +2630,16 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -2637,6 +2732,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TransactionDescDialog</name>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">លម្អិហ%1</translation>
+ </message>
+</context>
+<context>
<name>TransactionTableModel</name>
<message>
<source>Date</source>
@@ -2659,6 +2761,14 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">បានបោះបង់</translation>
</message>
<message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">កំពុងបញ្ចាក់(%1 នៃ %2 សáŸáž…ក្ážáž¸áž”ញ្ចាក់ដែលបានណែនាំ)</translation>
+ </message>
+ <message>
+ <source>Confirmed (%1 confirmations)</source>
+ <translation type="unfinished">បានបញ្ចាក់(%1 ការបញ្ចាក់)</translation>
+ </message>
+ <message>
<source>Conflicted</source>
<translation type="unfinished">បានប្រឆាំងážáž‘ល់គ្នា</translation>
</message>
@@ -2692,7 +2802,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>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
@@ -2815,10 +2925,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>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>
@@ -2910,10 +3028,18 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
diff --git a/src/qt/locale/bitcoin_ko.ts b/src/qt/locale/bitcoin_ko.ts
index ebf24eb372..9649183026 100644
--- a/src/qt/locale/bitcoin_ko.ts
+++ b/src/qt/locale/bitcoin_ko.ts
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ì§€ê°‘ì˜ ì´ì „ 비밀번호와 새로운 비밀번호를 입력하세요.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">계ì†í•˜ê¸°</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -421,6 +429,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 기가바ì´íŠ¸</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">기본 지갑</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -730,10 +742,6 @@ 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>No wallets available</source>
<translation type="unfinished">사용 가능한 블ë¡ì´ 없습니다.</translation>
</message>
@@ -1088,10 +1096,6 @@ 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>
@@ -2499,6 +2503,10 @@ BIP70ì˜ ê´‘ë²”ìœ„í•œ 보안 결함으로 ì¸í•´ 모든 가맹ì ì—서는 지ê°
<translation type="unfinished">ë„¤íŠ¸ì›Œí¬ í™œë™ì´ 정지ë˜ì—ˆìŠµë‹ˆë‹¤.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">ì—†ìŒ</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">지갑 ì—†ì´ ëª…ë ¹ 실행</translation>
</message>
@@ -2520,8 +2528,7 @@ For more information on using this console, type %6.
3%3ê³¼ 4%4ì„ ì‚¬ìš©í•˜ì—¬ 글꼴 í¬ê¸° ì¦ê°€ ë˜ëŠ” ê°ì†Œí•˜ì„¸ìš”
사용 가능한 ëª…ë ¹ì˜ ê°œìš”ë¥¼ 보려면 5%5를 입력하십시오.
ì´ ì½˜ì†” ì‚¬ìš©ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì„ ë³´ë ¤ë©´ 6%6ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤.
-7%7 경고: ì‚¬ê¸°ê¾¼ë“¤ì€ ì‚¬ìš©ìžë“¤ì—게 ì—¬ê¸°ì— ëª…ë ¹ì„ ìž…ë ¥í•˜ë¼ê³  ë§í•˜ê³  활발히 ê¸ˆí’ˆì„ í›”ì¹©ë‹ˆë‹¤. 완전히 ì´í•´í•˜ì§€ ì•Šê³  ì´ ì½˜ì†”ì„ ì‚¬ìš©í•˜ì§€ 마십시오. 8%8
-</translation>
+7%7 경고: ì‚¬ê¸°ê¾¼ë“¤ì€ ì‚¬ìš©ìžë“¤ì—게 ì—¬ê¸°ì— ëª…ë ¹ì„ ìž…ë ¥í•˜ë¼ê³  ë§í•˜ê³  활발히 ê¸ˆí’ˆì„ í›”ì¹©ë‹ˆë‹¤. 완전히 ì´í•´í•˜ì§€ ì•Šê³  ì´ ì½˜ì†”ì„ ì‚¬ìš©í•˜ì§€ 마십시오. 8%8</translation>
</message>
<message>
<source>Executing…</source>
@@ -3178,10 +3185,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3266,10 +3269,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>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>
@@ -3828,11 +3827,6 @@ 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>
@@ -3844,10 +3838,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -3960,10 +3950,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">shshhdchb bdfjj fb rciivfjb doffbfbdjdj</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>
@@ -4036,10 +4022,6 @@ 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>
@@ -4085,13 +4067,11 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Dump file %s does not exist.</source>
- <translation type="unfinished">íŒŒì¼ ë²„ë¦¬ê¸° 1%s 존재 안함
-</translation>
+ <translation type="unfinished">íŒŒì¼ ë²„ë¦¬ê¸° %s 존재 안함</translation>
</message>
<message>
<source>Error creating %s</source>
- <translation type="unfinished">만들기 오류 1%s
-</translation>
+ <translation type="unfinished">만들기 오류 %s</translation>
</message>
<message>
<source>Error initializing block database</source>
@@ -4162,6 +4142,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ê²€ì¦ ì‹¤íŒ¨</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">중복 -지갑 %s를 무시합니다.</translation>
+ </message>
+ <message>
<source>Importing…</source>
<translation type="unfinished">불러오는 중...</translation>
</message>
@@ -4258,6 +4246,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ì—스íì—˜ë¼ì´íŠ¸ ë°ì´í„°ë² ì´ìŠ¤ : ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 확ì¸í•˜ëŠ” 실행문 ì¤€ë¹„ì— ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤ : %s.</translation>
</message>
<message>
+ <source>SQLiteDatabase: Failed to read database verification error: %s</source>
+ <translation type="unfinished">ì—스íì—˜ë¼ì´íŠ¸ ë°ì´í„°ë² ì´ìŠ¤ : ë°ì´í„°ë² ì´ìŠ¤ ì½ê¸°ë¥¼ 실패하였습니다: %s</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
<translation type="unfinished">ì—스íì—˜ë¼ì´íŠ¸ ë°ì´í„°ë² ì´ìŠ¤ : ì˜ˆìƒ ëª»í•œ 어플리케ì´ì…˜ ì•„ì´ë””. 예정: %u, ë°›ìŒ: %u</translation>
</message>
@@ -4362,6 +4354,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">알 수 없는 -blockfileterindex 값 %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>
diff --git a/src/qt/locale/bitcoin_ku.ts b/src/qt/locale/bitcoin_ku.ts
index f8738fd9dc..9dc3995fa0 100644
--- a/src/qt/locale/bitcoin_ku.ts
+++ b/src/qt/locale/bitcoin_ku.ts
@@ -236,11 +236,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Ùایل</translation>
+ <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>
@@ -263,7 +263,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">زانیاری</translation>
+ <translation type="unfinished">Agahî</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -612,7 +612,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(etîket tune)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -660,7 +662,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(etîket tune)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -755,7 +759,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(etîket tune)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -814,10 +820,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>bitcoin-core</name>
<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>
diff --git a/src/qt/locale/bitcoin_ku_IQ.ts b/src/qt/locale/bitcoin_ku_IQ.ts
index adbdec36fb..3bec55511b 100644
--- a/src/qt/locale/bitcoin_ku_IQ.ts
+++ b/src/qt/locale/bitcoin_ku_IQ.ts
@@ -236,11 +236,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Ùایل</translation>
+ <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>
@@ -612,7 +612,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ناونیشان نییە)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -660,7 +662,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ناونیشان نییە)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -755,7 +759,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ناونیشان نییە)</translation>
+ <translation type="unfinished">(بێ ناونیشان)
+
+</translation>
</message>
</context>
<context>
@@ -814,10 +820,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>bitcoin-core</name>
<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>
diff --git a/src/qt/locale/bitcoin_la.ts b/src/qt/locale/bitcoin_la.ts
index eaf3c35f2d..8a564fcd2a 100644
--- a/src/qt/locale/bitcoin_la.ts
+++ b/src/qt/locale/bitcoin_la.ts
@@ -1,230 +1,50 @@
<TS version="2.1" language="la">
<context>
- <name>AddressBookPage</name>
- <message>
- <source>Create a new address</source>
- <translation type="unfinished">Crea novam inscriptionem</translation>
- </message>
- <message>
- <source>&amp;New</source>
- <translation type="unfinished">&amp;Novus</translation>
- </message>
- <message>
- <source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copia inscriptionem iam selectam in latibulum systematis</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation type="unfinished">&amp;Transcribe</translation>
- </message>
- <message>
- <source>C&amp;lose</source>
- <translation type="unfinished">C&amp;laude</translation>
- </message>
- <message>
- <source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Dele active selectam inscriptionem ex enumeratione</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation type="unfinished">Insere inscriptionem vel titulum ut quaeras</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporta data in hac tabella in plicam</translation>
- </message>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">&amp;Exporta</translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <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>
- <message>
- <source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;Copia Inscriptionem</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation type="unfinished">Copia &amp;Titulum</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation type="unfinished">&amp;Muta</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation type="unfinished">Exporta Index Inscriptionum</translation>
- </message>
- </context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation type="unfinished">Titulus</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Inscriptio</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(nullus titulus)</translation>
- </message>
-</context>
-<context>
- <name>AskPassphraseDialog</name>
- <message>
- <source>Passphrase Dialog</source>
- <translation type="unfinished">Dialogus Tesserae</translation>
- </message>
- <message>
- <source>Enter passphrase</source>
- <translation type="unfinished">Insere tesseram</translation>
- </message>
- <message>
- <source>New passphrase</source>
- <translation type="unfinished">Nova tessera</translation>
- </message>
- <message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">Itera novam tesseram</translation>
- </message>
- <message>
- <source>Show passphrase</source>
- <translation type="unfinished">Ostende tesseram</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation type="unfinished">Cifra cassidile</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Huic operationi necesse est tessera cassidili tuo ut cassidile reseret.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation type="unfinished">Resera cassidile</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation type="unfinished">Muta tesseram</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation type="unfinished">Confirma cifrationem cassidilis</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">Monitio: Si cassidile tuum cifras et tesseram amittis, tu &lt;b&gt;AMITTES OMNES TUOS NUMMOS BITOS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">Certusne es te velle tuum cassidile cifrare?</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation type="unfinished">Cassidile cifratum</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">GRAVE: Oportet ulla prioria conservata quae fecisti de plica tui cassidilis reponi a nove generata cifrata plica cassidilis. Propter securitatem, prioria conservata de plica non cifrata cassidilis inutilia fiet simul atque incipis uti novo cifrato cassidili.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation type="unfinished">Cassidile cifrare abortum est</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">Cassidile cifrare abortum est propter internum errorem. Tuum cassidile cifratum non est.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Tesserae datae non eaedem sunt.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation type="unfinished">Cassidile reserare abortum est.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">Tessera inserta pro cassidilis decifrando prava erat.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">Tessera cassidilis successa est in mutando.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">Monitio: Litterae ut capitales seratae sunt!</translation>
- </message>
-</context>
-<context>
- <name>BanTableModel</name>
- <message>
- <source>Banned Until</source>
- <translation type="unfinished">Interdictum usque ad</translation>
- </message>
-</context>
-<context>
<name>QObject</name>
<message>
- <source>unknown</source>
- <translation type="unfinished">ignotum</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">Quantitas</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <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 />
- <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 />
- <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 />
- <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 />
- <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 />
- <numerusform />
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
</context>
@@ -325,8 +145,8 @@
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
</translation>
</message>
<message>
@@ -361,38 +181,14 @@
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
- <message>
- <source>Sent transaction</source>
- <translation type="unfinished">Transactio missa</translation>
- </message>
- <message>
- <source>Incoming transaction</source>
- <translation type="unfinished">Transactio incipiens</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">Cassidile &lt;b&gt;cifratum&lt;/b&gt; est et iam nunc &lt;b&gt;reseratum&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">Cassidile &lt;b&gt;cifratum&lt;/b&gt; est et iam nunc &lt;b&gt;seratum&lt;/b&gt;</translation>
- </message>
</context>
<context>
<name>CoinControlDialog</name>
<message>
- <source>Bytes:</source>
- <translation type="unfinished">Octecti:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Quantitas:</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">Quantitas</translation>
</message>
@@ -414,124 +210,40 @@
</message>
</context>
<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">Cassidile</translation>
- </message>
- </context>
-<context>
- <name>EditAddressDialog</name>
- <message>
- <source>Edit Address</source>
- <translation type="unfinished">Muta Inscriptionem</translation>
- </message>
- <message>
- <source>&amp;Label</source>
- <translation type="unfinished">&amp;Titulus</translation>
- </message>
- <message>
- <source>&amp;Address</source>
- <translation type="unfinished">&amp;Inscriptio</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">Nova inscriptio mittendi</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation type="unfinished">Muta inscriptionem accipiendi</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation type="unfinished">Muta inscriptionem mittendi</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">Inscriptio inserta "%1" non valida inscriptio Bitcoin est.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Non potuisse cassidile reserare</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation type="unfinished">Generare novam clavem abortum est.</translation>
- </message>
-</context>
-<context>
<name>Intro</name>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <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 />
- <numerusform />
+ <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 />
- <numerusform />
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</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>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
</translation>
</message>
</context>
<context>
- <name>HelpMessageDialog</name>
- <message>
- <source>version</source>
- <translation type="unfinished">versio</translation>
- </message>
- <message>
- <source>Command-line options</source>
- <translation type="unfinished">Optiones mandati initiantis</translation>
- </message>
-</context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">Schema</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Hora postremi frusti</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">Glutina inscriptionem ex latibulo</translation>
- </message>
-</context>
-<context>
<name>OptionsDialog</name>
<message>
- <source>Options</source>
- <translation type="unfinished">Optiones</translation>
- </message>
- <message>
- <source>&amp;Main</source>
- <translation type="unfinished">&amp;Princeps</translation>
- </message>
- <message>
<source>Reset all client options to default.</source>
<translation type="unfinished">Reconstitue omnes optiones clientis ad praedefinita.</translation>
</message>
@@ -673,207 +385,19 @@
</message>
</context>
<context>
- <name>QRImageWidget</name>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">Resultato URI nimis longo, conare minuere verba pro titulo / nuntio.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Error codificandi URI in codicem QR.</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">Salva codicem QR</translation>
- </message>
- </context>
-<context>
- <name>RPCConsole</name>
- <message>
- <source>Client version</source>
- <translation type="unfinished">Versio clientis</translation>
- </message>
- <message>
- <source>&amp;Information</source>
- <translation type="unfinished">&amp;Informatio</translation>
- </message>
- <message>
- <source>Startup time</source>
- <translation type="unfinished">Tempus initiandi</translation>
- </message>
- <message>
- <source>Network</source>
- <translation type="unfinished">Rete</translation>
- </message>
- <message>
- <source>Number of connections</source>
- <translation type="unfinished">Numerus conexionum</translation>
- </message>
- <message>
- <source>Block chain</source>
- <translation type="unfinished">Catena frustorum</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Hora postremi frusti</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished">&amp;Aperi</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">&amp;Terminale</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">Debug catalogi plica</translation>
- </message>
- <message>
- <source>Clear console</source>
- <translation type="unfinished">Vacuefac terminale</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">Ad</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">Ab</translation>
- </message>
- </context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>&amp;Amount:</source>
- <translation type="unfinished">Quantitas:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Titulus:</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">Nuntius:</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Non potuisse cassidile reserare</translation>
- </message>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Quantitas:</translation>
- </message>
- <message>
- <source>Label:</source>
- <translation type="unfinished">Titulus:</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Nuntius:</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">&amp;Copia Inscriptionem</translation>
- </message>
- </context>
-<context>
<name>RecentRequestsTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">Dies</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Titulus</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Nuntius</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(nullus titulus)</translation>
</message>
</context>
<context>
<name>SendCoinsDialog</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">Mitte Nummos</translation>
- </message>
- <message>
- <source>Insufficient funds!</source>
- <translation type="unfinished">Inopia nummorum</translation>
- </message>
- <message>
- <source>Bytes:</source>
- <translation type="unfinished">Octecti:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Quantitas:</translation>
- </message>
- <message>
- <source>Transaction Fee:</source>
- <translation type="unfinished">Transactionis merces:</translation>
- </message>
- <message>
- <source>Send to multiple recipients at once</source>
- <translation type="unfinished">Mitte pluribus accipientibus simul</translation>
- </message>
- <message>
- <source>Add &amp;Recipient</source>
- <translation type="unfinished">Adde &amp;Accipientem</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">Vacuefac &amp;Omnia</translation>
- </message>
- <message>
- <source>Balance:</source>
- <translation type="unfinished">Pendendum:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation type="unfinished">Confirma actionem mittendi</translation>
- </message>
- <message>
- <source>S&amp;end</source>
- <translation type="unfinished">&amp;Mitte</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation type="unfinished">Copia quantitatem</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">Transactionis merces</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation type="unfinished">Confirma mittendum nummorum</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">Oportet quantitatem ad pensandum maiorem quam 0 esse.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation type="unfinished">Quantitas est ultra quod habes.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">Quantitas est ultra quod habes cum merces transactionis %1 includitur.</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
<message>
@@ -882,388 +406,37 @@
</message>
</context>
<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>A&amp;mount:</source>
- <translation type="unfinished">&amp;Quantitas:</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">Pensa &amp;Ad:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Titulus:</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Glutina inscriptionem ex latibulo</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Nuntius:</translation>
- </message>
- </context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Signationes - Signa / Verifica nuntium</translation>
- </message>
- <message>
- <source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;Signa Nuntium</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Glutina inscriptionem ex latibulo</translation>
- </message>
- <message>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished">Insere hic nuntium quod vis signare</translation>
- </message>
- <message>
- <source>Signature</source>
- <translation type="unfinished">Signatio</translation>
- </message>
- <message>
- <source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">Copia signationem in latibulum systematis</translation>
- </message>
- <message>
- <source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Signa nuntium ut demonstres hanc inscriptionem Bitcoin a te possessa esse</translation>
- </message>
- <message>
- <source>Sign &amp;Message</source>
- <translation type="unfinished">Signa &amp;Nuntium</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">Reconstitue omnes campos signandi nuntii</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">Vacuefac &amp;Omnia</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">&amp;Verifica Nuntium</translation>
- </message>
- <message>
- <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Verifica nuntium ut cures signatum esse cum specifica inscriptione Bitcoin</translation>
- </message>
- <message>
- <source>Verify &amp;Message</source>
- <translation type="unfinished">Verifica &amp;Nuntium</translation>
- </message>
- <message>
- <source>Reset all verify message fields</source>
- <translation type="unfinished">Reconstitue omnes campos verificandi nuntii</translation>
- </message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Clicca "Signa Nuntium" ut signatio generetur</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation type="unfinished">Inscriptio inserta non valida est.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation type="unfinished">Sodes inscriptionem proba et rursus conare.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Inserta inscriptio clavem non refert.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation type="unfinished">Cassidilis reserare cancellatum est.</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation type="unfinished">Clavis privata absens est pro inserta inscriptione.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation type="unfinished">Nuntium signare abortum est.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation type="unfinished">Nuntius signatus.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation type="unfinished">Signatio decodificari non potuit.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">Sodes signationem proba et rursus conare.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation type="unfinished">Signatio non convenit digesto nuntii</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation type="unfinished">Nuntium verificare abortum est.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">Nuntius verificatus.</translation>
- </message>
-</context>
-<context>
<name>TransactionDesc</name>
- <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/non confirmata</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 confirmationes</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Dies</translation>
- </message>
- <message>
- <source>Source</source>
- <translation type="unfinished">Fons</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation type="unfinished">Generatum</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">Ab</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">ignotum</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">Ad</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">inscriptio propria</translation>
- </message>
- <message>
- <source>label</source>
- <translation type="unfinished">titulus</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation type="unfinished">Creditum</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<message>
- <source>not accepted</source>
- <translation type="unfinished">non acceptum</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation type="unfinished">Debitum</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">Transactionis merces</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation type="unfinished">Cuncta quantitas</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Nuntius</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">Annotatio</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation type="unfinished">ID transactionis</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation type="unfinished">Informatio de debug</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation type="unfinished">Transactio</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation type="unfinished">Lectenda</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">Quantitas</translation>
</message>
- <message>
- <source>true</source>
- <translation type="unfinished">verum</translation>
- </message>
- <message>
- <source>false</source>
- <translation type="unfinished">falsum</translation>
- </message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
- <message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">Haec tabula monstrat descriptionem verbosam transactionis</translation>
- </message>
</context>
<context>
<name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">Dies</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">Typus</translation>
</message>
<message>
- <source>Label</source>
- <translation type="unfinished">Titulus</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">Confirmatum (%1 confirmationes)</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation type="unfinished">Generatum sed non acceptum</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Acceptum cum</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation type="unfinished">Acceptum ab</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Missum ad</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Fossa</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(nullus titulus)</translation>
</message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">Status transactionis. Supervola cum mure ut monstretur numerus confirmationum.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation type="unfinished">Dies et tempus quando transactio accepta est.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation type="unfinished">Typus transactionis.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Quantitas remota ex pendendo aut addita ei.</translation>
- </message>
-</context>
+ </context>
<context>
<name>TransactionView</name>
<message>
- <source>All</source>
- <translation type="unfinished">Omne</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">Hodie</translation>
- </message>
- <message>
- <source>This week</source>
- <translation type="unfinished">Hac hebdomade</translation>
- </message>
- <message>
- <source>This month</source>
- <translation type="unfinished">Hoc mense</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation type="unfinished">Postremo mense</translation>
- </message>
- <message>
- <source>This year</source>
- <translation type="unfinished">Hoc anno</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Acceptum cum</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Missum ad</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Fossa</translation>
- </message>
- <message>
- <source>Other</source>
- <translation type="unfinished">Alia</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation type="unfinished">Quantitas minima</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">Confirmatum</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Dies</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">Typus</translation>
</message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Titulus</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Inscriptio</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation type="unfinished">Intervallum:</translation>
- </message>
- <message>
- <source>to</source>
- <translation type="unfinished">ad</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletFrame</name>
<message>
@@ -1271,97 +444,4 @@
<translation type="unfinished">Creare novum cassidilium</translation>
</message>
</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">Mitte Nummos</translation>
- </message>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">&amp;Exporta</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporta data in hac tabella in plicam</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation type="unfinished">Conserva cassidile</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation type="unfinished">Conservare abortum est.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation type="unfinished">Successum in conservando</translation>
- </message>
- </context>
-<context>
- <name>bitcoin-core</name>
- <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">Hoc est prae-dimittum experimentala aedes - utere eo periculo tuo proprio - nolite utere fodendo vel applicationibus mercatoriis</translation>
- </message>
- <message>
- <source>Corrupted block database detected</source>
- <translation type="unfinished">Corruptum databasum frustorum invenitur</translation>
- </message>
- <message>
- <source>Do you want to rebuild the block database now?</source>
- <translation type="unfinished">Visne reficere databasum frustorum iam?</translation>
- </message>
- <message>
- <source>Done loading</source>
- <translation type="unfinished">Completo lengendi</translation>
- </message>
- <message>
- <source>Error initializing block database</source>
- <translation type="unfinished">Error initiando databasem frustorum</translation>
- </message>
- <message>
- <source>Error initializing wallet database environment %s!</source>
- <translation type="unfinished">Error initiando systematem databasi cassidilis %s!</translation>
- </message>
- <message>
- <source>Error loading block database</source>
- <translation type="unfinished">Error legendo frustorum databasem</translation>
- </message>
- <message>
- <source>Error opening block database</source>
- <translation type="unfinished">Error aperiendo databasum frustorum</translation>
- </message>
- <message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Non potuisse auscultare in ulla porta. Utere -listen=0 si hoc vis.</translation>
- </message>
- <message>
- <source>Insufficient funds</source>
- <translation type="unfinished">Inopia nummorum</translation>
- </message>
- <message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">Inopia descriptorum plicarum.</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">Signandum transactionis abortum est</translation>
- </message>
- <message>
- <source>Transaction amount too small</source>
- <translation type="unfinished">Magnitudo transactionis nimis parva</translation>
- </message>
- <message>
- <source>Transaction too large</source>
- <translation type="unfinished">Transactio nimis magna</translation>
- </message>
- <message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">Ignotum rete specificatum in -onlynet: '%s'</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 0df3a165aa..d589420a97 100644
--- a/src/qt/locale/bitcoin_lt.ts
+++ b/src/qt/locale/bitcoin_lt.ts
@@ -94,6 +94,14 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Bandant išsaugoti adresų sąrašą - įvyko klaida keliant į %1. Prašome bandyti dar kartą.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">SiunÄiami adresai -%1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Gaunami adresai - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Eksportavimas nepavyko</translation>
</message>
@@ -335,7 +343,11 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">numatyta piniginÄ—</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -548,10 +560,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Rodyti %1 pagalbos žinutę su Bitcoin pasirinkimo komandomis</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">numatyta piniginÄ—</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Piniginių nėra</translation>
</message>
@@ -822,10 +830,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Piniginės atidarymo įspėjimas</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">numatyta piniginÄ—</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Atidaryti PiniginÄ™</translation>
@@ -1793,6 +1797,10 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Tinklo veikla išjungta</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">NÄ— vienas</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Vykdyti komandÄ… be jokios piniginÄ—s</translation>
</message>
@@ -2355,10 +2363,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Patikrinkite adresÄ… ir bandykite dar kartÄ….</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Įvestas adresas nėra susijęs su raktu.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Piniginės atrakinimas buvo atšauktas.</translation>
</message>
@@ -2802,11 +2806,7 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<source>Could not commit transaction</source>
<translation type="unfinished">Nepavyko įvykdyti sandorio</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">numatyta piniginÄ—</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_lv.ts b/src/qt/locale/bitcoin_lv.ts
index 6cea8ba1aa..467811a0e3 100644
--- a/src/qt/locale/bitcoin_lv.ts
+++ b/src/qt/locale/bitcoin_lv.ts
@@ -287,6 +287,10 @@
<translation type="unfinished">&amp;Par %1</translation>
</message>
<message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">RÄdÄ«t informÄciju par %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">Par &amp;Qt</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mi.ts b/src/qt/locale/bitcoin_mi.ts
index 8dc535cd68..92ac490e8e 100644
--- a/src/qt/locale/bitcoin_mi.ts
+++ b/src/qt/locale/bitcoin_mi.ts
@@ -244,7 +244,7 @@ Ko te whakakÄ« i Ä“nei whakaaronga e taea ana anake ki ngÄ whakararuraru o te m
</message>
<message>
<source>Runaway exception</source>
- <translation type="unfinished">&lt;text_to_translate&gt;TÅ«kino whakawhiti&lt;/text_to_translate&gt;</translation>
+ <translation type="unfinished">TÅ«kino whakawhiti</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
@@ -632,10 +632,6 @@ Ko te whakakÄ« i Ä“nei whakaaronga e taea ana anake ki ngÄ whakararuraru o te m
<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>
diff --git a/src/qt/locale/bitcoin_mk.ts b/src/qt/locale/bitcoin_mk.ts
index 9fd41c2646..805cd3bfd2 100644
--- a/src/qt/locale/bitcoin_mk.ts
+++ b/src/qt/locale/bitcoin_mk.ts
@@ -365,6 +365,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Паричник по подразбирање</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -463,7 +467,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
@@ -515,7 +519,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;ПоÑтавки</translation>
+ <translation type="unfinished">&amp;ПодеÑувања</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -571,7 +575,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 зад</translation>
+ <translation type="unfinished">%1 позади</translation>
</message>
<message>
<source>Catching up…</source>
@@ -591,7 +595,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Внимание</translation>
+ <translation type="unfinished">Предупредување</translation>
</message>
<message>
<source>Information</source>
@@ -635,7 +639,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Отвори го паричникот</translation>
+ <translation type="unfinished">Отвори паричник</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -672,10 +676,6 @@ 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>No wallets available</source>
<translation type="unfinished">Ðема доÑтапни паричници</translation>
</message>
@@ -894,10 +894,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -1343,11 +1339,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">ИÑпраќање</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Паричник по подразбирање</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_ml.ts b/src/qt/locale/bitcoin_ml.ts
index 2bb0d996df..15cb5e8cfa 100644
--- a/src/qt/locale/bitcoin_ml.ts
+++ b/src/qt/locale/bitcoin_ml.ts
@@ -89,6 +89,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">കോമയാൽ വേർതിരിചàµà´š ഫയൽ (* .csv)</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>
@@ -265,6 +273,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -328,7 +346,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">à´¸àµà´¥à´¿à´°à´‚ ആയ വാലറàµà´±àµ</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -380,8 +402,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ഒരൠപàµà´¤à´¿à´¯ വാലറàµà´±àµ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´•</translation>
</message>
<message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished"> à´’à´ªàµà´ªà´‚ ചെറàµà´¤à´¾à´•àµà´•àµà´•</translation>
+ </message>
+ <message>
<source>Wallet:</source>
- <translation type="unfinished">പണസഞàµà´šà´¿ </translation>
+ <translation type="unfinished">വാലറàµà´±àµ:</translation>
</message>
<message>
<source>Network activity disabled.</source>
@@ -417,18 +443,46 @@ Signing is only possible with addresses of the type 'legacy'.</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>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished"> ബാകàµà´•à´ªàµà´ªàµ വാലറàµà´±àµà´‚…</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">പാസàµà´«àµà´°àµ†à´¯àµà´¸àµ മാറàµà´±àµà´•</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">à´’à´ªàµà´ªà´¿à´Ÿàµà´•, സനàµà´¦àµ‡à´¶à´‚ നൽകàµà´•</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">സനàµà´¦àµ‡à´¶à´‚ പരിശോധികàµà´•àµà´•...</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"> à´¤àµà´±à´¨àµà´¨àµ URL</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">വാലറàµà´±àµ à´…à´Ÿà´¯àµà´•àµà´•àµà´•</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation type="unfinished">&amp; ഫയൽ</translation>
</message>
@@ -445,6 +499,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ടാബàµà´•à´³àµà´Ÿàµ† ടൂൾബാർ</translation>
</message>
<message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished"> നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´®à´¾à´¯à´¿ സമനàµà´µà´¯à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨àµ...</translation>
+ </message>
+ <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished">പേയàµâ€Œà´®àµ†à´¨àµà´±àµà´•àµ¾ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¿à´•àµà´•àµà´• (QR കോഡàµà´•à´³àµà´‚ ബിറàµà´±àµà´•àµ‹à´¯à´¿à´¨àµà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨àµ: URI- കൾ)</translation>
</message>
@@ -532,6 +590,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -548,14 +611,15 @@ 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>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>
@@ -590,6 +654,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">à´ªàµà´¤à´¿à´¯ വാലറàµà´±àµ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» കഴിയിലàµà´², à´¸àµâ€Œà´•àµà´²àµˆà´±àµà´±àµ
+പിനàµà´¤àµà´£à´¯à´¿à´²àµà´²à´¾à´¤àµ† സോഫàµâ€Œà´±àµà´±àµâ€Œà´µàµ†à´¯àµ¼ കംപൈൽ ചെയàµâ€Œà´¤àµ (à´¡à´¿à´¸àµâ€Œà´•àµà´°à´¿à´ªàµâ€Œà´±àµà´±àµ¼ വാലറàµà´±àµà´•àµ¾à´•àµà´•àµ ആവശàµà´¯à´®à´¾à´£àµ)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">തെറàµà´±àµ : %1 </translation>
</message>
@@ -796,10 +865,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -1416,13 +1481,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">à´¸àµà´¥à´¿à´°à´‚ ആയ വാലറàµà´±àµ</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_mn.ts b/src/qt/locale/bitcoin_mn.ts
index 222018e036..ac0b17d952 100644
--- a/src/qt/locale/bitcoin_mn.ts
+++ b/src/qt/locale/bitcoin_mn.ts
@@ -243,6 +243,10 @@
<translation type="unfinished">ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð°Ð°Ñ Ð“Ð°Ñ€Ð°Ñ…</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;Тухай %1</translation>
+ </message>
+ <message>
<source>About &amp;Qt</source>
<translation type="unfinished">&amp;Клиентийн тухай</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ms.ts b/src/qt/locale/bitcoin_ms.ts
index 9d20510264..7dfe4c38e7 100644
--- a/src/qt/locale/bitcoin_ms.ts
+++ b/src/qt/locale/bitcoin_ms.ts
@@ -36,8 +36,7 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">
-Alihkan fail data ke dalam tab semasa</translation>
+ <translation type="unfinished">Alihkan fail data ke dalam tab semasa</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -81,6 +80,14 @@ Alihkan fail data ke dalam tab semasa</translation>
<translation type="unfinished">Terdapat ralat semasa cubaan menyimpan senarai alamat kepada %1. Sila cuba lagi.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Alamat Kirim - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Alamat Penerima - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Mengeksport Gagal</translation>
</message>
@@ -224,7 +231,12 @@ Alihkan fail data ke dalam tab semasa</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">dompet lalai
+</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -369,11 +381,6 @@ Alihkan fail data ke dalam tab semasa</translation>
<source>Close wallet</source>
<translation type="unfinished">Tutup Wallet</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">dompet lalai
-</translation>
- </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -392,11 +399,6 @@ Alihkan fail data ke dalam tab semasa</translation>
<context>
<name>OpenWalletActivity</name>
<message>
- <source>default wallet</source>
- <translation type="unfinished">dompet lalai
-</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>
@@ -544,14 +546,6 @@ Alihkan fail data ke dalam tab semasa</translation>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">dompet lalai
-</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
@@ -559,8 +553,7 @@ Alihkan fail data ke dalam tab semasa</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">
-Alihkan fail data ke dalam tab semasa</translation>
+ <translation type="unfinished">Alihkan fail data ke dalam tab semasa</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_mt.ts b/src/qt/locale/bitcoin_mt.ts
index e26087fe80..45e55cab45 100644
--- a/src/qt/locale/bitcoin_mt.ts
+++ b/src/qt/locale/bitcoin_mt.ts
@@ -340,7 +340,11 @@ L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">kartiera default</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -640,10 +644,6 @@ L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</translation>
<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>
@@ -839,10 +839,6 @@ L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</translation>
<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>
@@ -1057,13 +1053,6 @@ L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</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>
diff --git a/src/qt/locale/bitcoin_my.ts b/src/qt/locale/bitcoin_my.ts
index 0e546f3741..0d15317d1a 100644
--- a/src/qt/locale/bitcoin_my.ts
+++ b/src/qt/locale/bitcoin_my.ts
@@ -78,6 +78,37 @@
</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>
+ </context>
+<context>
<name>QObject</name>
<message>
<source>Error: %1</source>
diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts
index 015496d587..06b99f7d5b 100644
--- a/src/qt/locale/bitcoin_nb.ts
+++ b/src/qt/locale/bitcoin_nb.ts
@@ -175,6 +175,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Skriv inn den gamle passordfrasen og den nye passordfrasen for lommeboken.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Fortsett</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">Husk at å kryptere lommeboken ikke vil beskytte dine bitcoins fullstendig fra å bli stjålet av skadevare som infiserer datamaskinen din.</translation>
</message>
@@ -382,7 +386,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n år</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standard lommebok</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -434,6 +442,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Lag en ny lommebok</translation>
</message>
<message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">&amp;Minimer</translation>
+ </message>
+ <message>
<source>Wallet:</source>
<translation type="unfinished">Lommebok:</translation>
</message>
@@ -456,7 +468,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Endre passordfrasen for kryptering av lommeboken</translation>
+ <translation type="unfinished">Endre passordsetningen for kryptering av lommeboken</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -680,10 +692,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Masker verdiene i oversiktstabben</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standard lommebok</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ingen lommebøker tilgjengelig</translation>
</message>
@@ -1005,10 +1013,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Advasel om åpen lommebok.</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standard lommebok</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ã…pne Lommebok</translation>
@@ -1981,6 +1985,14 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Datamappe</translation>
</message>
<message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">For å spesifisere en ikke-standardplassering av datakatalogen, bruk alternativet '%1'.</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">For å spesifisere en ikke-standardplassering for blokkeringsmappen bruker du alternativet '%1'.</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">Oppstartstidspunkt</translation>
</message>
@@ -2282,6 +2294,10 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Nettverksaktivitet avskrudd</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ingen</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Utfør kommando uten noen lommebok</translation>
</message>
@@ -2684,6 +2700,14 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Cr &amp; eate Usignert</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">Oppretter en delvis signert Bitcoin-transaksjon (PSBT) for bruk med f.eks. en offline%1 lommebok eller en PSBT-kompatibel maskinvarelommebok.</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>
@@ -2895,10 +2919,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">&amp;Signer Melding</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">Du kan signere meldinger/avtaler med adresser for å bevise at du kan motta bitcoins sendt til dem. Vær forsiktig med å signere noe vagt eller tilfeldig, siden phishing-angrep kan prøve å lure deg til å signere din identitet over til dem. Bare signer fullt detaljerte utsagn som du er enig i.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-adressen meldingen skal signeres med</translation>
</message>
@@ -2983,10 +3003,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Sjekk adressen og prøv igjen.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Innskrevet adresse refererer ikke til noen nøkkel.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Opplåsning av lommebok ble avbrutt.</translation>
</message>
@@ -3520,10 +3536,6 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<source>Can't display address</source>
<translation type="unfinished">Kan ikke vise adresse</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standard lommebok</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3612,10 +3624,6 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<translation type="unfinished">Mer enn en onion adresse har blitt gitt. Bruker %s for den automatisk lagde Tor onion tjenesten.</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">Sjekk at din datamaskins dato og klokke er stilt rett! Hvis klokka er feil, vil ikke %s fungere ordentlig.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Bidra hvis du finner %s nyttig. Besøk %s for mer informasjon om programvaren.</translation>
</message>
@@ -3672,6 +3680,10 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<translation type="unfinished">Advarsel: Dumpfil lommebokformat "%s" stemmer ikke med format "%s" spesifisert i kommandolinje.</translation>
</message>
<message>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">Advarsel: Private nøkler oppdaget i lommeboken {%s} med deaktiverte private nøkler</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">Advarsel: Vi ser ikke ut til å være i full overenstemmelse med våre likemenn! Du kan trenge å oppgradere, eller andre noder kan trenge å oppgradere.</translation>
</message>
@@ -3688,10 +3700,6 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<translation type="unfinished">-maxmempool må være minst %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">En fatal intern feil oppstod, se debug.log for detaljer.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Kunne ikke slå opp -%s-adresse: "%s"</translation>
</message>
@@ -3706,6 +3714,10 @@ Unable to restore backup of wallet.</source>
Kunne ikke gjenopprette sikkerhetskopi av lommebok.</translation>
</message>
<message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <translation type="unfinished">Konfigurasjonsinnstilling for%s brukes bare på%s nettverk når du er i delen [%s].</translation>
+ </message>
+ <message>
<source>Copyright (C) %i-%i</source>
<translation type="unfinished">Kopirett © %i-%i</translation>
</message>
@@ -3754,6 +3766,10 @@ Kunne ikke gjenopprette sikkerhetskopi av lommebok.</translation>
<translation type="unfinished">Feil ved lasting av %s</translation>
</message>
<message>
+ <source>Error loading %s: Private keys can only be disabled during creation</source>
+ <translation type="unfinished">Feil ved lasting av%s: Private nøkler kan bare deaktiveres under opprettelsen</translation>
+ </message>
+ <message>
<source>Error loading %s: Wallet corrupted</source>
<translation type="unfinished">Feil under innlasting av %s: Skadet lommebok</translation>
</message>
@@ -3858,6 +3874,10 @@ Kunne ikke gjenopprette sikkerhetskopi av lommebok.</translation>
<translation type="unfinished">Ugyldig -mellomtjeneradresse eller vertsnavn: "%s"</translation>
</message>
<message>
+ <source>Invalid P2P permission: '%s'</source>
+ <translation type="unfinished">Ugyldig P2P-tillatelse: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Ugyldig beløp for -%s=&lt;amount&gt;: "%s"</translation>
</message>
@@ -4023,6 +4043,10 @@ Mangler løsningsdata for å estimere transaksjonsstørrelse</translation>
<translation type="unfinished">Kan ikke binde til %s på denne datamaskinen. Sannsynligvis kjører %s allerede.</translation>
</message>
<message>
+ <source>Unable to create the PID file '%s': %s</source>
+ <translation type="unfinished">Kan ikke opprette PID-filen '%s':%s</translation>
+ </message>
+ <message>
<source>Unable to generate initial keys</source>
<translation type="unfinished">Klarte ikke lage første nøkkel</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ne.ts b/src/qt/locale/bitcoin_ne.ts
index c54fb40a37..268520f062 100644
--- a/src/qt/locale/bitcoin_ne.ts
+++ b/src/qt/locale/bitcoin_ne.ts
@@ -849,10 +849,6 @@
<context>
<name>SignVerifyMessageDialog</name>
<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>Choose previously used address</source>
<translation type="unfinished">पहिला पà¥à¤°à¤¯à¥‹à¤— गरिà¤à¤•à¥‹ ठेगाना पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥</translation>
</message>
diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts
index e0e3e3a138..b8a2c4fe1f 100644
--- a/src/qt/locale/bitcoin_nl.ts
+++ b/src/qt/locale/bitcoin_nl.ts
@@ -180,6 +180,10 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Voer de oude wachtwoordzin en de nieuwe wachtwoordzin in voor de portemonnee.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Doorgaan</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">Onthoud dat het versleutelen van uw portemonnee uw bitcoins niet volledig kan beschermen tegen diefstal, bijvoorbeeld door malware die uw computer infecteert.</translation>
</message>
@@ -299,6 +303,18 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">onbekend</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Ingebed "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Standaard systeemlettertype "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Aangepast...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Bedrag</translation>
</message>
@@ -407,6 +423,10 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<source>%1 GB</source>
<translation type="unfinished">%1 Gb</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standaard portemonnee</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -721,10 +741,6 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Maskeer de waarden op het tabblad Overzicht</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standaard portemonnee</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Geen portefeuilles beschikbaar</translation>
</message>
@@ -1105,10 +1121,6 @@ Het migratieproces maakt voorafgaand aan het migreren een backup van de wallet.
<translation type="unfinished">Wallet openen waarschuwing</translation>
</message>
<message>
- <source>default wallet</source>
- <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">Portemonnee Openen</translation>
@@ -1556,6 +1568,10 @@ Het migratieproces maakt voorafgaand aan het migreren een backup van de wallet.
<translation type="unfinished">Minimaliseren in plaats van de applicatie af te sluiten wanneer het venster is afgesloten. Als deze optie is ingeschakeld, zal de toepassing pas worden afgesloten na het selecteren van Exit in het menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Lettertype in het Overzicht tab:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Gekozen opties in dit dialoogvenster worden overschreven door de command line:</translation>
</message>
@@ -2261,10 +2277,6 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<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>
@@ -2367,6 +2379,10 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">Richting/Type</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">De BIP324 sessie ID string in hex.</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Het netwerkprotocol waarmee deze peer verbonden is: IPv4, IPv6, Onion, I2P, of CJDNS.</translation>
</message>
@@ -2539,10 +2555,18 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">Netwerkactiviteit uitgeschakeld</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Geen</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Uitvoeren van commando zonder gebruik van een wallet</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Nodevenster - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Uitvoeren van commando met wallet "%1"</translation>
</message>
@@ -3217,10 +3241,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">&amp;Onderteken bericht</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">U kunt berichten/overeenkomsten ondertekenen met uw adres om te bewijzen dat u Bitcoins kunt versturen. Wees voorzichtig met het ondertekenen van iets vaags of willekeurigs, omdat phishingaanvallen u kunnen proberen te misleiden tot het ondertekenen van overeenkomsten om uw identiteit aan hen toe te vertrouwen. Onderteken alleen volledig gedetailleerde verklaringen voordat u akkoord gaat.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Het Bitcoin adres om bericht mee te ondertekenen</translation>
</message>
@@ -3305,10 +3325,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Controleer het adres en probeer het opnieuw.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Het opgegeven adres verwijst niet naar een sleutel.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Wallet ontsleutelen werd geannuleerd.</translation>
</message>
@@ -3842,11 +3858,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">PSBT is gekopieerd</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Gekopieerd naar het klembord</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Kan transactie niet ondertekenen.</translation>
</message>
@@ -3858,10 +3869,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<source>Can't display address</source>
<translation type="unfinished">Adres kan niet weergegeven worden</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standaard portemonnee</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3994,10 +4001,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Geen walletbestandsformaat opgegeven. Om createfromdump te gebruiken, moet -format=&lt;format&gt; opgegeven worden.</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">Waarschuwing: Controleer dat de datum en tijd van uw computer correct zijn ingesteld! Bij een onjuist ingestelde klok zal %s niet goed werken.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Gelieve bij te dragen als je %s nuttig vindt. Bezoek %s voor meer informatie over de software.</translation>
</message>
@@ -4106,10 +4109,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">-maxmempool moet minstens %d MB zijn</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Een fatale interne fout heeft zich voor gedaan, zie debug.log voor details</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Kan -%s adres niet herleiden: '%s'</translation>
</message>
@@ -4278,6 +4277,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Dumpbestand %s bestaat niet.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fout bij db txn verwerking voor verwijderen wallet transacties</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Fout bij het maken van %s</translation>
</message>
@@ -4326,6 +4329,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout bij het lezen van het volgende record in de walletdatabase</translation>
</message>
<message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fout bij starten db txn voor verwijderen wallet transacties</translation>
+ </message>
+ <message>
<source>Error: Cannot extract destination from the generated scriptpubkey</source>
<translation type="unfinished">Fout: Kan de bestemming niet extraheren uit de gegenereerde scriptpubkey</translation>
</message>
@@ -4410,6 +4417,14 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Kan beste block locatie aanduiding niet opslaan in alleen lezen wallet</translation>
</message>
<message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Fout: Kopiëren adresboek mislukt voor wallet %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Fout: Kan databasetransactie niet uitvoeren voor wallet %s</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>
@@ -4426,6 +4441,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Mislukt om de databank te controleren</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Verwijderen transactie mislukt: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Tarief (%s) is lager dan het minimum tarief (%s)</translation>
</message>
@@ -4646,6 +4665,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Dit is de transactievergoeding dat je betaalt wanneer je een transactie verstuurt.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transactie %s behoort niet tot deze wallet</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Transactiebedrag te klein</translation>
</message>
@@ -4670,10 +4693,6 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Transactie te groot</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Kan geen geheugen toekennen voor -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Niet in staat om aan %s te binden op deze computer (bind gaf error %s)</translation>
</message>
@@ -4754,6 +4773,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Kon alleen lezen tx %s niet toevoegen aan alleen lezen wallet</translation>
</message>
<message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Fout: Kon alleen-lezen transacties niet verwijderen</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">User Agentcommentaar (%s) bevat onveilige karakters.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pam.ts b/src/qt/locale/bitcoin_pam.ts
index e5675cda24..8e402e4c18 100644
--- a/src/qt/locale/bitcoin_pam.ts
+++ b/src/qt/locale/bitcoin_pam.ts
@@ -803,10 +803,6 @@
<translation type="unfinished">Maliaring pakilawe pasibayu ing address at pasibayuan ya iti.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Ing milub a address ali ya mag-refer king metung a key.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Me-kansela ya ing pamag-unlock king wallet.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts
index f1aab64ad2..94d87252d0 100644
--- a/src/qt/locale/bitcoin_pl.ts
+++ b/src/qt/locale/bitcoin_pl.ts
@@ -46,6 +46,14 @@
<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 wysł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>
@@ -138,6 +146,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Wprowadź stare i nowe hasło portfela. </translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Kontynuuj</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">Pamiętaj, że zaszyfrowanie portfela nie pomoże w zapobiegnięciu kradzieży twoich bitcoinów jeśli komputer zostanie zainfekowany przez złośliwe oprogramowanie.</translation>
</message>
@@ -257,6 +269,18 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">nieznane</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Osadzony "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Domyślna czcionka systemu "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">WÅ‚asna:</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Kwota</translation>
</message>
@@ -363,7 +387,11 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<numerusform>%n lata</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">domyślny portfel</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -678,10 +706,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Schowaj wartości w zakładce Podsumowanie</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">domyślny portfel</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Brak dostępnych portfeli</translation>
</message>
@@ -1062,6 +1086,14 @@ Proces migracji utworzy kopiÄ™ zapasowÄ… portfela przed migracjÄ…. Plik kopii za
<translation type="unfinished">Portfel '%1' został poprawnie przeniesiony.</translation>
</message>
<message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Skrypty tylko do odczytu zostały przeniesione do nowego portfela '%1'</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Sprawne, ale nie oglądane skrypty tylko do odczytu zostały przeniesione do nowego portfela '%1'</translation>
+ </message>
+ <message>
<source>Migration failed</source>
<translation type="unfinished">Przeniesienie nie powiodło się</translation>
</message>
@@ -1081,10 +1113,6 @@ Proces migracji utworzy kopiÄ™ zapasowÄ… portfela przed migracjÄ…. Plik kopii za
<translation type="unfinished">Ostrzeżenie przy otworzeniu potrfela</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">domyślny portfel</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otwórz Portfel</translation>
@@ -1157,6 +1185,10 @@ Proces migracji utworzy kopiÄ™ zapasowÄ… portfela przed migracjÄ…. Plik kopii za
<translation type="unfinished">JesteÅ› jeden krok od stworzenia swojego nowego portfela!</translation>
</message>
<message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Proszę podać nazwę, i jeśli potrzeba, włącz zaawansowane ustawienia.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nazwa portfela</translation>
</message>
@@ -1544,6 +1576,10 @@ Proces migracji utworzy kopiÄ™ zapasowÄ… portfela przed migracjÄ…. Plik kopii za
<translation type="unfinished">Minimalizuje zamiast zakończyć działanie programu przy zamykaniu okna. Kiedy ta opcja jest włączona, program zakończy działanie po wybieraniu Zamknij w menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Czcionka w zakładce Przegląd:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Opcje ustawione w tym oknie sÄ… nadpisane przez liniÄ™ komend:</translation>
</message>
@@ -2265,6 +2301,14 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Wersja warstwy transportowej: %1</translation>
</message>
<message>
+ <source>Transport</source>
+ <translation type="unfinished">Transfer</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID sesji</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Wersja</translation>
</message>
@@ -2359,6 +2403,10 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Uprawnienia</translation>
</message>
<message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">Kierunek i typ połączenia równorzędnego: %1</translation>
+ </message>
+ <message>
<source>Direction/Type</source>
<translation type="unfinished">Kierunek/Rodzaj</translation>
</message>
@@ -2555,14 +2603,39 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Aktywność sieciowa wyłączona</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Żaden</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">WykonujÄ™ komendÄ™ bez portfela</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Okno węzła - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Wykonuję komendę używając portfela "%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">Witaj w %1 konsoli RPC.
+Użyj strzałek do góry oraz w dół, aby nawigować po historii oraz %2 w celu wyczyszczenia ekranu.
+Użyj %3 oraz %4 aby zwiększyć lub zmniejszyć rozmiar czcionki.
+Wpisz %5 w celu wyświetlenia dostępnych komend.
+Aby uzyskać więcej informacji na temat używania tej konsoli wpisz %6.
+
+%7UWAGA: Oszuści są wszędzie i potrafią namawiać użytkowników do wpisywania złych komend w celu wykradania zawartości ich porfeli. Nie używaj tej konsoli jeżeli nie znasz wszystkich konsekwencji danej komendy.%8</translation>
+ </message>
+ <message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
<translation type="unfinished">WykonujÄ™...</translation>
@@ -3250,10 +3323,6 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za
<translation type="unfinished">Podpi&amp;sz Wiadomość</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">Możesz podpisywać wiadomości swoimi adresami aby udowodnić, że jesteś ich właścicielem. Uważaj, aby nie podpisywać niczego co wzbudza Twoje podejrzenia, ponieważ ktoś może stosować phishing próbując nakłonić Cię do ich podpisania. Akceptuj i podpisuj tylko w pełni zrozumiałe komunikaty i wiadomości.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Adres Bitcoin, za pomocą którego podpisać wiadomość</translation>
</message>
@@ -3339,10 +3408,6 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
<translation type="unfinished">Proszę sprawdzić adres i spróbować ponownie.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Wprowadzony adres nie odnosi siÄ™ do klucza.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Odblokowanie portfela zostało anulowane.</translation>
</message>
@@ -3824,8 +3889,7 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<translation type="unfinished">Portfel nie został wybrany.
-Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
-</translation>
+Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.</translation>
</message>
<message>
<source>Create a new wallet</source>
@@ -3904,11 +3968,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Skopiowano PSBT</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Skopiowane do schowka</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Nie można podpisać transakcji.</translation>
</message>
@@ -3920,10 +3979,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<source>Can't display address</source>
<translation type="unfinished">Nie można wyświetlić adresu</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">domyślny portfel</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -4012,6 +4067,10 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">BÅ‚Ä…d: starsze portfele obsÅ‚ugujÄ… tylko typy adresów „legacyâ€, „p2sh-segwit†i „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">Błąd: Nie można wygenerować deskryptorów dla tego starego portfela. Upewnij się najpierw, że portfel jest odblokowany.</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">Plik 1%s już istnieje. Jeśli jesteś pewien, że tego chcesz, najpierw usuń to z drogi.</translation>
</message>
@@ -4021,7 +4080,7 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=1.</translation>
+ <translation type="unfinished">Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
@@ -4029,11 +4088,7 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
</message>
<message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=1.</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">Proszę sprawdzić czy data i czas na Twoim komputerze są poprawne! Jeżeli ustawienia zegara będą złe, %s nie będzie działał prawidłowo.</translation>
+ <translation type="unfinished">Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=&lt;format&gt;.</translation>
</message>
<message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
@@ -4096,6 +4151,18 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Podano nieznany typ pliku portfela "%s". Proszę podać jeden z "bdb" lub "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">Nieobsługiwany poziom rejestrowania specyficzny dla kategorii %1$s=%2$s. Oczekiwano %1$s=&lt;category&gt;:&lt;loglevel&gt;. Poprawne kategorie %3$s. Poprawne poziomy logowania: %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">Znaleziono nieobsługiwany format bazy danych chainstate. Proszę uruchomić ponownie z opcją -reindex-chainstate. To odbuduje bazę danych chainstate.</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">Portfel został załadowany pomyślnie. Starszy typ portfela jest przestarzały, a obsługa tworzenia i otwierania starszych portfeli zostanie usunięta w przyszłości. Starsze portfele można migrować do portfela deskryptora za pomocą migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
<translation type="unfinished">Uwaga: Wykryto klucze prywatne w portfelu [%s] który ma wyłączone klucze prywatne</translation>
</message>
@@ -4116,14 +4183,14 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">-maxmempool musi być przynajmniej %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Błąd: Wystąpił fatalny błąd wewnętrzny, sprawdź szczegóły w debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Nie można rozpoznać -%s adresu: '%s'</translation>
</message>
<message>
+ <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
+ <translation type="unfinished">Nie można ustawić -forcednsseed na true gdy ustawienie -dnsseed wynosi false.</translation>
+ </message>
+ <message>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
<translation type="unfinished">Nie można ustawić -peerblockfilters bez -blockfilterindex.</translation>
</message>
@@ -4132,6 +4199,10 @@ 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>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%sto bardzo dużo! Tak duże opłaty można uiścić w ramach jednej transakcji.</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>
@@ -4148,10 +4219,42 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Błąd: Podczas migracji utworzono zduplikowane deskryptory. Twój portfel może być uszkodzony.</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Nie udało się obliczyć opłat za uderzenia, ponieważ niepotwierdzone UTXO zależą od ogromnego skupiska niepotwierdzonych transakcji.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Zmiana nazwy nieprawidłowego pliku peers.dat nie powiodła się. Przenieś go lub usuń i spróbuj ponownie.</translation>
</message>
<message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Estymacja opłat nieudana. Domyślna opłata jest wyłączona. Poczekaj kilka bloków lub włącz -%s.</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
+ <translation type="unfinished">Połączenia wychodzące ograniczone do CJDNS (-onlynet=cjdns), ale nie podano -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">Połączenia wychodzące ograniczone do sieci Tor (-onlynet=onion), ale proxy do uzyskania dostępu do sieci Tor jest wyraźnie zabronione: -onion=0</translation>
+ </message>
+ <message>
+ <source>
+Unable to cleanup failed migration</source>
+ <translation type="unfinished">
+Nie można wyczyścić nieudanej migracji</translation>
+ </message>
+ <message>
+ <source>
+Unable to restore backup of wallet.</source>
+ <translation type="unfinished">
+Nie można przywrócić kopii zapasowej portfela</translation>
+ </message>
+ <message>
+ <source>Block verification was interrupted</source>
+ <translation type="unfinished">Weryfikacja bloku została przerwana</translation>
+ </message>
+ <message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
<translation type="unfinished">Ustawienie konfiguracyjne %s działa na sieć %s tylko, jeżeli jest w sekcji [%s].</translation>
</message>
@@ -4184,6 +4287,10 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Wczytywanie zakończone</translation>
</message>
<message>
+ <source>Dump file %s does not exist.</source>
+ <translation type="unfinished">Plik zrzutu aplikacji %s nie istnieje.</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">BÅ‚Ä…d podczas tworzenia %s</translation>
</message>
@@ -4220,6 +4327,10 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Błąd otwierania bazy bloków</translation>
</message>
<message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Błąd: nie można odczytać pliku konfiguracyjnego: %s</translation>
+ </message>
+ <message>
<source>Error reading from database, shutting down.</source>
<translation type="unfinished">Błąd odczytu z bazy danych, wyłączam się.</translation>
</message>
@@ -4228,6 +4339,14 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">BÅ‚Ä…d odczytu kolejnego rekordu z bazy danych portfela</translation>
</message>
<message>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Błąd: Nie można wyodrębnić miejsca docelowego z wygenerowanego scriptpubkey</translation>
+ </message>
+ <message>
+ <source>Error: Couldn't create cursor into database</source>
+ <translation type="unfinished">Błąd: Nie udało się utworzyć kursora w bazie danych</translation>
+ </message>
+ <message>
<source>Error: Disk space is low for %s</source>
<translation type="unfinished">Błąd: zbyt mało miejsca na dysku dla %s</translation>
</message>
@@ -4236,6 +4355,18 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">BÅ‚Ä…d: Plik zrzutu suma kontrolna nie pasuje. Obliczone %s, spodziewane %s</translation>
</message>
<message>
+ <source>Error: Failed to create new watchonly wallet</source>
+ <translation type="unfinished">Błąd: Utworzenie portfela tylko do odczytu nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">Błąd: Otrzymana wartość nie jest szestnastkowa%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">Błąd: Otrzymana wartość nie jest szestnastkowa%s</translation>
+ </message>
+ <message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">Błąd: Pula kluczy jest pusta, odwołaj się do puli kluczy.</translation>
</message>
@@ -4252,10 +4383,34 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Błąd: Ten portfel już używa SQLite</translation>
</message>
<message>
+ <source>Error: This wallet is already a descriptor wallet</source>
+ <translation type="unfinished">Błąd: Ten portfel jest już portfelem opisowym (descriptor wallet)</translation>
+ </message>
+ <message>
+ <source>Error: Unable to begin reading all records in the database</source>
+ <translation type="unfinished">Błąd: Nie można odczytać wszystkich rekordów z bazy danych</translation>
+ </message>
+ <message>
<source>Error: Unable to make a backup of your wallet</source>
<translation type="unfinished">Błąd: Nie mogę zrobić kopii twojego portfela</translation>
</message>
<message>
+ <source>Error: Unable to parse version %u as a uint32_t</source>
+ <translation type="unfinished">Błąd: Nie można zapisać wersji %u jako uint32_t</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read all records in the database</source>
+ <translation type="unfinished">Błąd: Nie można odczytać wszystkich rekordów z bazy danych</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Błąd: Nie można odczytać najlepszego rekordu lokalizatora bloków portfela</translation>
+ </message>
+ <message>
+ <source>Error: Unable to remove watchonly address book data</source>
+ <translation type="unfinished">Błąd: Nie można usunąć danych książki adresowej tylko do odczytu</translation>
+ </message>
+ <message>
<source>Error: Unable to write record to new wallet</source>
<translation type="unfinished">Błąd: Wpisanie rekordu do nowego portfela jest niemożliwe</translation>
</message>
@@ -4268,10 +4423,18 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Nie udało się ponownie przeskanować portfela podczas inicjalizacji.</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Nie udało się uruchomić indeksów, zamykanie...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Nie udało się zweryfikować bazy danych</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Nie udało się usunąć transakcji %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Wartość opłaty (%s) jest mniejsza niż wartość minimalna w ustawieniach (%s)</translation>
</message>
@@ -4296,6 +4459,10 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Wejście nie znalezione lub już wydane</translation>
</message>
<message>
+ <source>Insufficient dbcache for block verification</source>
+ <translation type="unfinished">Niewystarczająca pamięć podręczna bazy danych (dbcache) do weryfikacji bloków</translation>
+ </message>
+ <message>
<source>Insufficient funds</source>
<translation type="unfinished">Niewystarczające środki</translation>
</message>
@@ -4316,6 +4483,14 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Nieprawidłowe uprawnienia P2P: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Nieprawidłowa kwota dla %s=&lt;amount&gt;: '%s' (musi być co najmniej %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Nieprawidłowa kwota dla %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Nieprawidłowa kwota dla -%s=&lt;amount&gt;: '%s'</translation>
</message>
@@ -4324,6 +4499,14 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Nieprawidłowa maska sieci określona w -whitelist: '%s'</translation>
</message>
<message>
+ <source>Invalid port specified in %s: '%s'</source>
+ <translation type="unfinished">Nieprawidłowa maska sieci określona w %s: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid pre-selected input %s</source>
+ <translation type="unfinished">Niepoprawne wstępnie wybrane dane wejściowe %s</translation>
+ </message>
+ <message>
<source>Loading P2P addresses…</source>
<translation type="unfinished">Åadowanie adresów P2P...</translation>
</message>
@@ -4360,6 +4543,10 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Brak wystarczającej liczby deskryptorów plików.</translation>
</message>
<message>
+ <source>Not found pre-selected input %s</source>
+ <translation type="unfinished">Nie znaleziono wstępnie wybranego wejścia %s</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Przycinanie nie może być skonfigurowane z negatywną wartością.</translation>
</message>
@@ -4421,8 +4608,11 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
</message>
<message>
<source>Specified blocks directory "%s" does not exist.</source>
- <translation type="unfinished">Podany folder bloków "%s" nie istnieje.
-</translation>
+ <translation type="unfinished">Podany folder bloków "%s" nie istnieje.</translation>
+ </message>
+ <message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Określony katalog danych "%s" nie istnieje</translation>
</message>
<message>
<source>Starting network threads…</source>
@@ -4433,6 +4623,10 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Kod źródłowy dostępny jest z %s.</translation>
</message>
<message>
+ <source>The specified config file %s does not exist</source>
+ <translation type="unfinished">Podany plik konfiguracyjny %s nie istnieje</translation>
+ </message>
+ <message>
<source>The transaction amount is too small to pay the fee</source>
<translation type="unfinished">Zbyt niska kwota transakcji by zapłacić opłatę</translation>
</message>
@@ -4453,6 +4647,10 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">To jest opłata transakcyjna którą zapłacisz jeśli wyślesz transakcję.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transakcja %s nie należy do tego portfela</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Zbyt niska kwota transakcji</translation>
</message>
@@ -4477,10 +4675,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Transakcja zbyt duża</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Nie mogę zalokować pamięci dla -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Nie można przywiązać do %s na tym komputerze (bind zwrócił błąd %s)</translation>
</message>
@@ -4541,10 +4735,30 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Aktywowano nieznane nowe reguły (versionbit %i)</translation>
</message>
<message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Niewspierany globalny poziom logowania%s=%s. Poprawne wartości: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Utworzenie pliku portfela nie powiodło się: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">akceptowalne nieaktualne szacunki opłat nie są wspierane na łańcuchu %s</translation>
+ </message>
+ <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Nieobsługiwana kategoria rejestrowania %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Błąd: Nie można dodać tx %s tylko do odczytu do portfela tylko do odczytu</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Błąd: Nie można usunąć transakcji tylko do odczytu.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Komentarz User Agent (%s) zawiera niebezpieczne znaki.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt.ts b/src/qt/locale/bitcoin_pt.ts
index 7de05fc230..56fe047bba 100644
--- a/src/qt/locale/bitcoin_pt.ts
+++ b/src/qt/locale/bitcoin_pt.ts
@@ -3,11 +3,11 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Clique com o botão direito para editar o endereço ou etiqueta</translation>
+ <translation type="unfinished">Clique com o botão direito do rato para editar o endereço ou a etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Crie um endereço novo</translation>
+ <translation type="unfinished">Criar um novo endereço</translation>
</message>
<message>
<source>&amp;New</source>
@@ -35,19 +35,19 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exportar os dados no separador atual para um ficheiro</translation>
+ <translation type="unfinished">Exportar os dados na aba atual para um ficheiro</translation>
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">e exportar</translation>
+ <translation type="unfinished">&amp;Exportar</translation>
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">&amp;Eliminar</translation>
+ <translation type="unfinished">El&amp;iminar</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Escolha o endereço para enviar as moedas</translation>
+ <translation type="unfinished">Escolha o endereço para onde enviar as moedas</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
@@ -59,21 +59,21 @@
</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>
+ <translation type="unfinished">Estes são os seus endereços Bitcoin para enviar pagamentos. Verifique sempre a quantia e o endereço de receção antes de enviar moedas.</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">Estes são seus novos endereços Bitcoin para o recebimento de pagamentos. Use o botão "Criar novo endereço de recebimento" na aba "Receber" para criar novos endereços.
-Assinar só é possível com endereços do tipo "legado".</translation>
+ <translation type="unfinished">Estes são os seus endereços Bitcoin para receber pagamentos. Utilize o botão "Criar novo endereço de receção" na aba "Receber" para criar novos endereços.
+A assinatura só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;Copiar Endereço</translation>
+ <translation type="unfinished">&amp;Copiar endereço</translation>
</message>
<message>
<source>Copy &amp;Label</source>
- <translation type="unfinished">Copiar &amp;Etiqueta</translation>
+ <translation type="unfinished">Copiar &amp;etiqueta</translation>
</message>
<message>
<source>&amp;Edit</source>
@@ -81,7 +81,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Exportar Lista de Endereços</translation>
+ <translation type="unfinished">Exportar lista de endereços</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -91,19 +91,19 @@ Assinar só é possível com endereços do tipo "legado".</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">Ocorreu um erro ao tentar guardar a lista de endereços para %1. Por favor, tente novamente.</translation>
+ <translation type="unfinished">Ocorreu um erro ao tentar guardar a lista de endereços em %1. Por favor, tente novamente.</translation>
</message>
<message>
<source>Sending addresses - %1</source>
- <translation type="unfinished">Enviando endereços - %1</translation>
+ <translation type="unfinished">Endereço de envio - %1</translation>
</message>
<message>
<source>Receiving addresses - %1</source>
- <translation type="unfinished">Recebendo endereços - %1</translation>
+ <translation type="unfinished">Endereços de receção - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Exportação Falhou</translation>
+ <translation type="unfinished">Falha na exportação</translation>
</message>
</context>
<context>
@@ -125,7 +125,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation type="unfinished">Janela da Frase de Segurança</translation>
+ <translation type="unfinished">Janela da frase de segurança</translation>
</message>
<message>
<source>Enter passphrase</source>
@@ -133,15 +133,15 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Nova frase de frase de segurança</translation>
+ <translation type="unfinished">Nova frase de segurança</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Repita a nova frase de frase de segurança</translation>
+ <translation type="unfinished">Repita a nova frase de segurança</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Mostrar Password</translation>
+ <translation type="unfinished">Mostrar frase de segurança</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -149,11 +149,11 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Esta operação precisa da sua frase de segurança da carteira para desbloquear a mesma.</translation>
+ <translation type="unfinished">Esta operação necessita da frase de segurança da sua carteira para a desbloquear.</translation>
</message>
<message>
<source>Unlock wallet</source>
- <translation type="unfinished">Desbloquear carteira</translation>
+ <translation type="unfinished">Desbloquear a carteira</translation>
</message>
<message>
<source>Change passphrase</source>
@@ -177,15 +177,23 @@ Assinar só é possível com endereços do tipo "legado".</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">Insira nova password para a carteira.&lt;br/&gt;Por favor use uma password de &lt;b&gt;dez ou mais caracteres&lt;/b&gt;, ou &lt;b&gt;oito ou mais palavras&lt;/b&gt;.</translation>
+ <translation type="unfinished">Insira a nova frase de segurança para a carteira.&lt;br/&gt;Por favor use uma frase de segurança de &lt;b&gt;dez ou mais caracteres&lt;/b&gt; ou &lt;b&gt;oito ou mais palavras&lt;/b&gt;.</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Insira a password antiga e a nova para a carteira.</translation>
+ <translation type="unfinished">Insira a frase de segurança antiga e a nova para a carteira.</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished">Continuar</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Voltar</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">Lembra se que encrostar a sua carteira não o pode defender na totalidade os seus bitcoins de serem roubados por um malware que possa infectar o seu computador.</translation>
+ <translation type="unfinished">Lembre-se que a encriptação da sua carteira não impede totalmente os seus bitcoins de serem roubados por programas maliciosos (malware) que infetem o seu computador.</translation>
</message>
<message>
<source>Wallet to be encrypted</source>
@@ -205,7 +213,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Wallet encryption failed</source>
- <translation type="unfinished">Encriptação da carteira falhou</translation>
+ <translation type="unfinished">Falha na encriptação da carteira</translation>
</message>
<message>
<source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
@@ -217,7 +225,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">Desbloqueio da carteira falhou</translation>
+ <translation type="unfinished">Falha no desbloqueio da carteira</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
@@ -225,7 +233,7 @@ Assinar só é possível com endereços do tipo "legado".</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">A palavra passe inserida para a de-criptografia da carteira é incorreta . Ela contém um caractere nulo (ou seja - um byte zero). Se a palavra passe foi configurada em uma versão anterior deste software antes da versão 25.0, por favor tente novamente apenas com os caracteres maiúsculos — mas não incluindo — o primeiro caractere nulo. Se for bem-sucedido, defina uma nova senha para evitar esse problema no futuro.</translation>
+ <translation type="unfinished">A frase de segurança introduzida para a desencriptação da carteira está incorreta. Contém um carácter nulo (ou seja, um byte zero). Se a frase de segurança foi definida com uma versão deste software anterior à 25.0, tente novamente com apenas os caracteres até - mas não incluindo - o primeiro carácter nulo. Se isso for bem-sucedido, defina uma nova frase de segurança para evitar esse problema no futuro.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -233,26 +241,26 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Passphrase change failed</source>
- <translation type="unfinished">A alteração da frase de segurança falhou</translation>
+ <translation type="unfinished">Falha na alteração da frase de seguranç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">A senha antiga inserida para a de-criptografia da carteira está incorreta. Ele contém um caractere nulo (ou seja, um byte zero). Se a senha foi definida com uma versão deste software anterior a 25.0, tente novamente apenas com os caracteres maiúsculo — mas não incluindo — o primeiro caractere nulo.</translation>
+ <translation type="unfinished">A frase de segurança antiga introduzida para a desencriptação da carteira está incorreta. Contém um carácter nulo (ou seja, um byte zero). Se a frase de segurança foi definida com uma versão deste software anterior à 25.0, tente novamente com apenas os caracteres até - mas não incluindo - o primeiro carácter nulo.</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">Aviso: a tecla Caps Lock está ativa!</translation>
+ <translation type="unfinished">Aviso: a tecla de bloqueio de maiúsculas está ativa!</translation>
</message>
</context>
<context>
<name>BanTableModel</name>
<message>
<source>IP/Netmask</source>
- <translation type="unfinished">IP/Máscara de Rede</translation>
+ <translation type="unfinished">IP / máscara de rede</translation>
</message>
<message>
<source>Banned Until</source>
- <translation type="unfinished">Banido Até</translation>
+ <translation type="unfinished">Banido até</translation>
</message>
</context>
<context>
@@ -263,11 +271,11 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Runaway exception</source>
- <translation type="unfinished">Exceção de Runaway</translation>
+ <translation type="unfinished">Exceção de fuga (runaway)</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Um erro fatal ocorreu. %1 não pode mais continuar de maneira segura e será terminada.</translation>
+ <translation type="unfinished">Ocorreu um erro fatal. %1 já não pode continuar em segurança e vai ser encerrado.</translation>
</message>
<message>
<source>Internal error</source>
@@ -288,7 +296,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<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">Ocorreu um erro fatal. Verifique se o arquivo de configurações é editável, ou tente correr com -nosettings.</translation>
+ <translation type="unfinished">Ocorreu um erro fatal. Verifique se o ficheiro de configurações pode ser escrito ou tente executar com -nosettings.</translation>
</message>
<message>
<source>Error: %1</source>
@@ -296,7 +304,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 ainda não terminou com segurança...</translation>
+ <translation type="unfinished">%1 ainda não encerrou de forma segura…</translation>
</message>
<message>
<source>unknown</source>
@@ -304,15 +312,15 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Embedded "%1"</source>
- <translation type="unfinished">Embutido "%1"</translation>
+ <translation type="unfinished">"%1" embutido</translation>
</message>
<message>
<source>Default system font "%1"</source>
- <translation type="unfinished">Fonte padrão do sistema "%1"</translation>
+ <translation type="unfinished">Tipo de letra do sistema "%1"</translation>
</message>
<message>
<source>Custom…</source>
- <translation type="unfinished">Personalizado...</translation>
+ <translation type="unfinished">Personalizado…</translation>
</message>
<message>
<source>Amount</source>
@@ -344,17 +352,17 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Retransmissão de Blocos</translation>
+ <translation type="unfinished">Retransmissão de blocos</translation>
</message>
<message>
<source>Feeler</source>
<extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Antena</translation>
+ <translation type="unfinished">Sensor</translation>
</message>
<message>
<source>Address Fetch</source>
<extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
- <translation type="unfinished">Procura de endreços</translation>
+ <translation type="unfinished">Obtenção de endereços</translation>
</message>
<message>
<source>None</source>
@@ -410,7 +418,11 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<numerusform>%n anos </numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">carteira predefinida</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -431,7 +443,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>E&amp;xit</source>
- <translation type="unfinished">Fec&amp;har</translation>
+ <translation type="unfinished">&amp;Sair</translation>
</message>
<message>
<source>Quit application</source>
@@ -455,11 +467,11 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Modify configuration options for %1</source>
- <translation type="unfinished">Modificar opções de configuração para %1</translation>
+ <translation type="unfinished">Alterar opções de configuração de %1</translation>
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Criar novo carteira</translation>
+ <translation type="unfinished">Criar nova carteira</translation>
</message>
<message>
<source>&amp;Minimize</source>
@@ -476,7 +488,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">Proxy está &lt;b&gt;ativado&lt;/b&gt;: %1</translation>
+ <translation type="unfinished">O proxy está &lt;b&gt;ativado&lt;/b&gt;: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -484,7 +496,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Backup wallet to another location</source>
- <translation type="unfinished">Efetue uma cópia de segurança da carteira para outra localização</translation>
+ <translation type="unfinished">Fazer uma cópia de segurança da carteira para outra localização</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
@@ -536,7 +548,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Carregar PSBT do arquivo...</translation>
+ <translation type="unfinished">&amp;Carregar PSBT do ficheiro...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -724,10 +736,6 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Mascare os valores na aba de visão geral</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">carteira predefinida</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Sem carteiras disponíveis</translation>
</message>
@@ -786,12 +794,12 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<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">Clique para mais acções.</translation>
+ <translation type="unfinished">Clique para mais ações.</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">Mostra aba de Pares</translation>
+ <translation type="unfinished">Mostra aba de pares</translation>
</message>
<message>
<source>Disable network activity</source>
@@ -801,7 +809,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">Activar atividade da rede</translation>
+ <translation type="unfinished">Ativar atividade da rede</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
@@ -832,7 +840,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<message>
<source>Amount: %1
</source>
- <translation type="unfinished">Valor: %1
+ <translation type="unfinished">Quantia: %1
</translation>
</message>
<message>
@@ -869,11 +877,11 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">Criação de chave HD está &lt;b&gt;ativada&lt;/b&gt;</translation>
+ <translation type="unfinished">A criação de chave HD está &lt;b&gt;ativada&lt;/b&gt;</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">Criação de chave HD está &lt;b&gt;desativada&lt;/b&gt;</translation>
+ <translation type="unfinished">A criação de chave HD está &lt;b&gt;desativada&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -896,14 +904,14 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">Unidade de valores recebidos. Clique para selecionar outra unidade.</translation>
+ <translation type="unfinished">Unidade de quantias recebidas. Clique para selecionar outra unidade.</translation>
</message>
</context>
<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
- <translation type="unfinished">Seleção de Moeda</translation>
+ <translation type="unfinished">Seleção de moeda</translation>
</message>
<message>
<source>Quantity:</source>
@@ -1052,7 +1060,7 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
<message>
<source>Can't list signers</source>
- <translation type="unfinished">Não é possível listar signatários</translation>
+ <translation type="unfinished">Não é possível listar os signatários</translation>
</message>
<message>
<source>Too many external signers found</source>
@@ -1088,11 +1096,11 @@ If this wallet contains any watchonly scripts, a new wallet will be created whic
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.
+ <translation type="unfinished">A migração da carteira converterá esta carteira numa ou mais carteiras descritoras. Terá de ser efetuada uma nova cópia de segurança da carteira.
+Se esta carteira contiver quaisquer scripts só de observação, será criada uma nova carteira que contenha esses scripts só de observação.
+Se esta carteira contiver quaisquer scripts solucionáveis mas não observados, será criada uma carteira nova e diferente que contenha 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>
+O processo de migração criará uma cópia de segurança da carteira antes da migração. Este ficheiro de cópia de segurança será denominado &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak e pode ser encontrado no diretório para esta carteira. Na eventualidade de uma migração incorreta, a cópia de segurança pode ser restaurada com a funcionalidade "Restaurar carteira".</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -1100,15 +1108,19 @@ O processo de migração criará um backup da carteira antes da migração. Este
</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>
+ <translation type="unfinished">A migrar a 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>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Os scripts de observação/watchonly foram migrados para uma nova carteira chamada '%1'.</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>
+ <translation type="unfinished">Os scripts solucionáveis mas não observados/watched foram migrados para uma nova carteira chamada '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1116,7 +1128,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Migration Successful</source>
- <translation type="unfinished">Êxito na migração</translation>
+ <translation type="unfinished">Migração bem sucedida</translation>
</message>
</context>
<context>
@@ -1127,16 +1139,12 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Open wallet warning</source>
- <translation type="unfinished">Aviso abertura carteira</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">carteira predefinida</translation>
+ <translation type="unfinished">Aviso de carteira aberta</translation>
</message>
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Abrir Carteira</translation>
+ <translation type="unfinished">Abrir carteira</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1164,7 +1172,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
<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">Aviso de restaurar carteira</translation>
+ <translation type="unfinished">Aviso de restaurar a carteira</translation>
</message>
<message>
<source>Restore wallet message</source>
@@ -1176,34 +1184,34 @@ O processo de migração criará um backup da carteira antes da migração. Este
<name>WalletController</name>
<message>
<source>Close wallet</source>
- <translation type="unfinished">Fechar a carteira</translation>
+ <translation type="unfinished">Fechar carteira</translation>
</message>
<message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Tem a certeza que deseja fechar esta carteira &lt;i&gt;%1&lt;/i&gt;?</translation>
+ <translation type="unfinished">Tem a certeza que deseja fechar a carteira &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">Fechar a carteira durante demasiado tempo pode resultar em ter de resincronizar a cadeia inteira se pruning estiver ativado.</translation>
+ <translation type="unfinished">Fechar a carteira durante demasiado tempo pode resultar na necessidade de voltar a sincronizar toda a cadeia se a redução (prune) estiver ativada.</translation>
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Fechar todas carteiras.</translation>
+ <translation type="unfinished">Fechar todas carteiras</translation>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">Você tem certeza que deseja fechar todas as carteira?</translation>
+ <translation type="unfinished">Tem a certeza de que deseja fechar todas as carteiras?</translation>
</message>
</context>
<context>
<name>CreateWalletDialog</name>
<message>
<source>Create Wallet</source>
- <translation type="unfinished">Criar Carteira</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>
+ <translation type="unfinished">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>
@@ -1211,7 +1219,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Wallet Name</source>
- <translation type="unfinished">Nome da Carteira</translation>
+ <translation type="unfinished">Nome da carteira</translation>
</message>
<message>
<source>Wallet</source>
@@ -1219,11 +1227,11 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">Encriptar carteira. A carteira vai ser encriptada com uma password de sua escolha.</translation>
+ <translation type="unfinished">Encriptar carteira. A carteira vai ser encriptada com uma frase de segurança à sua escolha.</translation>
</message>
<message>
<source>Encrypt Wallet</source>
- <translation type="unfinished">Encriptar Carteira</translation>
+ <translation type="unfinished">Encriptar carteira</translation>
</message>
<message>
<source>Advanced Options</source>
@@ -1231,19 +1239,19 @@ O processo de migração criará um backup da carteira antes da migração. Este
</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">Desative chaves privadas para esta carteira. As carteiras com chaves privadas desativadas não terão chaves privadas e não poderão ter uma semente em HD ou chaves privadas importadas. Isso é ideal para carteiras sem movimentos.</translation>
+ <translation type="unfinished">Desativar as chaves privadas para esta carteira. As carteiras com chaves privadas desativadas não terão chaves privadas e não podem ter uma semente HD ou chaves privadas importadas. Isto é ideal para carteiras só de observação.</translation>
</message>
<message>
<source>Disable Private Keys</source>
- <translation type="unfinished">Desactivar Chaves Privadas</translation>
+ <translation type="unfinished">Desativar chaves 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">Faça uma carteira em branco. As carteiras em branco não possuem inicialmente chaves ou scripts privados. Chaves e endereços privados podem ser importados ou uma semente HD pode ser configurada posteriormente.</translation>
+ <translation type="unfinished">Crie uma carteira em branco. As carteiras em branco não têm inicialmente chaves privadas ou scripts. As chaves privadas e os endereços podem ser importados ou pode ser definida uma semente HD numa altura posterior.</translation>
</message>
<message>
<source>Make Blank Wallet</source>
- <translation type="unfinished">Fazer Carteira em Branco</translation>
+ <translation type="unfinished">Criar uma carteira em branco</translation>
</message>
<message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
@@ -1251,7 +1259,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>External signer</source>
- <translation type="unfinished">Signatário externo</translation>
+ <translation type="unfinished">Assinante externo</translation>
</message>
<message>
<source>Create</source>
@@ -1260,14 +1268,14 @@ O processo de migração criará um backup da carteira antes da migração. Este
<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>
+ <translation type="unfinished">Compilado sem suporte de assinatura externa (necessário para assinatura externa)</translation>
</message>
</context>
<context>
<name>EditAddressDialog</name>
<message>
<source>Edit Address</source>
- <translation type="unfinished">Editar Endereço</translation>
+ <translation type="unfinished">Editar endereço</translation>
</message>
<message>
<source>&amp;Label</source>
@@ -1275,11 +1283,11 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>The label associated with this address list entry</source>
- <translation type="unfinished">A etiqueta associada com esta entrada da lista de endereços</translation>
+ <translation type="unfinished">A etiqueta associada a esta entrada da lista de endereços</translation>
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">O endereço associado com o esta entrada da lista de endereços. Isto só pode ser alterado para os endereços de envio.</translation>
+ <translation type="unfinished">O endereço associado a esta entrada da lista de endereços. Isto só pode ser alterado para os endereços de envio.</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -1295,7 +1303,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Edit sending address</source>
- <translation type="unfinished">Editar o endereço de envio</translation>
+ <translation type="unfinished">Editar endereço de envio</translation>
</message>
<message>
<source>The entered address "%1" is not a valid Bitcoin address.</source>
@@ -1366,22 +1374,22 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Choose data directory</source>
- <translation type="unfinished">Escolha o diretório dos dados</translation>
+ <translation type="unfinished">Escolha a pasta dos dados</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">No mínimo %1 GB de dados irão ser armazenados nesta pasta.</translation>
+ <translation type="unfinished">Serão armazenados nesta pasta pelo menos %1 GB de dados, que irão aumentar com o tempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Aproximadamente %1 GB de dados irão ser guardados nesta pasta.</translation>
+ <translation type="unfinished">Serão guardados nesta pasta aproximadamente %1 GB de dados.</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 backups de %n dia atrás)</numerusform>
- <numerusform>(suficiente para restaurar backups de %n dias atrás)</numerusform>
+ <numerusform>(suficiente para restaurar cópias de segurança de %n dia atrás)</numerusform>
+ <numerusform>(suficiente para restaurar cópias de segurança de %n dias atrás)</numerusform>
</translation>
</message>
<message>
@@ -1394,7 +1402,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">Erro: não pode ser criada a pasta de dados especificada como "%1.</translation>
+ <translation type="unfinished">Erro: não pode ser criada a pasta de dados especificada como "%1".</translation>
</message>
<message>
<source>Error</source>
@@ -1414,23 +1422,23 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Limit block chain storage to</source>
- <translation type="unfinished">Limitar o tamanho da blockchain para</translation>
+ <translation type="unfinished">Limitar o armazenamento da cadeia de blocos 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">Para reverter essa configuração, é necessário o download de todo o blockchain novamente. É mais rápido fazer o download da blockchain completa primeiro e removê-la mais tarde. Desativa alguns recursos avançados.</translation>
+ <translation type="unfinished">Se reverter esta configuração terá de descarregar novamente toda a cadeia de blocos. É mais rápido fazer o descarregamento da cadeia completa primeiro e reduzi-la (prune) mais tarde. Isto desativa alguns recursos avançados.</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">Esta sincronização inicial é muito exigente, e pode expor problemas com o seu computador que previamente podem ter passado despercebidos. Cada vez que corre %1, este vai continuar a descarregar de onde deixou.</translation>
+ <translation type="unfinished">Esta sincronização inicial é muito exigente e pode expor problemas de hardware no seu computador que anteriormente tinham passado despercebidos. Sempre que executar o %1, este continuará a descarregar a partir do ponto em que foi interrompido.</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">Quando clicar em OK, %1 iniciará o download e irá processar a cadeia de blocos completa %4 (%2 GB) iniciando com as transações mais recentes em %3 enquanto %4 é processado. </translation>
+ <translation type="unfinished">Quando clicar em OK, %1 começará a descarregar e a processar toda a cadeia de blocos de %4 (%2 GB), começando com as primeiras transações em %3 quando %4 foi lançado 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">Se escolheu limitar o armazenamento da cadeia de blocos (poda), a data histórica ainda tem de ser descarregada e processada, mas irá ser apagada no final para manter uma utilização baixa do espaço de disco.</translation>
+ <translation type="unfinished">Se tiver optado por reduzir o armazenamento da cadeia de blocos (prune), os dados históricos ainda têm de ser descarregados e processados, mas serão eliminados posteriormente para manter a utilização do disco baixa.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -1453,14 +1461,14 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Command-line options</source>
- <translation type="unfinished">Opções da linha de comando</translation>
+ <translation type="unfinished">Opções da linha de comandos</translation>
</message>
</context>
<context>
<name>ShutdownWindow</name>
<message>
<source>%1 is shutting down…</source>
- <translation type="unfinished">%1 está a desligar…</translation>
+ <translation type="unfinished">%1 está a encerrar…</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -1475,11 +1483,11 @@ O processo de migração criará um backup da carteira antes da migração. Este
</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">Transações recentes podem não ser visíveis por agora, portanto o saldo da sua carteira pode estar incorreto. Esta informação será corrigida quando a sua carteira acabar de sincronizar com a rede, como está explicado em baixo.</translation>
+ <translation type="unfinished">As transações recentes podem ainda não ser visíveis e, por isso, o saldo da sua carteira pode estar incorreto. Esta informação estará correta assim que a sua carteira terminar a sincronização com a rede bitcoin, conforme detalhado abaixo.</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">Tentar enviar bitcoins que estão afetadas por transações ainda não exibidas não será aceite pela rede.</translation>
+ <translation type="unfinished">A rede não aceitará tentativas de gastar bitcoins afetados por transações que ainda não foram mostradas.</translation>
</message>
<message>
<source>Number of blocks left</source>
@@ -1503,43 +1511,39 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Progress increase per hour</source>
- <translation type="unfinished">Aumento horário do progresso</translation>
+ <translation type="unfinished">Aumento do progresso por hora</translation>
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">tempo restante estimado até à sincronização</translation>
+ <translation type="unfinished">Tempo estimado até à sincronização</translation>
</message>
<message>
<source>Hide</source>
<translation type="unfinished">Ocultar</translation>
</message>
<message>
- <source>Esc</source>
- <translation type="unfinished">Sair</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á neste momento a sincronizar. Irá descarregar os cabeçalhos e blocos dos pares e validá-los até atingir a ponta da cadeia de blocos.</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Desconhecido. A sincronizar cabeçalhos (%1, %2%)...</translation>
+ <translation type="unfinished">Desconhecido. A sincronizar cabeçalhos (%1, %2%)…</translation>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Desconhecido. Pré-Sincronizando Cabeçalhos (%1, %2%)...</translation>
+ <translation type="unfinished">Desconhecido. A pré-sincronizar cabeçalhos (%1, %2%)…</translation>
</message>
</context>
<context>
<name>OpenURIDialog</name>
<message>
<source>Open bitcoin URI</source>
- <translation type="unfinished">Abrir um Bitcoin URI</translation>
+ <translation type="unfinished">Abrir um URI de bitcoin</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">Cole endereço da área de transferência</translation>
+ <translation type="unfinished">Colar endereço da área de transferência</translation>
</message>
</context>
<context>
@@ -1562,7 +1566,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</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">A ativação do pruning reduz significativamente o espaço em disco necessário para armazenar transações. Todos os blocos ainda estão totalmente validados. Reverter esta configuração requer que faça novamente o download de toda a blockchain.</translation>
+ <translation type="unfinished">A ativação da poda reduz significativamente o espaço em disco necessário para armazenar transações. Todos os blocos continuam a ser totalmente validados. Reverter esta configuração requer fazer o descarregamento de toda a cadeia de blocos.</translation>
</message>
<message>
<source>Size of &amp;database cache</source>
@@ -1573,40 +1577,44 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Número de processos de &amp;verificação 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">Caminho completo para um script compatível %1 com Bitcoin Core (exemplo C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Cuidado: um programa malicioso (malware) pode roubar as suas moedas!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Endereço de IP do proxy (exemplo, 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">Mostra se o padrão fornecido SOCKS5 proxy, está a ser utilizado para alcançar utilizadores participantes através deste tipo de rede.</translation>
+ <translation type="unfinished">Mostra se o proxy SOCKS5 padrão fornecido é usado para alcançar os pares através deste tipo de rede.</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">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>
+ <translation type="unfinished">Minimizar em vez de sair da aplicação quando a janela é fechada. Quando esta opção é ativada, a aplicação apenas será encerrada quando selecionar "Sair" no menu.</translation>
</message>
<message>
<source>Font in the Overview tab: </source>
- <translation type="unfinished">Fonte no painel de visualização:</translation>
+ <translation type="unfinished">Tipo de letra na aba Resumo:</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>
+ <translation type="unfinished">As opções definidas nesta caixa de diálogo são substituídas pela linha de comandos:</translation>
</message>
<message>
<source>Open the %1 configuration file from the working directory.</source>
- <translation type="unfinished">Abrir o ficheiro de configuração %1 da pasta aberta.</translation>
+ <translation type="unfinished">Abrir o ficheiro de configuração %1 a partir da pasta de trabalho.</translation>
</message>
<message>
<source>Open Configuration File</source>
- <translation type="unfinished">Abrir Ficheiro de Configuração</translation>
+ <translation type="unfinished">Abrir ficheiro de configuração</translation>
</message>
<message>
<source>Reset all client options to default.</source>
- <translation type="unfinished">Repor todas as opções de cliente para a predefinição.</translation>
+ <translation type="unfinished">Repor todas as opções do cliente para os valores de origem.</translation>
</message>
<message>
<source>&amp;Reset Options</source>
- <translation type="unfinished">&amp;Repor Opções</translation>
+ <translation type="unfinished">&amp;Repor opções</translation>
</message>
<message>
<source>&amp;Network</source>
@@ -1617,26 +1625,22 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Reduzir o armazenamento de &amp;bloco para</translation>
</message>
<message>
- <source>GB</source>
- <translation type="unfinished">PT</translation>
- </message>
- <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Reverter esta configuração requer descarregar de novo a cadeia de blocos inteira.</translation>
+ <translation type="unfinished">Se reverter esta configuração terá de descarregar novamente toda a cadeia de blocos.</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">Tamanho máximo da cache da base de dados. Uma cache maior pode contribuir para uma sincronização mais rápida, a partir do qual os benefícios são menos visíveis. Ao baixar o tamanho da cache irá diminuir a utilização de memória. Memória da mempool não usada será partilhada com esta cache.</translation>
+ <translation type="unfinished">Tamanho máximo da cache da base de dados. Uma cache maior pode contribuir para uma sincronização mais rápida, da qual os benefícios são menos visíveis. Diminuir o tamanho da cache reduzirá a utilização de memória. A memória mempool não utilizada será partilhada com esta cache.</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">Define o número de threads do script de verificação. Valores negativos correspondem ao número de núcleos que deseja deixar livres para o sistema.</translation>
+ <translation type="unfinished">Define o número de sub-processos (threads) de verificação de scripts. Os valores negativos correspondem ao número de núcleos que pretende deixar livres para o sistema.</translation>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
- <translation type="unfinished">(0 = automático, &lt;0 = deixar essa quantidade de núcleos livre)</translation>
+ <translation type="unfinished">(0 = automático, &lt;0 = deixar este número de núcleos livres)</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>
@@ -1655,7 +1659,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
<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">Mostrar a quantia com a taxa já subtraída, por padrão.</translation>
+ <translation type="unfinished">Se deve ser mostrado por padrão a quantia com a taxa já subtraída.</translation>
</message>
<message>
<source>Subtract &amp;fee from amount by default</source>
@@ -1686,19 +1690,19 @@ O processo de migração criará um backup da carteira antes da migração. Este
<message>
<source>Whether to show PSBT controls.</source>
<extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
- <translation type="unfinished">Mostrar os controlos PSBT.</translation>
+ <translation type="unfinished">Se devem ser mostrados os controlos PSBT.</translation>
</message>
<message>
<source>External Signer (e.g. hardware wallet)</source>
- <translation type="unfinished">Signatário externo (ex: carteira física)</translation>
+ <translation type="unfinished">Assinante externo (por exemplo, carteira de hardware)</translation>
</message>
<message>
<source>&amp;External signer script path</source>
- <translation type="unfinished">&amp;Caminho do script para signatário externo </translation>
+ <translation type="unfinished">&amp;Caminho do script para assinante 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 a porta do cliente bitcoin automaticamente no seu router. Isto apenas funciona se o seu router suportar UPnP e este se encontrar ligado.</translation>
+ <translation type="unfinished">Abrir automaticamente a porta do cliente Bitcoin no seu router. Isto só funciona quando o seu router suporta UPnP e este está ativado.</translation>
</message>
<message>
<source>Map port using &amp;UPnP</source>
@@ -1706,19 +1710,19 @@ O processo de migração criará um backup da carteira antes da migração. Este
</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 a porta do cliente bitcoin automaticamente no seu router. Isto só funciona se o seu router suportar NAT-PMP e este se encontrar ligado. A porta externa poderá ser aleatória.</translation>
+ <translation type="unfinished">Abrir automaticamente a porta do cliente Bitcoin no seu router. Isto só funciona quando o seu router suporta NAT-PMP e este está ativado. A porta externa pode ser aleatória.</translation>
</message>
<message>
<source>Map port using NA&amp;T-PMP</source>
- <translation type="unfinished">Mapear porta usando &amp;NAT-PMP</translation>
+ <translation type="unfinished">Mapear porta usando NA&amp;T-PMP</translation>
</message>
<message>
<source>Accept connections from outside.</source>
- <translation type="unfinished">Aceitar ligações externas.</translation>
+ <translation type="unfinished">Aceitar conexões do exterior.</translation>
</message>
<message>
<source>Allow incomin&amp;g connections</source>
- <translation type="unfinished">Permitir ligações de "a receber"</translation>
+ <translation type="unfinished">Permitir cone&amp;xões de entrada</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
@@ -1726,7 +1730,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
- <translation type="unfinished">&amp;Ligar através dum proxy SOCKS5 (proxy por defeito):</translation>
+ <translation type="unfinished">&amp;Conectar através de um proxy SOCKS5 (proxy padrão):</translation>
</message>
<message>
<source>Proxy &amp;IP:</source>
@@ -1754,7 +1758,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>&amp;Show tray icon</source>
- <translation type="unfinished">&amp;Mostrar ícone de bandeja</translation>
+ <translation type="unfinished">&amp;Mostrar ícone da bandeja</translation>
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
@@ -1774,11 +1778,11 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>User Interface &amp;language:</source>
- <translation type="unfinished">&amp;Linguagem da interface de utilizador:</translation>
+ <translation type="unfinished">&amp;Idioma da interface:</translation>
</message>
<message>
<source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
- <translation type="unfinished">A linguagem da interface do utilizador pode ser definida aqui. Esta definição entrará em efeito após reiniciar %1.</translation>
+ <translation type="unfinished">O idioma da interface do utilizador pode ser definido aqui. Esta definição entra em vigor depois de reiniciar %1.</translation>
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
@@ -1790,7 +1794,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</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 outrem (ex. um explorador de blocos) que aparece no separador de transações como itens do menu de contexto. %s do URL é substituído pela hash de transação. Múltiplos URLs são separados pela barra vertical I.</translation>
+ <translation type="unfinished">URLs de terceiros (por exemplo, um explorador de blocos) que aparecem na aba de transações como itens de menu de contexto. %s no URL é substituído pelo hash da transação. Vários URLs são separados por barras verticais |.</translation>
</message>
<message>
<source>&amp;Third-party transaction URLs</source>
@@ -1802,11 +1806,11 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
- <translation type="unfinished">Conecte-se a rede Bitcoin através de um proxy SOCKS5 separado para serviços Tor Onion</translation>
+ <translation type="unfinished">Conecte-se à rede Bitcoin através de um proxy SOCKS5 separado para serviços Tor Onion</translation>
</message>
<message>
<source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
- <translation type="unfinished">Use um proxy SOCKS5 separado para alcançar pares por meio dos serviços Tor onion:</translation>
+ <translation type="unfinished">Utilizar um proxy SOCKS5 separado para aceder aos pares através dos serviços Tor onion:</translation>
</message>
<message>
<source>&amp;Cancel</source>
@@ -1815,7 +1819,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
<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>
+ <translation type="unfinished">Compilado sem suporte de assinatura externa (necessário para assinatura externa)</translation>
</message>
<message>
<source>default</source>
@@ -1838,22 +1842,22 @@ O processo de migração criará um backup da carteira antes da migração. Este
<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">Configuração atuais serão copiadas em "%1".</translation>
+ <translation type="unfinished">As definições atuais serão guardadas em "%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">O cliente será desligado. Deseja continuar?</translation>
+ <translation type="unfinished">O cliente será encerrado. Quer continuar?</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">Opções da configuração</translation>
+ <translation type="unfinished">Opções de configuração</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">O ficheiro de configuração é usado para especificar opções de utilizador avançado, que sobrescrevem as configurações do interface gráfico. Adicionalmente, qualquer opção da linha de comandos vai sobrescrever este ficheiro de configuração.</translation>
+ <translation type="unfinished">O ficheiro de configuração é utilizado para especificar opções avançadas do utilizador que se sobrepõem às definições da GUI. Além disso, quaisquer opções da linha de comandos substituirão este ficheiro de configuração.</translation>
</message>
<message>
<source>Continue</source>
@@ -1873,7 +1877,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>This change would require a client restart.</source>
- <translation type="unfinished">Esta alteração obrigará a um reinício do cliente.</translation>
+ <translation type="unfinished">Esta alteração requer que o cliente seja reiniciado.</translation>
</message>
<message>
<source>The supplied proxy address is invalid.</source>
@@ -1884,7 +1888,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
<name>OptionsModel</name>
<message>
<source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">Não foi possível ler as configurações "%1", %2.</translation>
+ <translation type="unfinished">Não foi possível ler a configuração "%1", %2.</translation>
</message>
</context>
<context>
@@ -1895,11 +1899,11 @@ O processo de migração criará um backup da carteira antes da migração. Este
</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">A informação mostrada poderá estar desatualizada. A sua carteira sincroniza automaticamente com a rede Bitcoin depois de estabelecer ligação, mas este processo ainda não está completo.</translation>
+ <translation type="unfinished">A informação apresentada pode estar desatualizada. A sua carteira sincroniza-se automaticamente com a rede Bitcoin após o estabelecimento de conexões, mas este processo ainda não está concluído.</translation>
</message>
<message>
<source>Watch-only:</source>
- <translation type="unfinished">Apenas vigiar:</translation>
+ <translation type="unfinished">Apenas observação:</translation>
</message>
<message>
<source>Available:</source>
@@ -1923,7 +1927,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Mined balance that has not yet matured</source>
- <translation type="unfinished">O saldo minado ainda não amadureceu</translation>
+ <translation type="unfinished">Saldo minerado que ainda não atingiu a maturidade</translation>
</message>
<message>
<source>Balances</source>
@@ -1935,31 +1939,31 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">O seu balanço atual em endereços de apenas vigiar</translation>
+ <translation type="unfinished">O seu saldo atual em endereços de observação</translation>
</message>
<message>
<source>Spendable:</source>
- <translation type="unfinished">Dispensável:</translation>
+ <translation type="unfinished">Gastável:</translation>
</message>
<message>
<source>Recent transactions</source>
- <translation type="unfinished">transações recentes</translation>
+ <translation type="unfinished">Transações recentes</translation>
</message>
<message>
<source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">Transações não confirmadas para endereços de apenas vigiar</translation>
+ <translation type="unfinished">Transações não confirmadas para endereços de observação</translation>
</message>
<message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">Saldo minado ainda não disponível de endereços de apenas vigiar</translation>
+ <translation type="unfinished">Saldo minerado em endereços só de observação que ainda não atingiram a maturidade</translation>
</message>
<message>
<source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Saldo disponível em endereços de apenas vigiar</translation>
+ <translation type="unfinished">Saldo disponível em endereços de observação</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 privacidade ativado para a aba de visão geral. para desmascarar os valores, desmarque nas Configurações -&gt; Valores de máscara</translation>
+ <translation type="unfinished">Modo de privacidade ativado para a aba Resumo. para desmascarar os valores, desmarque nas Configurações -&gt; Valores de máscara</translation>
</message>
</context>
<context>
@@ -1990,15 +1994,15 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Failed to load transaction: %1</source>
- <translation type="unfinished">Falha ao carregar transação: %1</translation>
+ <translation type="unfinished">Falha ao carregar a transação: %1</translation>
</message>
<message>
<source>Failed to sign transaction: %1</source>
- <translation type="unfinished">Falha ao assinar transação: %1</translation>
+ <translation type="unfinished">Falha ao assinar a transação: %1</translation>
</message>
<message>
<source>Cannot sign inputs while wallet is locked.</source>
- <translation type="unfinished">Não é possível assinar entradas enquanto a carteira está trancada.</translation>
+ <translation type="unfinished">Não é possível assinar entradas enquanto a carteira estiver bloqueada.</translation>
</message>
<message>
<source>Could not sign any more inputs.</source>
@@ -2006,11 +2010,11 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Signed %1 inputs, but more signatures are still required.</source>
- <translation type="unfinished">Assinadas entradas %1, mas mais assinaturas ainda são necessárias.</translation>
+ <translation type="unfinished">%1 entradas assinadas, mas ainda são necessárias mais assinaturas.</translation>
</message>
<message>
<source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">Transação assinada com sucesso. Transação está pronta para ser transmitida.</translation>
+ <translation type="unfinished">Transação assinada com sucesso. A transação está pronta para ser transmitida.</translation>
</message>
<message>
<source>Unknown error processing transaction.</source>
@@ -2019,7 +2023,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
<message>
<source>Transaction broadcast successfully! Transaction ID: %1</source>
<translation type="unfinished">Transação transmitida com sucesso.
-ID transação: %1</translation>
+ID da transação: %1</translation>
</message>
<message>
<source>Transaction broadcast failed: %1</source>
@@ -2031,16 +2035,16 @@ ID transação: %1</translation>
</message>
<message>
<source>Save Transaction Data</source>
- <translation type="unfinished">Salvar informação de transação</translation>
+ <translation type="unfinished">Guardar informação da transação</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">Transação parcialmente assinada (Binário)</translation>
+ <translation type="unfinished">Transação parcialmente assinada (binário)</translation>
</message>
<message>
<source>PSBT saved to disk.</source>
- <translation type="unfinished">PSBT salva no disco.</translation>
+ <translation type="unfinished">PSBT guardada no disco.</translation>
</message>
<message>
<source>Sends %1 to %2</source>
@@ -2048,11 +2052,11 @@ ID transação: %1</translation>
</message>
<message>
<source>own address</source>
- <translation type="unfinished">endereço próprio</translation>
+ <translation type="unfinished">próprio endereço</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>
+ <translation type="unfinished">Não foi possível calcular a taxa de transação ou a quantia total da transação.</translation>
</message>
<message>
<source>Pays transaction fee: </source>
@@ -2060,7 +2064,7 @@ ID transação: %1</translation>
</message>
<message>
<source>Total Amount</source>
- <translation type="unfinished">Valor Total</translation>
+ <translation type="unfinished">Quantia total</translation>
</message>
<message>
<source>or</source>
@@ -2068,15 +2072,15 @@ ID transação: %1</translation>
</message>
<message>
<source>Transaction has %1 unsigned inputs.</source>
- <translation type="unfinished">Transação tem %1 entradas não assinadas.</translation>
+ <translation type="unfinished">A transação tem %1 entradas não assinadas.</translation>
</message>
<message>
<source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">Transação está com alguma informação faltando sobre as entradas.</translation>
+ <translation type="unfinished">A transação não contém algumas informações sobre as entradas.</translation>
</message>
<message>
<source>Transaction still needs signature(s).</source>
- <translation type="unfinished">Transação continua precisando de assinatura(s).</translation>
+ <translation type="unfinished">A transação ainda precisa de assinatura(s).</translation>
</message>
<message>
<source>(But no wallet is loaded.)</source>
@@ -2092,11 +2096,11 @@ ID transação: %1</translation>
</message>
<message>
<source>Transaction is fully signed and ready for broadcast.</source>
- <translation type="unfinished">Transação está completamente assinada e pronta para ser transmitida.</translation>
+ <translation type="unfinished">A transação está totalmente assinada e pronta para ser transmitida.</translation>
</message>
<message>
<source>Transaction status is unknown.</source>
- <translation type="unfinished">Status da transação é desconhecido.</translation>
+ <translation type="unfinished">O estado da transação é desconhecido.</translation>
</message>
</context>
<context>
@@ -2107,7 +2111,7 @@ ID transação: %1</translation>
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">Impossível iniciar o controlador de bitcoin: click-to-pay</translation>
+ <translation type="unfinished">Não é possível iniciar o bitcoin: manipulador do click-to-pay</translation>
</message>
<message>
<source>URI handling</source>
@@ -2122,21 +2126,26 @@ ID transação: %1</translation>
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">Não é possível processar o pagamento pedido porque o BIP70 não é suportado.
-Devido a falhas de segurança no BIP70, é recomendado que todas as instruçÅes ao comerciante para mudar de carteiras sejam ignorada.
+Devido a falhas de segurança no BIP70, é recomendado que todas as instruções ao comerciante para mudar de carteiras sejam ignorada.
Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI compatível com 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 não foi lido corretamente! Isto pode ser causado por um endereço Bitcoin inválido ou por parâmetros URI malformados.</translation>
+ <translation type="unfinished">O URI não pode ser analisado! Isto pode ser causado por um endereço Bitcoin inválido ou por parâmetros URI malformados.</translation>
</message>
<message>
<source>Payment request file handling</source>
- <translation type="unfinished">Controlo de pedidos de pagamento.</translation>
+ <translation type="unfinished">Manuseamento do ficheiro de pedidos de pagamento.</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">Agente do utilizador</translation>
+ </message>
+ <message>
<source>Ping</source>
<extracomment>Title of Peers Table column which indicates the current latency of the connection with the peer.</extracomment>
<translation type="unfinished">Latência</translation>
@@ -2149,7 +2158,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<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">idade</translation>
+ <translation type="unfinished">Idade</translation>
</message>
<message>
<source>Direction</source>
@@ -2200,7 +2209,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;Copiar Imagem</translation>
+ <translation type="unfinished">&amp;Copiar imagem</translation>
</message>
<message>
<source>Resulting URI too long, try to reduce the text for label / message.</source>
@@ -2208,15 +2217,15 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Erro ao codificar URI em Código QR.</translation>
+ <translation type="unfinished">Erro ao codificar o URI em código QR</translation>
</message>
<message>
<source>QR code support not available.</source>
- <translation type="unfinished">Suporte códigos QR não disponível</translation>
+ <translation type="unfinished">Suporte para código QR não disponível.</translation>
</message>
<message>
<source>Save QR Code</source>
- <translation type="unfinished">Guardar o código QR</translation>
+ <translation type="unfinished">Guardar código QR</translation>
</message>
<message>
<source>PNG Image</source>
@@ -2232,7 +2241,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Client version</source>
- <translation type="unfinished">Versão do Cliente</translation>
+ <translation type="unfinished">Versão do cliente</translation>
</message>
<message>
<source>&amp;Information</source>
@@ -2243,16 +2252,24 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Geral</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation type="unfinished">Pasta de dados</translation>
+ </message>
+ <message>
<source>To specify a non-default location of the data directory use the '%1' option.</source>
<translation type="unfinished">Para especificar um local não padrão da pasta de dados, use a opção '%1'.</translation>
</message>
<message>
+ <source>Blocksdir</source>
+ <translation type="unfinished">Pasta de blocos</translation>
+ </message>
+ <message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
<translation type="unfinished">Para especificar um local não padrão da pasta dos blocos, use a opção '%1'.</translation>
</message>
<message>
<source>Startup time</source>
- <translation type="unfinished">Hora de Arranque</translation>
+ <translation type="unfinished">Hora de arranque</translation>
</message>
<message>
<source>Network</source>
@@ -2264,7 +2281,15 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Number of connections</source>
- <translation type="unfinished">Número de ligações</translation>
+ <translation type="unfinished">Número de conexões</translation>
+ </message>
+ <message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Endereços locais</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Endereços de rede que seu nó Bitcoin está usando atualmente para se comunicar com outros nós.</translation>
</message>
<message>
<source>Block chain</source>
@@ -2272,7 +2297,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Memory Pool</source>
- <translation type="unfinished">Banco de Memória</translation>
+ <translation type="unfinished">Pool de memória</translation>
</message>
<message>
<source>Current number of transactions</source>
@@ -2280,7 +2305,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Memory usage</source>
- <translation type="unfinished">Utilização de memória</translation>
+ <translation type="unfinished">Utilização da memória</translation>
</message>
<message>
<source>Wallet: </source>
@@ -2292,7 +2317,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>&amp;Reset</source>
- <translation type="unfinished">&amp;Reiniciar</translation>
+ <translation type="unfinished">&amp;Repor</translation>
</message>
<message>
<source>Received</source>
@@ -2315,6 +2340,10 @@ 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>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalhes dos pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versão da camada de transporte: %1</translation>
</message>
@@ -2323,12 +2352,8 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<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>
+ <translation type="unfinished">ID da sessão</translation>
</message>
<message>
<source>Version</source>
@@ -2336,7 +2361,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Se retransmitimos transações para este nó.</translation>
+ <translation type="unfinished">Se retransmitimos transações para este par.</translation>
</message>
<message>
<source>Transaction Relay</source>
@@ -2344,19 +2369,19 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Starting Block</source>
- <translation type="unfinished">Bloco Inicial</translation>
+ <translation type="unfinished">Bloco inicial</translation>
</message>
<message>
<source>Synced Headers</source>
- <translation type="unfinished">Cabeçalhos Sincronizados</translation>
+ <translation type="unfinished">Cabeçalhos sincronizados</translation>
</message>
<message>
<source>Synced Blocks</source>
- <translation type="unfinished">Blocos Sincronizados</translation>
+ <translation type="unfinished">Blocos sincronizados</translation>
</message>
<message>
<source>Last Transaction</source>
- <translation type="unfinished">Última Transação</translation>
+ <translation type="unfinished">Última transação</translation>
</message>
<message>
<source>The mapped Autonomous System used for diversifying peer selection.</source>
@@ -2364,12 +2389,12 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Mapped AS</source>
- <translation type="unfinished">Mapeado como</translation>
+ <translation type="unfinished">S.A. mapeado</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">Endereços são retransmitidos para este nó.</translation>
+ <translation type="unfinished">Se retransmitimos endereços para este par.</translation>
</message>
<message>
<source>Address Relay</source>
@@ -2379,22 +2404,26 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<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">O número total de endereços recebidos deste peer que foram processados (exclui endereços que foram descartados devido à limitação de taxa).</translation>
+ <translation type="unfinished">O número total de endereços recebidos deste par que foram processados (exclui os endereços que foram eliminados devido à limitação da taxa).</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">O número total de endereços recebidos deste peer que não foram processados devido à limitação da taxa.</translation>
+ <translation type="unfinished">O número total de endereços recebidos deste par que foram descartados (não processados) devido à limitação de taxa.</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">Endereços Processados</translation>
+ <translation type="unfinished">Endereços processados</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">Endereços com limite de taxa</translation>
+ <translation type="unfinished">Endereços rejeitados devido a limitação de volume</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation type="unfinished">Agente do utilizador</translation>
</message>
<message>
<source>Node window</source>
@@ -2406,7 +2435,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</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">Abrir o ficheiro de registo de depuração %1 da pasta de dados atual. Isto pode demorar alguns segundos para ficheiros de registo maiores.</translation>
+ <translation type="unfinished">Abrir o ficheiro de registo de depuração %1 da pasta de dados atual. Isto pode demorar alguns segundos para ficheiros de registo grandes.</translation>
</message>
<message>
<source>Decrease font size</source>
@@ -2426,7 +2455,11 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Direction/Type</source>
- <translation type="unfinished">Direção/tipo</translation>
+ <translation type="unfinished">Direção / tipo</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">A cadeia de ID da sessão BIP324 em hexadecimal.</translation>
</message>
<message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
@@ -2437,12 +2470,16 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Serviços</translation>
</message>
<message>
+ <source>High bandwidth BIP152 compact block relay: %1</source>
+ <translation type="unfinished">Relé de bloco compacto BIP152 de largura de banda elevada: %1</translation>
+ </message>
+ <message>
<source>High Bandwidth</source>
- <translation type="unfinished">Alta largura de banda</translation>
+ <translation type="unfinished">Largura de banda elevada</translation>
</message>
<message>
<source>Connection Time</source>
- <translation type="unfinished">Tempo de Ligação</translation>
+ <translation type="unfinished">Tempo de conexão</translation>
</message>
<message>
<source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
@@ -2455,19 +2492,19 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<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">Tempo decorrido desde que uma nova transação aceite para a nossa mempool foi recebida deste par.</translation>
+ <translation type="unfinished">Tempo decorrido desde que foi recebida deste par uma nova transação aceite na nossa pool de memória.</translation>
</message>
<message>
<source>Last Send</source>
- <translation type="unfinished">Último Envio</translation>
+ <translation type="unfinished">Último envio</translation>
</message>
<message>
<source>Last Receive</source>
- <translation type="unfinished">Último Recebimento</translation>
+ <translation type="unfinished">Última receção</translation>
</message>
<message>
<source>Ping Time</source>
- <translation type="unfinished">Tempo de Latência</translation>
+ <translation type="unfinished">Tempo de latência</translation>
</message>
<message>
<source>The duration of a currently outstanding ping.</source>
@@ -2475,15 +2512,15 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>Ping Wait</source>
- <translation type="unfinished">Espera do Ping</translation>
+ <translation type="unfinished">Espera da latência</translation>
</message>
<message>
<source>Min Ping</source>
- <translation type="unfinished">Latência mínima</translation>
+ <translation type="unfinished">Ping mínimo</translation>
</message>
<message>
<source>Time Offset</source>
- <translation type="unfinished">Fuso Horário</translation>
+ <translation type="unfinished">Desvio de tempo</translation>
</message>
<message>
<source>Last block time</source>
@@ -2499,7 +2536,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;Tráfego de Rede</translation>
+ <translation type="unfinished">&amp;Tráfego de rede</translation>
</message>
<message>
<source>Totals</source>
@@ -2524,34 +2561,59 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<message>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">Entrando: iniciado por par</translation>
+ <translation type="unfinished">Entrada: iniciado pelo 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">Relé completo de saída: predefinição</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">Relé de bloco de saída: não retransmite transações ou endereços</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">Saída manual: adicionado utilizando as opções de configuração RPC %1 ou %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">Sensor (feeler) de saída: de curta duração, para testar endereços</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">Obtenção de endereço de saída: de curta duração, para solicitar endereços</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>
+ <translation type="unfinished">a detetar: 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>
+ <translation type="unfinished">v1: protocolo de transporte de texto simples não encriptado</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>
+ <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">selecionámos o par para uma retransmissão de alta banda larga</translation>
+ <translation type="unfinished">selecionámos o par para retransmissão de largura de banda elevada</translation>
</message>
<message>
<source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">o par selecionou-nos para uma retransmissão de alta banda larga</translation>
+ <translation type="unfinished">o par selecionou-nos para uma retransmissão de largura de banda elevada</translation>
</message>
<message>
<source>no high bandwidth relay selected</source>
- <translation type="unfinished">nenhum retransmissor de alta banda larga selecionado</translation>
+ <translation type="unfinished">nenhum retransmissor de largura de banda elevada selecionado</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -2568,7 +2630,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 di&amp;a</translation>
+ <translation type="unfinished">1 &amp;dia</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2581,7 +2643,7 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<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/Netmask</translation>
+ <translation type="unfinished">&amp;Copiar IP / máscara de rede</translation>
</message>
<message>
<source>&amp;Unban</source>
@@ -2592,6 +2654,10 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Atividade de rede desativada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nenhum</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">A executar o comando sem qualquer carteira</translation>
</message>
@@ -2612,18 +2678,18 @@ 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 à %1 consola RPC.
+ <translation type="unfinished">Bem-vindo à %1 consola RPC.
Utilize as setas para cima e para baixo para navegar no histórico, e %2 para limpar o ecrã.
Utilize o %3 e %4 para aumentar ou diminuir o tamanho da letra.
Escreva %5 para uma visão geral dos comandos disponíveis.
Para mais informação acerca da utilização desta consola, escreva %6.
-%7ATENÇÃO: Foram notadas burlas, dizendo aos utilizadores para escreverem comandos aqui, roubando os conteúdos da sua carteira. Não utilize esta consola sem perceber as ramificações de um comando.%8</translation>
+%7ATENÇÃO: foram notadas burlas, dizendo aos utilizadores para escreverem comandos aqui, roubando os conteúdos da sua carteira. Não utilize esta consola sem perceber as ramificações de um comando.%8</translation>
</message>
<message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
- <translation type="unfinished">A executar...</translation>
+ <translation type="unfinished">A executar…</translation>
</message>
<message>
<source>(peer: %1)</source>
@@ -2674,7 +2740,7 @@ Para mais informação acerca da utilização desta consola, escreva %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">Uma mensagem opcional para anexar ao pedido de pagamento, que será exibida quando o pedido for aberto. Nota: A mensagem não será enviada com o pagamento através da rede Bitcoin.</translation>
+ <translation type="unfinished">Uma mensagem opcional a anexar ao pedido de pagamento, que será mostrada quando o pedido for aberto. Nota: a mensagem não será enviada com o pagamento através da rede Bitcoin.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
@@ -2682,19 +2748,19 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">Utilize este formulário para solicitar pagamentos. Todos os campos são &lt;b&gt;opcionais&lt;/b&gt;.</translation>
+ <translation type="unfinished">Utilize este formulário para pedir pagamentos. Todos os campos são &lt;b&gt;opcionais&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">Uma quantia opcional a solicitar. Deixe em branco ou zero para não solicitar uma quantidade específica.</translation>
+ <translation type="unfinished">Uma quantia opcional a solicitar. Deixe em branco ou zero para não solicitar uma quantia específica.</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">Um legenda opcional para associar com o novo endereço de recebimento (usado por você para identificar uma fatura). Ela é também anexada ao pedido de pagamento.</translation>
+ <translation type="unfinished">Uma etiqueta opcional para associar ao novo endereço de receção (usada por si para identificar uma fatura). É também anexada ao pedido de pagamento.</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">Uma mensagem opicional que é anexada ao pedido de pagamento e pode ser mostrada para o remetente.</translation>
+ <translation type="unfinished">Uma mensagem opcional que é anexada ao pedido de pagamento e que pode ser mostrada ao remetente.</translation>
</message>
<message>
<source>&amp;Create new receiving address</source>
@@ -2710,7 +2776,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Requested payments history</source>
- <translation type="unfinished">Histórico de pagamentos solicitados</translation>
+ <translation type="unfinished">Histórico de pagamentos pedidos</translation>
</message>
<message>
<source>Show the selected request (does the same as double clicking an entry)</source>
@@ -2749,6 +2815,10 @@ Para mais informação acerca da utilização desta consola, escreva %6.
<translation type="unfinished">Copiar &amp;quantia</translation>
</message>
<message>
+ <source>Base58 (Legacy)</source>
+ <translation type="unfinished">Base58 (legado)</translation>
+ </message>
+ <message>
<source>Not recommended due to higher fees and less protection against typos.</source>
<translation type="unfinished">Não recomendado devido a taxas mais altas e menor proteção contra erros de digitação.</translation>
</message>
@@ -2762,7 +2832,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) é uma atualização para o Bech32,</translation>
+ <translation type="unfinished">O Bech32m (BIP-350) é uma atualização do Bech32, mas o suporte da carteira ainda é limitado.</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -2789,7 +2859,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Label:</source>
- <translation type="unfinished">Legenda:</translation>
+ <translation type="unfinished">Etiqueta:</translation>
</message>
<message>
<source>Message:</source>
@@ -2805,7 +2875,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Copy &amp;Address</source>
- <translation type="unfinished">Copi&amp;ar Endereço</translation>
+ <translation type="unfinished">Copi&amp;ar endereço</translation>
</message>
<message>
<source>&amp;Verify</source>
@@ -2813,7 +2883,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">Verifique este endreço, por exemplo, no ecrã de uma wallet física</translation>
+ <translation type="unfinished">Verifique este endereço, por exemplo, no ecrã de uma carteira física</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2821,11 +2891,11 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Payment information</source>
- <translation type="unfinished">Informação de Pagamento</translation>
+ <translation type="unfinished">Informação de pagamento</translation>
</message>
<message>
<source>Request payment to %1</source>
- <translation type="unfinished">Requisitar Pagamento para %1</translation>
+ <translation type="unfinished">Pedir pagamento a %1</translation>
</message>
</context>
<context>
@@ -2863,15 +2933,15 @@ Para mais informação acerca da utilização desta consola, escreva %6.
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
- <translation type="unfinished">Enviar Moedas</translation>
+ <translation type="unfinished">Enviar moedas</translation>
</message>
<message>
<source>Coin Control Features</source>
- <translation type="unfinished">Funcionalidades do Controlo de Moedas:</translation>
+ <translation type="unfinished">Funcionalidades do controlo de moedas</translation>
</message>
<message>
<source>automatically selected</source>
- <translation type="unfinished">selecionadas automáticamente</translation>
+ <translation type="unfinished">selecionadas automaticamente</translation>
</message>
<message>
<source>Insufficient funds!</source>
@@ -2891,7 +2961,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Depois da taxa:</translation>
+ <translation type="unfinished">Após a taxa:</translation>
</message>
<message>
<source>Change:</source>
@@ -2915,7 +2985,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Warning: Fee estimation is currently not possible.</source>
- <translation type="unfinished">Aviso: atualmente, não é possível a estimativa da taxa.</translation>
+ <translation type="unfinished">Aviso: neste momento não é possível fazer uma estimativa das taxas.</translation>
</message>
<message>
<source>per kilobyte</source>
@@ -2939,7 +3009,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Add &amp;Recipient</source>
- <translation type="unfinished">Adicionar &amp;Destinatário</translation>
+ <translation type="unfinished">Adicionar &amp;destinatário</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
@@ -2947,7 +3017,7 @@ Para mais informação acerca da utilização desta consola, escreva %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">Entradas...</translation>
+ <translation type="unfinished">Entradas…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2963,35 +3033,35 @@ Para mais informação acerca da utilização desta consola, escreva %6.
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">Especifique uma taxa personalizada por kB (1.000 bytes) do tamanho virtual da transação.
-Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para um tamanho de transação de 500 bytes virtuais (metade de 1 kvB) resultaria em uma taxa de apenas 50 satoshis.</translation>
+Nota: como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para um tamanho de transação de 500 bytes virtuais (metade de 1 kvB) resultaria em uma taxa de apenas 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">Quando o volume de transações é maior que o espaço nos blocos, os mineradores, bem como os nós de retransmissão, podem impor uma taxa mínima. Pagar apenas esta taxa mínima é muito bom, mas esteja ciente que isso pode resultar numa transação nunca confirmada, uma vez que há mais pedidos para transações do que a rede pode processar.</translation>
+ <translation type="unfinished">Quando há menos volume de transações do que espaço nos blocos, os mineradores, bem como os pares de retransmissão, podem impor uma taxa mínima. Pagar apenas esta taxa mínima não faz mal, mas tenha em atenção que isto pode resultar numa transação nunca confirmada, uma vez que há mais procura de transações de bitcoin do que a rede pode processar.</translation>
</message>
<message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">Uma taxa muito baixa pode resultar numa transação nunca confirmada (leia a dica)</translation>
+ <translation type="unfinished">Uma taxa muito baixa pode resultar numa transação nunca confirmada (leia a dica no menu de contexto)</translation>
</message>
<message>
<source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">(A taxa inteligente ainda não foi inicializada. Isto demora normalmente alguns blocos...)</translation>
+ <translation type="unfinished">(A taxa inteligente ainda não foi inicializada. Isto demora normalmente alguns blocos…)</translation>
</message>
<message>
<source>Confirmation time target:</source>
- <translation type="unfinished">Tempo de confirmação:</translation>
+ <translation type="unfinished">Objetivo de tempo de confirmação:</translation>
</message>
<message>
<source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Ativar substituir-por-taxa</translation>
+ <translation type="unfinished">Ativar "substituir por taxa"</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">Com substituir-por-taxa (BIP-125) pode aumentar a taxa da transação após ela ser enviada. Sem isto, pode ser recomendável uma taxa maior para compensar o risco maior de atraso na transação.</translation>
+ <translation type="unfinished">Com "substituir por taxa" (Replace-By-Fee) (BIP-125) pode aumentar a taxa da transação após ela ser enviada. Sem isto, pode ser recomendável uma taxa maior para compensar o risco maior de atraso na transação.</translation>
</message>
<message>
<source>Clear &amp;All</source>
- <translation type="unfinished">Limpar &amp;Tudo</translation>
+ <translation type="unfinished">Limpar &amp;tudo</translation>
</message>
<message>
<source>Balance:</source>
@@ -2999,7 +3069,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Confirm the send action</source>
- <translation type="unfinished">Confirme ação de envio</translation>
+ <translation type="unfinished">Confirme o envio</translation>
</message>
<message>
<source>S&amp;end</source>
@@ -3011,7 +3081,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Copy amount</source>
- <translation type="unfinished">Copiar valor</translation>
+ <translation type="unfinished">Copiar quantia</translation>
</message>
<message>
<source>Copy fee</source>
@@ -3036,11 +3106,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">entrar no dispositivo</translation>
+ <translation type="unfinished">Assinar no dispositivo</translation>
</message>
<message>
<source>Connect your hardware wallet first.</source>
- <translation type="unfinished">Por favor conecte a sua wallet física primeiro.</translation>
+ <translation type="unfinished">Conecte primeiro a sua carteira de hardware.</translation>
</message>
<message>
<source>Set external signer script path in Options -&gt; Wallet</source>
@@ -3049,15 +3119,15 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Cr&amp;eate Unsigned</source>
- <translation type="unfinished">Criar não assinado</translation>
+ <translation type="unfinished">Criar &amp;não assinado</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">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>
+ <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>%1 to '%2'</source>
- <translation type="unfinished">%1 a '%2'</translation>
+ <translation type="unfinished">%1 para '%2'</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -3065,7 +3135,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>To review recipient list click "Show Details…"</source>
- <translation type="unfinished">Para rever a lista de destinatários clique "Mostrar detalhes..."</translation>
+ <translation type="unfinished">Para rever a lista de destinatários clique em "Mostrar detalhes…"</translation>
</message>
<message>
<source>Sign failed</source>
@@ -3074,30 +3144,30 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<message>
<source>External signer not found</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Signatário externo não encontrado</translation>
+ <translation type="unfinished">Assinante externo não encontrado</translation>
</message>
<message>
<source>External signer failure</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Falha do signatário externo</translation>
+ <translation type="unfinished">Falha do assinante externo</translation>
</message>
<message>
<source>Save Transaction Data</source>
- <translation type="unfinished">Salvar informação de transação</translation>
+ <translation type="unfinished">Guardar informação da transação</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">Transação parcialmente assinada (Binário)</translation>
+ <translation type="unfinished">Transação parcialmente assinada (binário)</translation>
</message>
<message>
<source>PSBT saved</source>
<extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">PSBT salva</translation>
+ <translation type="unfinished">PSBT guardada</translation>
</message>
<message>
<source>External balance:</source>
- <translation type="unfinished">Balanço externo:</translation>
+ <translation type="unfinished">Saldo externo:</translation>
</message>
<message>
<source>or</source>
@@ -3105,16 +3175,16 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">Pode aumentar a taxa depois (sinaliza substituir-por-taxa, BIP-125).</translation>
+ <translation type="unfinished">Pode aumentar a taxa depois (sinaliza "substituir por taxa", 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, 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>
+ <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 pode guardar ou copiar e então assinar com por exemplo uma carteira %1 offine 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>
+ <translation type="unfinished">%1 da carteira "%2"</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
@@ -3124,7 +3194,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<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, revise sua transação. Você pode assinar e enviar a transação ou criar 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 PSBT.</translation>
+ <translation type="unfinished">Por favor, reveja a sua transação. Pode criar e enviar esta transação ou criar uma transação Bitcoin parcialmente assinada (PSBT), que pode guardar ou copiar e depois assinar com, por exemplo, uma carteira %1 offline, ou uma carteira de hardware compatível com PSBT.</translation>
</message>
<message>
<source>Please, review your transaction.</source>
@@ -3137,25 +3207,25 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">Não sinalizar substituir-por-taxa, BIP-125.</translation>
+ <translation type="unfinished">Não indica "substituir por taxa", BIP-125.</translation>
</message>
<message>
<source>Total Amount</source>
- <translation type="unfinished">Valor Total</translation>
+ <translation type="unfinished">Quantia total</translation>
</message>
<message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">Transação Não Assinada</translation>
+ <translation type="unfinished">Transação não assinada</translation>
</message>
<message>
<source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">O PSBT foi salvo na área de transferência. Você pode também salva-lo.</translation>
+ <translation type="unfinished">O PSBT foi copiado para a área de transferência. Também o pode guardar.</translation>
</message>
<message>
<source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT salvo no disco.</translation>
+ <translation type="unfinished">PSBT guardada no disco</translation>
</message>
<message>
<source>Confirm send coins</source>
@@ -3163,19 +3233,19 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Watch-only balance:</source>
- <translation type="unfinished">Saldo apenas para visualização:</translation>
+ <translation type="unfinished">Saldo de observação:</translation>
</message>
<message>
<source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">O endereço do destinatário é inválido. Por favor, reverifique.</translation>
+ <translation type="unfinished">O endereço do destinatário não é válido. Por favor, verifique novamente.</translation>
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">O valor a pagar dever maior que 0.</translation>
+ <translation type="unfinished">A quantia a pagar dever maior que 0.</translation>
</message>
<message>
<source>The amount exceeds your balance.</source>
- <translation type="unfinished">O valor excede o seu saldo.</translation>
+ <translation type="unfinished">A quantia excede o seu saldo.</translation>
</message>
<message>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
@@ -3191,13 +3261,13 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">Uma taxa superior a %1 é considerada uma taxa altamente absurda.</translation>
+ <translation type="unfinished">Uma taxa superior a %1 é considerada uma taxa absurdamente elevada.</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Confirmação estimada para iniciar em %n bloco.</numerusform>
- <numerusform>Confirmação estimada para iniciar em %n blocos.</numerusform>
+ <numerusform>Estima-se que a confirmação comece dentro de %n bloco.</numerusform>
+ <numerusform>Estima-se que a confirmação comece dentro de %n blocos.</numerusform>
</translation>
</message>
<message>
@@ -3214,7 +3284,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</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">O endereço que selecionou para alterar não faz parte desta carteira. Qualquer ou todos os fundos na sua carteira podem ser enviados para este endereço. Tem certeza?</translation>
+ <translation type="unfinished">O endereço que selecionou para o troco não faz parte desta carteira. Todos ou quaisquer fundos na sua carteira podem ser enviados para este endereço. Tem a certeza?</translation>
</message>
<message>
<source>(no label)</source>
@@ -3225,11 +3295,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation type="unfinished">Qu&amp;antia:</translation>
+ <translation type="unfinished">Qua&amp;ntia:</translation>
</message>
<message>
<source>Pay &amp;To:</source>
- <translation type="unfinished">&amp;Pagar A:</translation>
+ <translation type="unfinished">&amp;Pagar a:</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -3241,11 +3311,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">O endereço Bitcoin para enviar o pagamento</translation>
+ <translation type="unfinished">O endereço Bitcoin para onde enviar o pagamento</translation>
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">Cole endereço da área de transferência</translation>
+ <translation type="unfinished">Colar endereço da área de transferência</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3253,15 +3323,15 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>The amount to send in the selected unit</source>
- <translation type="unfinished">A quantidade para enviar na unidade selecionada</translation>
+ <translation type="unfinished">A quantia a enviar na unidade selecionada</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">A taxa será deduzida ao valor que está a ser enviado. O destinatário irá receber menos bitcoins do que as que inseridas no campo do valor. Se estiverem selecionados múltiplos destinatários, a taxa será repartida equitativamente.</translation>
+ <translation type="unfinished">A taxa será deduzida à quantia que está a ser enviada. O destinatário irá receber menos bitcoins do que as que inseridas no campo da quantia. Se estiverem selecionados múltiplos destinatários, a taxa será repartida equitativamente.</translation>
</message>
<message>
<source>S&amp;ubtract fee from amount</source>
- <translation type="unfinished">S&amp;ubtrair a taxa ao montante</translation>
+ <translation type="unfinished">S&amp;ubtrair a taxa à quantia</translation>
</message>
<message>
<source>Use available balance</source>
@@ -3277,7 +3347,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</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">Uma mensagem que estava anexada ao URI bitcoin: que será armazenada com a transação para sua referência. Nota: Esta mensagem não será enviada através da rede Bitcoin.</translation>
+ <translation type="unfinished">Uma mensagem que foi anexada ao bitcoin: URI que será armazenada com a transação para sua referência. Nota: esta mensagem não será enviada através da rede Bitcoin.</translation>
</message>
</context>
<context>
@@ -3295,19 +3365,19 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<name>SignVerifyMessageDialog</name>
<message>
<source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Assinaturas - Assinar / Verificar uma Mensagem</translation>
+ <translation type="unfinished">Assinaturas - assinar / verificar uma mensagem</translation>
</message>
<message>
<source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;Assinar Mensagem</translation>
+ <translation type="unfinished">&amp;Assinar mensagem</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">Pode assinar mensagens com os seus endereços para provar que são seus. Tenha atenção ao assinar mensagens ambíguas, pois ataques de phishing podem tentar enganá-lo de modo a assinar a sua identidade para os atacantes. Apenas assine declarações detalhadas com as quais concorde.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Você pode assinar mensagens com seus endereços legados (P2PKH) para provar que pode receber bitcoins enviados a eles. Tenha cuidado para não assinar nada vago ou aleatório, pois ataques de phishing podem tentar enganá-lo para assinar sua identidade para eles. Assine apenas declarações totalmente detalhadas com as quais você concorda.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
- <translation type="unfinished">O endereço Bitcoin para designar a mensagem</translation>
+ <translation type="unfinished">O endereço Bitcoin com o qual assinar a mensagem</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -3315,7 +3385,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">Cole endereço da área de transferência</translation>
+ <translation type="unfinished">Colar endereço da área de transferência</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3331,11 +3401,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Assine uma mensagem para provar que é dono deste endereço Bitcoin</translation>
+ <translation type="unfinished">Assine a mensagem para provar que é o proprietário deste endereço Bitcoin</translation>
</message>
<message>
<source>Sign &amp;Message</source>
- <translation type="unfinished">Assinar &amp;Mensagem</translation>
+ <translation type="unfinished">Assinar &amp;mensagem</translation>
</message>
<message>
<source>Reset all sign message fields</source>
@@ -3343,19 +3413,19 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Clear &amp;All</source>
- <translation type="unfinished">Limpar &amp;Tudo</translation>
+ <translation type="unfinished">Limpar &amp;tudo</translation>
</message>
<message>
<source>&amp;Verify Message</source>
- <translation type="unfinished">&amp;Verificar Mensagem</translation>
+ <translation type="unfinished">&amp;Verificar mensagem</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">Introduza o endereço de assinatura, mensagem (assegure-se que copia quebras de linha, espaços, tabulações, etc. exatamente) e assinatura abaixo para verificar a mensagem. Tenha atenção para não ler mais na assinatura do que o que estiver na mensagem assinada, para evitar ser enganado por um atacante que se encontre entre si e quem assinou a mensagem.</translation>
+ <translation type="unfinished">Introduza o endereço do destinatário, a mensagem (certifique-se que copia com exatidão as quebras de linha, os espaços, tabulações, etc.) e a assinatura abaixo para verificar a mensagem. Tenha cuidado para não ler mais na assinatura do que o que está na própria mensagem assinada, para evitar ser enganado por um ataque de intermediário (man-in-the-middle). Note que isto apenas prova que a parte que assina recebe com este endereço, não podendo provar o remetente de nenhuma transação!</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
- <translation type="unfinished">O endereço Bitcoin com que a mensagem foi designada</translation>
+ <translation type="unfinished">O endereço Bitcoin com o qual a mensagem foi assinada</translation>
</message>
<message>
<source>The signed message to verify</source>
@@ -3371,7 +3441,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Verify &amp;Message</source>
- <translation type="unfinished">Verificar &amp;Mensagem</translation>
+ <translation type="unfinished">Verificar &amp;mensagem</translation>
</message>
<message>
<source>Reset all verify message fields</source>
@@ -3379,7 +3449,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Clique "Assinar Mensagem" para gerar a assinatura</translation>
+ <translation type="unfinished">Clique "Assinar mensagem" para gerar a assinatura</translation>
</message>
<message>
<source>The entered address is invalid.</source>
@@ -3390,8 +3460,8 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Por favor, verifique o endereço e tente novamente.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">O endereço introduzido não refere-se a nenhuma chave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">O endereço inserido não se refere a uma chave legada (P2PKH). A assinatura de mensagens para SegWit e outros tipos de endereço não P2PKH não são suportadas nesta versão do %1. Por favor, verifique o endereço e tente novamente.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3399,7 +3469,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>No error</source>
- <translation type="unfinished">Sem erro</translation>
+ <translation type="unfinished">Nenhum erro</translation>
</message>
<message>
<source>Private key for the entered address is not available.</source>
@@ -3407,7 +3477,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Message signing failed.</source>
- <translation type="unfinished">Assinatura da mensagem falhou.</translation>
+ <translation type="unfinished">A assinatura da mensagem falhou.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -3423,11 +3493,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>The signature did not match the message digest.</source>
- <translation type="unfinished">A assinatura não corresponde com o conteúdo da mensagem.</translation>
+ <translation type="unfinished">A assinatura não corresponde ao resumo da mensagem.</translation>
</message>
<message>
<source>Message verification failed.</source>
- <translation type="unfinished">Verificação da mensagem falhou.</translation>
+ <translation type="unfinished">A verificação da mensagem falhou.</translation>
</message>
<message>
<source>Message verified.</source>
@@ -3438,11 +3508,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<name>SplashScreen</name>
<message>
<source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(tecle q para desligar e continuar mais tarde)</translation>
+ <translation type="unfinished">(pressione Q para desligar e continuar mais tarde)</translation>
</message>
<message>
<source>press q to shutdown</source>
- <translation type="unfinished">Carregue q para desligar</translation>
+ <translation type="unfinished">pressione Q para desligar</translation>
</message>
</context>
<context>
@@ -3450,17 +3520,17 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<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">incompatível com uma transação com %1 confirmações</translation>
+ <translation type="unfinished">em conflito com uma transação com %1 confirmações</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/não confirmada, no memory pool</translation>
+ <translation type="unfinished">0/não confirmado, na pool de memória</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/não confirmada, ausente no memory pool</translation>
+ <translation type="unfinished">0/não confirmado, não está na pool de memória</translation>
</message>
<message>
<source>abandoned</source>
@@ -3470,7 +3540,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<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/não confirmada</translation>
+ <translation type="unfinished">%1/não confirmado</translation>
</message>
<message>
<source>%1 confirmations</source>
@@ -3491,7 +3561,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Generated</source>
- <translation type="unfinished">Gerado</translation>
+ <translation type="unfinished">Gerada</translation>
</message>
<message>
<source>From</source>
@@ -3507,11 +3577,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>own address</source>
- <translation type="unfinished">endereço próprio</translation>
+ <translation type="unfinished">próprio endereço</translation>
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">apenas vigiar</translation>
+ <translation type="unfinished">apenas observação</translation>
</message>
<message>
<source>label</source>
@@ -3524,8 +3594,8 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>pronta em mais %n bloco</numerusform>
- <numerusform>prontas em mais %n blocos</numerusform>
+ <numerusform>maturo em mais %n bloco</numerusform>
+ <numerusform>maturo em mais %n blocos</numerusform>
</translation>
</message>
<message>
@@ -3550,7 +3620,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Net amount</source>
- <translation type="unfinished">Valor líquido</translation>
+ <translation type="unfinished">Quantia líquida</translation>
</message>
<message>
<source>Message</source>
@@ -3562,11 +3632,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Transaction ID</source>
- <translation type="unfinished">Id. da Transação</translation>
+ <translation type="unfinished">ID da transação</translation>
</message>
<message>
<source>Transaction total size</source>
- <translation type="unfinished">Tamanho total da transição</translation>
+ <translation type="unfinished">Tamanho total da transação</translation>
</message>
<message>
<source>Transaction virtual size</source>
@@ -3574,12 +3644,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Output index</source>
- <translation type="unfinished">Ãndex de saída</translation>
+ <translation type="unfinished">Ãndice de saída</translation>
</message>
<message>
<source>%1 (Certificate was not verified)</source>
- <translation type="unfinished">
-%1 (O certificado não foi verificado)</translation>
+ <translation type="unfinished">%1 (O certificado não foi verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3587,7 +3656,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</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">As moedas geradas precisam amadurecer %1 blocos antes que possam ser gastas. Quando gerou este bloco, ele foi transmitido para a rede para ser adicionado à cadeia de blocos. Se este não conseguir entrar na cadeia, seu estado mudará para "não aceite" e não poderá ser gasto. Isto pode acontecer ocasionalmente se outro nó gerar um bloco dentro de alguns segundos do seu.</translation>
+ <translation type="unfinished">As moedas geradas têm de amadurecer %1 blocos antes que possam ser gastas. Quando gerou este bloco, ele foi transmitido para a rede para ser adicionado à cadeia de blocos. Se este não conseguir entrar na cadeia, o seu estado mudará para "não aceite" e não poderá ser gasto. Isto pode acontecer ocasionalmente se outro nó gerar um bloco dentro de alguns segundos do seu.</translation>
</message>
<message>
<source>Debug information</source>
@@ -3653,11 +3722,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">Confirmada (%1 confirmações)</translation>
+ <translation type="unfinished">Confirmado (%1 confirmações)</translation>
</message>
<message>
<source>Conflicted</source>
- <translation type="unfinished">Incompatível</translation>
+ <translation type="unfinished">Em conflito</translation>
</message>
<message>
<source>Immature (%1 confirmations, will be available after %2)</source>
@@ -3685,7 +3754,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">apenas vigiar</translation>
+ <translation type="unfinished">apenas observação</translation>
</message>
<message>
<source>(n/a)</source>
@@ -3709,15 +3778,15 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">Se um endereço de apenas vigiar está ou não envolvido nesta transação.</translation>
+ <translation type="unfinished">Se um endereço de observação está ou não envolvido nesta transação.</translation>
</message>
<message>
<source>User-defined intent/purpose of the transaction.</source>
- <translation type="unfinished">Intenção do utilizador/motivo da transação</translation>
+ <translation type="unfinished">Intenção do utilizador / motivo da transação.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Montante retirado ou adicionado ao saldo</translation>
+ <translation type="unfinished">Quantia retirada ou adicionada ao saldo.</translation>
</message>
</context>
<context>
@@ -3764,11 +3833,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">Escreva endereço, identificação de transação ou etiqueta para procurar</translation>
+ <translation type="unfinished">Introduzir endereço, identificador da transação ou etiqueta para procurar</translation>
</message>
<message>
<source>Min amount</source>
- <translation type="unfinished">Valor mín.</translation>
+ <translation type="unfinished">Quantia mínima</translation>
</message>
<message>
<source>Range…</source>
@@ -3788,15 +3857,15 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Copiar Id. da transação</translation>
+ <translation type="unfinished">Copiar ID da transação</translation>
</message>
<message>
<source>Copy &amp;raw transaction</source>
- <translation type="unfinished">Copiar &amp;transação bruta</translation>
+ <translation type="unfinished">Copiar transação em b&amp;ruto</translation>
</message>
<message>
<source>Copy full transaction &amp;details</source>
- <translation type="unfinished">Copie toda a transação &amp;details</translation>
+ <translation type="unfinished">Copiar a transação completa e os &amp;detalhes</translation>
</message>
<message>
<source>&amp;Show transaction details</source>
@@ -3821,7 +3890,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Export Transaction History</source>
- <translation type="unfinished">Exportar Histórico de Transações</translation>
+ <translation type="unfinished">Exportar histórico de transações</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -3830,11 +3899,11 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Confirmada</translation>
+ <translation type="unfinished">Confirmado</translation>
</message>
<message>
<source>Watch-only</source>
- <translation type="unfinished">Apenas vigiar</translation>
+ <translation type="unfinished">Apenas observação</translation>
</message>
<message>
<source>Date</source>
@@ -3853,12 +3922,8 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Endereço</translation>
</message>
<message>
- <source>ID</source>
- <translation type="unfinished">Id.</translation>
- </message>
- <message>
<source>Exporting Failed</source>
- <translation type="unfinished">Exportação Falhou</translation>
+ <translation type="unfinished">Falha na exportação</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
@@ -3866,7 +3931,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Exporting Successful</source>
- <translation type="unfinished">Exportação Bem Sucedida</translation>
+ <translation type="unfinished">Exportação bem sucedida</translation>
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
@@ -3874,7 +3939,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Range:</source>
- <translation type="unfinished">Período:</translation>
+ <translation type="unfinished">Intervalo:</translation>
</message>
<message>
<source>to</source>
@@ -3887,13 +3952,13 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<source>No wallet has been loaded.
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
- <translation type="unfinished">Nenhuma carteira foi carregada
-Ir para o arquivo &gt; Abrir carteira para carregar a carteira
+ <translation type="unfinished">Nenhuma carteira foi carregada.
+Vá ao menu Ficheiro &gt; Abrir carteira para carregar uma carteira
- OU -</translation>
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Criar novo carteira</translation>
+ <translation type="unfinished">Criar nova carteira</translation>
</message>
<message>
<source>Error</source>
@@ -3901,7 +3966,7 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
</message>
<message>
<source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">Incapaz de decifrar a PSBT da área de transferência (base64 inválida)</translation>
+ <translation type="unfinished">Não foi possível descodificar a transação de Bitcoin parcialmente assinada (PSTB) da área de transferência (base64 inválida)</translation>
</message>
<message>
<source>Load Transaction Data</source>
@@ -3913,18 +3978,18 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">Arquivo PSBT deve ser menor que 100 MiB</translation>
+ <translation type="unfinished">O ficheiro PSBT deve ser inferior a 100 MiB</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
- <translation type="unfinished">Incapaz de decifrar a PSBT</translation>
+ <translation type="unfinished">Não foi possível descodificar a transação de Bitcoin parcialmente assinada (PSTB)</translation>
</message>
</context>
<context>
<name>WalletModel</name>
<message>
<source>Send Coins</source>
- <translation type="unfinished">Enviar Moedas</translation>
+ <translation type="unfinished">Enviar moedas</translation>
</message>
<message>
<source>Fee bump error</source>
@@ -3932,7 +3997,7 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
</message>
<message>
<source>Increasing transaction fee failed</source>
- <translation type="unfinished">Aumento da taxa de transação falhou</translation>
+ <translation type="unfinished">O aumento da taxa de transação falhou</translation>
</message>
<message>
<source>Do you want to increase the fee?</source>
@@ -3952,8 +4017,12 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
<translation type="unfinished">Nova taxa:</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">Aviso: pode pagar a taxa adicional reduzindo as saídas ou aumentando as entradas, quando necessário. Poderá ser acrescentada uma nova moeda, caso ainda não exista nenhuma. Estas alterações podem potencialmente causar fugas de privacidade.</translation>
+ </message>
+ <message>
<source>Confirm fee bump</source>
- <translation type="unfinished">Confirme aumento de taxa</translation>
+ <translation type="unfinished">Confirmar aumento da taxa</translation>
</message>
<message>
<source>Can't draft transaction.</source>
@@ -3964,9 +4033,8 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
<translation type="unfinished">PSBT copiado</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiado para a área de transferência</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Fee-bump PSBT copiado para a área de transferência</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3974,30 +4042,30 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
</message>
<message>
<source>Could not commit transaction</source>
- <translation type="unfinished">Não foi possível cometer a transação</translation>
+ <translation type="unfinished">Não foi possível confirmar a transação</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Não é possível exibir o endereço</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erro do signatário</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">carteira predefinida</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Não é possível visualizar o endereço</translation>
</message>
</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">e exportar</translation>
+ <translation type="unfinished">&amp;Exportar</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exportar os dados no separador atual para um ficheiro</translation>
+ <translation type="unfinished">Exportar os dados na aba atual para um ficheiro</translation>
</message>
<message>
<source>Backup Wallet</source>
- <translation type="unfinished">Cópia de Segurança da Carteira</translation>
+ <translation type="unfinished">Cópia de segurança da carteira</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -4006,7 +4074,7 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
</message>
<message>
<source>Backup Failed</source>
- <translation type="unfinished">Cópia de Segurança Falhou</translation>
+ <translation type="unfinished">Falha na cópia de segurança</translation>
</message>
<message>
<source>There was an error trying to save the wallet data to %1.</source>
@@ -4014,7 +4082,7 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
</message>
<message>
<source>Backup Successful</source>
- <translation type="unfinished">Cópia de Segurança Bem Sucedida</translation>
+ <translation type="unfinished">Cópia de segurança efetuada com êxito</translation>
</message>
<message>
<source>The wallet data was successfully saved to %1.</source>
@@ -4033,64 +4101,87 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
</message>
<message>
<source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s corrompido. Tente usar a ferramenta de carteira bitcoin-wallet para salvar ou restaurar um backup.</translation>
+ <translation type="unfinished">%s corrompido. Tente utilizar a ferramenta de carteira bitcoin-wallet para recuperar ou restaurar uma cópia de segurança.</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>
+ <translation type="unfinished">%s falhou ao validar o estado do instantâneo -assumeutxo. Isso indica um problema de hardware ou um erro no software ou uma modificação de software incorreta que permitiu que um instantâneo inválido fosse carregado. Como resultado disso, o nó será desligado e deixará de usar qualquer estado que tenha sido construído no instantâneo, redefinindo a altura da cadeia de %d para %d. Na próxima reinicialização, o nó retomará a sincronização a partir de %d sem utilizar quaisquer dados de instantâneos. Por favor, comunique este incidente a %s, incluindo a forma como obteve o instantâneo. O estado em cadeia do instantâneo inválido será deixado no disco, caso seja útil para diagnosticar o problema que causou este 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>
+ <translation type="unfinished">%s solicita a escuta na porta %u. Esta porta é considerada "má" e, por isso, é improvável que qualquer par se conecte a ela. Veja doc/p2p-bad-ports.md para detalhes e uma lista completa.</translation>
</message>
<message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">Não é possível fazer o downgrade da carteira da versão %i para %i. Versão da carteira inalterada.</translation>
+ <translation type="unfinished">Não é possível fazer o downgrade da carteira da versão %i para %i. A versão da carteira não foi alterada.</translation>
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">Não foi possível obter o bloqueio de escrita no da pasta de dados %s. %s provavelmente já está a ser executado.</translation>
+ <translation type="unfinished">Não foi possível obter o bloqueio de escrita da pasta de dados %s. %s provavelmente já está em execução.</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">Não é possível atualizar uma carteira não dividida em HD da versão %i para a versão %i sem atualizar para suportar o conjunto de chaves pré-dividido. Por favor, use a versão %i ou nenhuma versão especificada.</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">O espaço em disco para 1%s pode não acomodar os arquivos de bloco. Aproximadamente 2%u GB de dados serão armazenados neste diretório.</translation>
+ <translation type="unfinished">O espaço em disco para %s pode não acomodar os ficheiros de bloco. Serão armazenados neste diretório aproximadamente %u GB de dados.</translation>
</message>
<message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
- <translation type="unfinished">Distribuído sob licença de software MIT, veja o ficheiro %s ou %s</translation>
+ <translation type="unfinished">Distribuído sob a licença de software MIT, ver o ficheiro que o acompanha %s ou %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">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>
+ <translation type="unfinished">Erro ao carregar a carteira. A carteira requer que os blocos sejam descarregados, e o software não suporta atualmente o carregamento de carteiras enquanto os blocos estão a ser descarregados fora de ordem quando se utilizam instantâneos "assumeutxo". A carteira deve poder ser carregada com sucesso depois que a sincronização do nó atingir a altura %s</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>
+ <translation type="unfinished">Erro ao ler %s! Os dados da transação podem estar em falta ou incorretos. A verificar novamente a carteira.</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
+ <translation type="unfinished">Erro: o registo do formato do ficheiro de dump está incorreto. Obteve-se "%s", mas era esperado "format".</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">Erro: o registo do identificador do ficheiro de dump está incorreto. Obteve-se "%s", mas era esperado "%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">Erro: Esta versão do bitcoin-wallet apenas suporta arquivos de despejo na versão 1. (Versão atual: %s)</translation>
+ <translation type="unfinished">Erro: esta versão do bitcoin-wallet apenas suporta ficheiros dump na versão 1. (Versão atual: %s)</translation>
+ </message>
+ <message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">Erro: as carteiras legadas apenas suportam os tipos de endereço "legado", "p2sh-segwit" e "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">Erro: não é possível produzir descritores para esta carteira antiga. Certifique-se de que fornece a frase de segurança da carteira se esta estiver 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">Arquivo%sjá existe. Se você tem certeza de que é isso que quer, tire-o do caminho primeiro.</translation>
+ <translation type="unfinished">O ficheiro%s já existe. Se tem a certeza que é isso que quer, mova-o primeiro para fora do caminho.</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">O arquivo peers.dat (%s) está corrompido ou inválido. Se você acredita se tratar de um bug, por favor reporte para %s. Como solução, você pode mover, renomear ou deletar (%s) para um novo ser criado na próxima inicialização</translation>
+ <translation type="unfinished">O ficheiro peers.dat (%s) está corrompido ou é inválido. Se acredita qua se trata de um "bug", por favor reporte para %s. Como solução, pode mover, alterar o nome ou eliminar (%s) para ser criado um novo na próxima inicialização</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">Mais de um endereço de ligação onion é fornecido. Usando %s para o serviço Tor onion criado automaticamente.</translation>
+ <translation type="unfinished">É fornecido mais do que um endereço onion bind. A utilizar %s para o serviço Tor onion criado automaticamente.</translation>
</message>
<message>
- <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">Nenhum formato de arquivo de carteira fornecido. Para usar createfromdump, -format = &lt;format&gt;
-deve ser fornecido.</translation>
+ <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">Não foi fornecido nenhum ficheiro de dump. Para utilizar createfromdump tem de ser fornecido -dumpfile=&lt;filename&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 verifique que a data e hora do seu computador estão certos! Se o relógio não estiver certo, o %s não funcionará corretamente.</translation>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">Não foi fornecido nenhum ficheiro de dump. Para utilizar o dump, tem de ser fornecido -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">Não foi fornecido nenhum formato de ficheiro de carteira. Para usar createfromdump, é necessário fornecer -format=&lt;format&gt;.</translation>
</message>
<message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
@@ -4098,47 +4189,47 @@ deve ser fornecido.</translation>
</message>
<message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
- <translation type="unfinished">Poda configurada abaixo do mínimo de %d MiB. Por favor, utilize um valor mais elevado.</translation>
+ <translation type="unfinished">O modo de redução (prune) está configurado abaixo do mínimo de %d MiB. Utilize um valor mais elevado.</translation>
</message>
<message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">O modo Prune é incompatível com a opção "-reindex-chainstate". Ao invés disso utilize "-reindex".</translation>
+ <translation type="unfinished">O modo de redução (prune) é incompatível com a opção "-reindex-chainstate". Ao invés disso utilize "-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">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>
+ <translation type="unfinished">Redução (prune): a última sincronização da carteira vai além dos dados reduzidos. Precisa de -reindex (descarregar novamente a cadeia de blocos completa no caso de nó com redução)</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>
+ <translation type="unfinished">Falha ao renomear '%s' -&gt; '%s'. Deve resolver este problema manualmente movendo ou removendo o diretório de cópia inválido %s, caso contrário ocorrerá novamente o mesmo erro 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>
+ <translation type="unfinished">SQLiteDatabase: versão %d do esquema de carteira sqlite desconhecido. Apenas é suportada a versão %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">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>
+ <translation type="unfinished">A base de dados de blocos contém um bloco que parece ser do futuro. Isto pode dever-se ao facto de a data e a hora do computador não estarem corretas. Só reconstrua a base de dados de blocos se tiver a certeza de que a data e a hora do seu computador estão corretas</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>
+ <translation type="unfinished">A quantia da transação é demasiado baixa para enviar após a dedução da taxa</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 erro pode ocorrer se a carteira não foi desligada corretamente e foi carregada da ultima vez usando uma compilação com uma versão mais recente da Berkeley DB. Se sim, por favor use o programa que carregou esta carteira da ultima vez.</translation>
+ <translation type="unfinished">Este erro pode ocorrer se a carteira não foi desligada corretamente e foi carregada da última vez usando uma compilação com uma versão mais recente da Berkeley DB. Se sim, por favor use o programa que carregou esta carteira da última vez.</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">Isto é uma compilação de teste de pré-lançamento - use por sua conta e risco - não use para mineração ou comércio</translation>
+ <translation type="unfinished">Esta é uma versão de teste de pré-lançamento - use por sua conta e risco - não use para mineração ou aplicações comerciais</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">Este é a taxa de transação máxima que você paga (em adição à taxa normal) para priorizar evitar gastos parciais sobre seleção de moeda normal.</translation>
+ <translation type="unfinished">Esta é a taxa de transação máxima que paga (para além da taxa normal) para dar prioridade à prevenção de gastos parciais em detrimento da seleção regular de moedas.</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 é a taxa de transação que poderá descartar, se o troco for menor que o pó a este nível</translation>
+ <translation type="unfinished">Esta é a taxa de transação que poderá descartar, se o troco for menor que o remanescente a este nível</translation>
</message>
<message>
<source>This is the transaction fee you may pay when fee estimates are not available.</source>
@@ -4146,31 +4237,39 @@ deve ser fornecido.</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">Comprimento total da entrada da versão de rede (%i) excede o comprimento máximo (%i). Reduzir o número ou o tamanho de uacomments.</translation>
+ <translation type="unfinished">O comprimento total da entrada da versão de rede (%i) excede o comprimento máximo (%i). Reduza o número ou o tamanho de uacomments.</translation>
</message>
<message>
<source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
<translation type="unfinished">Não é possível reproduzir os blocos. Terá de reconstruir a base de dados utilizando -reindex-chainstate.</translation>
</message>
<message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">Formato "%s" de ficheiro de carteira desconhecido. Por favor, forneça um dos formatos "bdb" ou "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">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>
+ <translation type="unfinished">Nível de registo específico da categoria não suportado %1$s=%2$s. Esperado %1$s=&lt;categoria&gt;:&lt;nívelderegisto&gt;. Categorias válidas: %3$s. Níveis de registo 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>
+ <translation type="unfinished">Foi encontrado um formato de base de dados chainstate não suportado. Por favor reinicie com -reindex-chainstate. Isto irá reconstruir a base de dados do estado da cadeia.</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">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>
+ <translation type="unfinished">Carteira criada com sucesso. O tipo de carteira antiga está a ser descontinuado e o suporte para a criação e 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>
+ <translation type="unfinished">Carteira carregada com sucesso. O tipo de carteira antiga legada está a ser descontinuado e o suporte para criar e abrir carteiras antigas será removido no futuro. As carteiras antigas podem ser migradas para uma carteira descritora com migratewallet.</translation>
+ </message>
+ <message>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">Aviso: o formato da carteira do ficheiro de dump "%s" não corresponde ao formato especificado na linha de comando "%s".</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>
+ <translation type="unfinished">Aviso: foram detetadas chaves privadas na carteira {%s} com chaves privadas desativadas</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>
@@ -4178,11 +4277,11 @@ deve ser fornecido.</translation>
</message>
<message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">Testemunhar dados de blocos após 1%d requer validação. Por favor reinicie com -reindex.</translation>
+ <translation type="unfinished">Os dados da testemunha para blocos após a altura %d requerem validação. Reinicie com -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">Necessita reconstruir a base de dados, utilizando -reindex para voltar ao modo sem poda. Isto irá descarregar novamente a cadeia de blocos completa</translation>
+ <translation type="unfinished">Tem de reconstruir a base de dados, utilizando -reindex para voltar ao modo sem redução (prune). Isto irá descarregar novamente a cadeia de blocos completa</translation>
</message>
<message>
<source>%s is set very high!</source>
@@ -4190,71 +4289,147 @@ deve ser fornecido.</translation>
</message>
<message>
<source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">- máximo do banco de memória deverá ser pelo menos %d MB</translation>
- </message>
- <message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Um erro fatal interno occoreu, veja o debug.log para detalhes</translation>
+ <translation type="unfinished">-maxmempool tem de ser pelo menos %d MB</translation>
</message>
<message>
<source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">Não é possível resolver -%s endereço '%s'</translation>
+ <translation type="unfinished">Não é possível resolver o endereço de -%s: "%s"</translation>
</message>
<message>
<source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">Não é possível definir -forcednsseed para true quando -dnsseed for false.</translation>
+ <translation type="unfinished">Não é possível definir -forcednsseed como true ao definir -dnsseed como false.</translation>
</message>
<message>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
- <translation type="unfinished">Não é possível ajustar -peerblockfilters sem -blockfilterindex.</translation>
+ <translation type="unfinished">Não é possível definir -peerblockfilters sem -blockfilterindex.</translation>
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
<translation type="unfinished">Não foi possível escrever na pasta de dados '%s': verifique as permissões.</translation>
</message>
<message>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s é muito elevado! As taxas tão elevadas como esta poderiam ser pagas numa única transação.</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>
+ <translation type="unfinished">Não é possível fornecer conexões específicas e fazer com que o addrman encontre conexões de saída ao mesmo tempo.</translation>
</message>
<message>
<source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
- <translation type="unfinished">Erro ao abrir %s: Carteira com assinador externo. Não foi compilado suporte para assinadores externos</translation>
+ <translation type="unfinished">Erro ao abrir %s: carteira com assinante externo. Não foi compilado suporte para assinantes 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>
+ <translation type="unfinished">Erro ao ler %s! Todas as chaves são lidas corretamente, mas os dados de transação ou os metadados de endereço podem estar em falta ou incorretos.</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>
+ <translation type="unfinished">Erro: os dados do livro de endereços na carteira não podem ser identificados como pertencentes a carteiras migradas</translation>
</message>
<message>
<source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">Erro: Descritores duplicados criados durante a migração. Sua carteira pode estar corrompida.</translation>
+ <translation type="unfinished">Erro: foram criados descritores duplicados durante a migração. A sua carteira pode estar corrompida.</translation>
</message>
<message>
<source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Erro: A transação %s na carteira não pôde ser identificada por pertencer a carteiras migradas</translation>
+ <translation type="unfinished">Erro: a transação %s na carteira não pode ser identificada como pertencente 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>
+ <translation type="unfinished">Não foi possível calcular as taxas de compensação, porque os UTXOs não confirmados dependem de um enorme conjunto de transações não confirmadas..</translation>
+ </message>
+ <message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Falha ao remover o diretório do snapshot chainstate (%s). Remova-o manualmente antes de reiniciar.
+</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>
+ <translation type="unfinished">Falha ao alterar o nome do ficheiro peers.dat inválido. Mova-o ou elimine-o e tente novamente.</translation>
+ </message>
+ <message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">A estimativa da taxa falhou. A taxa de retrocesso está desativada. Aguardar alguns blocos ou ativar %s.</translation>
+ </message>
+ <message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falha ao transferir o ficheiro de bloco para o disco. Isto é provavelmente o resultado de um erro de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falha ao transferir o ficheiro undo para o disco. Isto é provavelmente o resultado de um erro de E/S.</translation>
</message>
<message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">Opções incompatíveis: "-dnsseed=1" foi explicitamente específicada, mas "-onlynet" proíbe conexões para IPv4/IPv6</translation>
+ <translation type="unfinished">Opções incompatíveis: "-dnsseed=1" foi explicitamente especificada, mas "-onlynet" proíbe conexões para 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">Quantia inválida para %s=&lt;amount&gt;: '%s' (tem de ser, pelo menos, a taxa mínima de retransmissão de %s para evitar transações bloqueadas)</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">O peso máximo da transação é inferior ao peso da transação sem entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">O peso máximo da transação é demasiado baixo, não pode acomodar a saída de mudança</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 restritas ao CJDNS (-onlynet=cjdns) mas -cjdnsreachable não é fornecido</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">As conexões de saída foram restringidas a rede Tor (-onlynet-onion) mas o proxy para alcançar a rede Tor foi explicitamente proibido: "-onion=0"</translation>
+ <translation type="unfinished">As conexões de saída foram restringidas à rede Tor (-onlynet-onion) mas o proxy para alcançar a rede Tor foi explicitamente proibido: "-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">As conexões de saída foram restringidas a rede Tor (-onlynet=onion) mas o proxy para acessar a rede Tor não foi fornecido: nenhuma opção "-proxy", "-onion" ou "-listenonion" foi fornecida</translation>
+ <translation type="unfinished">As conexões de saída foram restringidas à rede Tor (-onlynet=onion) mas o proxy para aceder à rede Tor não foi fornecido: nenhuma opção "-proxy", "-onion" ou "-listenonion" foi fornecida</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 restringidas ao i2p (-onlynet=i2p) mas não foi fornecido -i2psam</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Renomear de '%s' -&gt; '%s'falhou. Não é possível limpar o diretório leveldb do chainstate em segundo plano.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">A combinação das entradas pré-selecionadas e a seleção automática de entradas da carteira excede o peso máximo da transação. Tente enviar uma quantia menor ou consolidar manualmente os UTXOs da sua carteira</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">A quantia total de moedas pré-selecionadas não cobre o objetivo da transação. Permita que sejam selecionadas automaticamente outras entradas 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 não-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 na validação do instantâneo UTXO. Reinicie para retomar o descarregamento normal do bloco inicial ou tente carregar um instantâneo 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">Estão disponíveis UTXOs não confirmados, mas gastá-los cria uma cadeia de transações que será rejeitada pelo 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">Encontrada uma entrada legada inesperada na carteira descritora. A carregar a carteira %s
+
+A carteira pode ter sido adulterada ou criada com intenções maliciosas.
+</translation>
</message>
<message>
<source>Unrecognized descriptor found. Loading wallet %s
@@ -4262,51 +4437,75 @@ deve ser fornecido.</translation>
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">Descriptor não reconhecido foi encontrado. Carregando carteira %s
+ <translation type="unfinished">Encontrado descritor não reconhecido. A carregar a carteira %s
-A carteira pode ter sido criada em uma versão mais nova.
+A carteira pode ter sido criada numa versão mais recente.
Por favor tente atualizar o software para a última versão.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">A data e a hora do seu computador parecem estar mais de %d minutos fora de sincronia com a rede, isso pode levar a uma falha de consenso. Depois de confirmar o relógio do seu computador, essa mensagem não deve mais aparecer quando você reiniciar seu nó. Sem uma reinicialização, ela deve parar de aparecer automaticamente depois que você se conectar a um número suficiente de novos pares de saída, o que pode levar algum tempo. Você pode inspecionar o campo `timeoffset` dos métodos RPC `getpeerinfo` e `getnetworkinfo` para obter mais informações.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
-Impossível limpar a falha de migração</translation>
+Não foi possível efetuar a limpeza da migração falhada</translation>
</message>
<message>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
-Impossível restaurar backup da carteira.</translation>
+Não foi possível restaurar a cópia de segurança da carteira.</translation>
+ </message>
+ <message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind só pode ser utilizado para conexões de entrada ("out" foi passado)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ocorreu um fatal internal error, consulte debug.log para obter detalhes:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Não foram encontrados os dados assumeutxo para o blockhash em causa '%s'.</translation>
+ </message>
+ <message>
+ <source>Block verification was interrupted</source>
+ <translation type="unfinished">A verificação do bloco foi interrompida</translation>
</message>
<message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
- <translation type="unfinished">A configuração %s apenas é aplicada na rede %s quando na secção [%s].</translation>
+ <translation type="unfinished">A configuração para %s apenas é aplicada na rede %s quando se encontra na secção [%s].</translation>
</message>
<message>
<source>Copyright (C) %i-%i</source>
- <translation type="unfinished">Direitos de Autor (C) %i-%i</translation>
+ <translation type="unfinished">Direitos de autor (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bloco corrompido encontrado indicando possível falha de hardware.</translation>
</message>
<message>
<source>Corrupted block database detected</source>
- <translation type="unfinished">Detetada cadeia de blocos corrompida</translation>
+ <translation type="unfinished">Detetada base de dados de blocos corrompida</translation>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">Não foi possível achar o arquivo asmap %s</translation>
+ <translation type="unfinished">Não foi possível encontrar o ficheiro asmap %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
- <translation type="unfinished">Não foi possível analisar o arquivo asmap %s.</translation>
+ <translation type="unfinished">Não foi possível analisar o ficheiro asmap %s.</translation>
</message>
<message>
<source>Disk space is too low!</source>
- <translation type="unfinished">Espaço de disco é muito pouco!</translation>
+ <translation type="unfinished">O espaço em disco é demasiado pequeno!</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
- <translation type="unfinished">Deseja reconstruir agora a base de dados de blocos.</translation>
+ <translation type="unfinished">Pretende reconstruir a base de dados de blocos agora?</translation>
</message>
<message>
<source>Done loading</source>
@@ -4314,19 +4513,23 @@ Impossível restaurar backup da carteira.</translation>
</message>
<message>
<source>Dump file %s does not exist.</source>
- <translation type="unfinished">Arquivo de despejo %s não existe</translation>
+ <translation type="unfinished">O ficheiro de dump %s não existe</translation>
+ </message>
+ <message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Falha na verificação de integridade da criptografia de curva elíptica. %s está sendo desligado.</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>
+ <translation type="unfinished">Erro ao confirmar a transação da base de dados para remover transações da carteira</translation>
</message>
<message>
<source>Error creating %s</source>
- <translation type="unfinished">Erro a criar %s</translation>
+ <translation type="unfinished">Erro ao criar %s</translation>
</message>
<message>
<source>Error initializing block database</source>
- <translation type="unfinished">Erro ao inicializar a cadeia de blocos</translation>
+ <translation type="unfinished">Erro ao inicializar a base de dados de blocos</translation>
</message>
<message>
<source>Error initializing wallet database environment %s!</source>
@@ -4350,15 +4553,19 @@ Impossível restaurar backup da carteira.</translation>
</message>
<message>
<source>Error loading block database</source>
- <translation type="unfinished">Erro ao carregar base de dados de blocos</translation>
+ <translation type="unfinished">Erro ao carregar a base de dados de blocos</translation>
</message>
<message>
<source>Error opening block database</source>
<translation type="unfinished">Erro ao abrir a base de dados de blocos</translation>
</message>
<message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Erro ao ler o ficheiro de configuração: %s</translation>
+ </message>
+ <message>
<source>Error reading from database, shutting down.</source>
- <translation type="unfinished">Erro ao ler da base de dados. A encerrar.</translation>
+ <translation type="unfinished">Erro ao ler a base de dados. A encerrar.</translation>
</message>
<message>
<source>Error reading next record from wallet database</source>
@@ -4366,103 +4573,143 @@ Impossível restaurar backup da carteira.</translation>
</message>
<message>
<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>
+ <translation type="unfinished">Erro ao iniciar a transação da base de dados para remoção de transações da carteira</translation>
+ </message>
+ <message>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erro: não é possível extrair o destino da scriptpubkey gerada</translation>
+ </message>
+ <message>
+ <source>Error: Couldn't create cursor into database</source>
+ <translation type="unfinished">Erro: não foi possível criar o cursor na base de dados</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
<translation type="unfinished">Erro: espaço em disco demasiado baixo para %s</translation>
</message>
<message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">Erro: a soma de controlo do ficheiro de dump não corresponde. Calculado %s, esperado %s</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Erro: Falha ao criar carteira apenas-visualização</translation>
+ <translation type="unfinished">Erro: falha ao criar uma nova carteira de observação</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">Erro: Chave obtida sem ser no formato hex: %s</translation>
+ <translation type="unfinished">Erro: obteve-se uma chave que não era hexadecimal: %s</translation>
</message>
<message>
<source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Erro: Valor obtido sem ser no formato hex: %s</translation>
+ <translation type="unfinished">Erro: obtido um valor que não era hexadecimal: %s</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
- <translation type="unfinished">A keypool esgotou-se, por favor execute primeiro keypoolrefill1</translation>
+ <translation type="unfinished">Erro: a pool de chaves esgotou-se. Invoque primeiro keypoolrefill</translation>
</message>
<message>
<source>Error: Missing checksum</source>
- <translation type="unfinished">Erro: soma de verificação ausente</translation>
+ <translation type="unfinished">Erro: falta a soma de controlo / checksum</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
- <translation type="unfinished">Erro: Não existem %s endereços disponíveis.</translation>
+ <translation type="unfinished">Erro: não existem endereços %s disponíveis.</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">Erro: Essa carteira já utiliza o SQLite</translation>
+ <translation type="unfinished">Erro: esta carteira já usa SQLite</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Erro: Esta carteira já contém um descritor</translation>
+ <translation type="unfinished">Erro: esta carteira já é uma carteira descritora</translation>
</message>
<message>
<source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">Erro: impossível ler todos os registros no banco de dados</translation>
+ <translation type="unfinished">Erro: não foi possível iniciar a leitura de todos os registos na base de dados</translation>
</message>
<message>
<source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Erro: Impossível efetuar backup da carteira</translation>
+ <translation type="unfinished">Erro: não foi possível efetuar uma cópia de segurança da sua carteira</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">Erro: Não foi possível converter versão %u como uint32_t</translation>
+ <translation type="unfinished">Erro: não foi possível analisar a versão %u como um uint32_t</translation>
</message>
<message>
<source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">Error: Não é possivel ler todos os registros no banco de dados</translation>
+ <translation type="unfinished">Erro: não foi possível ler todos os registos na base 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>
+ <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>
+ <translation type="unfinished">Erro: não foi possível remover os dados só de observação do livro de endereços</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">Erro: Não foi possível escrever registro para a nova carteira</translation>
+ <translation type="unfinished">Erro: não foi possível escrever o registo 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>
+ <translation type="unfinished">Erro: não foi possível escrever o registo do melhor localizador de blocos da carteira solvente</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>
+ <translation type="unfinished">Erro: não foi possível escrever o registo do melhor localizador de blocos da carteira só de observação</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>
+ <translation type="unfinished">Erro: falha na cópia do livro 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>
+ <translation type="unfinished">Erro: a transação da base de dados não pode ser executada para a carteira %s</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">Falha ao conectar o melhor bloco (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Falha ao desconectar o bloco.</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>
+ <translation type="unfinished">Falha ao escutar em qualquer porta. Use -listen=0 se quiser isso.</translation>
+ </message>
+ <message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Falha ao ler o bloco.</translation>
</message>
<message>
<source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">Reexaminação da carteira falhou durante a inicialização</translation>
+ <translation type="unfinished">Falha ao verificar 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>
+ <translation type="unfinished">Falha ao iniciar os índices. A encerrar…</translation>
</message>
<message>
<source>Failed to verify database</source>
- <translation type="unfinished">Falha ao verificar base de dados</translation>
+ <translation type="unfinished">Falha ao verificar a base de dados</translation>
+ </message>
+ <message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Falha ao escrever bloco.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Falha ao escrever na base de dados de índices de blocos.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Falha ao escrever na base de dados de moedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Falha ao escrever dados de anulação.</translation>
</message>
<message>
<source>Failure removing transaction: %s</source>
@@ -4470,11 +4717,11 @@ Impossível restaurar backup da carteira.</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>
+ <translation type="unfinished">A taxa de transação (%s) é inferior à taxa mínima de transação fixada (%s)</translation>
</message>
<message>
<source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">Ignorando -carteira %s duplicada.</translation>
+ <translation type="unfinished">Ignorando -wallet %s duplicada.</translation>
</message>
<message>
<source>Importing…</source>
@@ -4486,23 +4733,27 @@ Impossível restaurar backup da carteira.</translation>
</message>
<message>
<source>Initialization sanity check failed. %s is shutting down.</source>
- <translation type="unfinished">Verificação de integridade inicial falhou. O %s está a desligar-se.</translation>
+ <translation type="unfinished">A verificação da integridade inicial falhou. O %s está a encerrar.</translation>
</message>
<message>
<source>Input not found or already spent</source>
<translation type="unfinished">Entrada não encontrada ou já gasta</translation>
</message>
<message>
+ <source>Insufficient dbcache for block verification</source>
+ <translation type="unfinished">Cache da base de dados (Dbcache) insuficiente para verificação de blocos</translation>
+ </message>
+ <message>
<source>Insufficient funds</source>
<translation type="unfinished">Fundos insuficientes</translation>
</message>
<message>
<source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">Endereço ou nome de servidor -i2psam inválido: '%s'</translation>
+ <translation type="unfinished">Endereço -i2psam ou nome do servidor inválido: '%s'</translation>
</message>
<message>
<source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">Endereço -onion ou hostname inválido: '%s'</translation>
+ <translation type="unfinished">Endereço -onion ou nome do servidor inválido: '%s'</translation>
</message>
<message>
<source>Invalid -proxy address or hostname: '%s'</source>
@@ -4510,37 +4761,57 @@ Impossível restaurar backup da carteira.</translation>
</message>
<message>
<source>Invalid P2P permission: '%s'</source>
- <translation type="unfinished">Permissões P2P inválidas : '%s'</translation>
+ <translation type="unfinished">Permissões P2P inválidas: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Quantia inválida para %s=&lt;amount&gt;: '%s' (tem de ser pelo menos %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Quantia inválida para %s=&lt;amount&gt;: '%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>
+ <translation type="unfinished">Quantia inválida para -%s=&lt;amount&gt;: '%s'</translation>
</message>
<message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
<translation type="unfinished">Máscara de rede inválida especificada em -whitelist: '%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 %s inválida</translation>
+ </message>
+ <message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">A espera por conexões de entrada falharam (a espera retornou o erro %s)</translation>
+ <translation type="unfinished">A escuta de conexões de entrada falhou (a escuta devolveu o erro %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
- <translation type="unfinished">Carregando endereços P2P...</translation>
+ <translation type="unfinished">A carregar endereços P2P…</translation>
</message>
<message>
<source>Loading banlist…</source>
- <translation type="unfinished">A carregar a lista de banidos...</translation>
+ <translation type="unfinished">A carregar a lista de banidos…</translation>
</message>
<message>
<source>Loading block index…</source>
- <translation type="unfinished">Carregando índice do bloco...</translation>
+ <translation type="unfinished">A carregar o índice de blocos…</translation>
</message>
<message>
<source>Loading wallet…</source>
<translation type="unfinished">A carregar a carteira…</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">O peso máximo da transação deve estar entre %d e %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Falta a quantia</translation>
</message>
@@ -4550,7 +4821,7 @@ Impossível restaurar backup da carteira.</translation>
</message>
<message>
<source>Need to specify a port with -whitebind: '%s'</source>
- <translation type="unfinished">Necessário especificar uma porta com -whitebind: '%s'</translation>
+ <translation type="unfinished">É necessário especificar uma porta com -whitebind: '%s'</translation>
</message>
<message>
<source>No addresses available</source>
@@ -4558,55 +4829,80 @@ Impossível restaurar backup da carteira.</translation>
</message>
<message>
<source>Not enough file descriptors available.</source>
- <translation type="unfinished">Os descritores de ficheiros disponíveis são insuficientes.</translation>
+ <translation type="unfinished">Não estão disponíveis descritores de ficheiros suficientes.</translation>
+ </message>
+ <message>
+ <source>Not found pre-selected input %s</source>
+ <translation type="unfinished">Entrada pré-selecionada %s não encontrada</translation>
+ </message>
+ <message>
+ <source>Not solvable pre-selected input %s</source>
+ <translation type="unfinished">Entrada pré-selecionada %s não solucionável</translation>
+ </message>
+ <message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Apenas a direção foi definida, sem permissões: '%s'</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
- <translation type="unfinished">A redução não pode ser configurada com um valor negativo.</translation>
+ <translation type="unfinished">A redução (prune) não pode ser configurada com um valor negativo.</translation>
</message>
<message>
<source>Prune mode is incompatible with -txindex.</source>
- <translation type="unfinished">O modo de redução é incompatível com -txindex.</translation>
+ <translation type="unfinished">O modo de redução (prune) é incompatível com -txindex.</translation>
</message>
<message>
<source>Pruning blockstore…</source>
- <translation type="unfinished">Prunando os blocos existentes...</translation>
+ <translation type="unfinished">Prunando os blocos existentes…</translation>
</message>
<message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
- <translation type="unfinished">Reduzindo -maxconnections de %d para %d, devido a limitações no sistema.</translation>
+ <translation type="unfinished">A reduzir -maxconnections de %d para %d devido a limitações no sistema.</translation>
</message>
<message>
<source>Replaying blocks…</source>
- <translation type="unfinished">Repetindo blocos...</translation>
+ <translation type="unfinished">Repetindo blocos…</translation>
</message>
<message>
<source>Rescanning…</source>
- <translation type="unfinished">.Reexaminando...</translation>
+ <translation type="unfinished">A tornar a examinar…</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: Falha ao executar a instrução para verificar o banco de dados: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: falha na execução da instrução para verificar a base de dados: %s</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: Falha ao preparar a instrução para verificar o banco de dados: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: falha ao preparar a instrução para verificar a base de dados: %s</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to read database verification error: %s</source>
- <translation type="unfinished">SQLiteDatabase: Falha ao ler base de dados erro de verificação %s</translation>
+ <translation type="unfinished">SQLiteDatabase: falha na leitura do erro de verificação da base de dados: %s</translation>
</message>
<message>
<source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
- <translation type="unfinished">SQLiteDatabase: ID de aplicativo inesperado. Esperado %u, obteve %u</translation>
+ <translation type="unfinished">SQLiteDatabase: ID de aplicação inesperado. Era esperado %u, obteve-se %u</translation>
</message>
<message>
<source>Section [%s] is not recognized.</source>
<translation type="unfinished">A secção [%s] não é reconhecida.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">O signatário não fez eco do endereço</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">O signatário fez eco de um endereço inesperado
+%s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">O signatário retornou erro: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
- <translation type="unfinished">Falhou assinatura da transação</translation>
+ <translation type="unfinished">Falha ao assinar a transação</translation>
</message>
<message>
<source>Specified -walletdir "%s" does not exist</source>
@@ -4622,37 +4918,55 @@ Impossível restaurar backup da carteira.</translation>
</message>
<message>
<source>Specified blocks directory "%s" does not exist.</source>
- <translation type="unfinished">
-A pasta de blocos especificados "%s" não existe.</translation>
+ <translation type="unfinished">A pasta de blocos especificados "%s" não existe.</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>
<message>
<source>Starting network threads…</source>
- <translation type="unfinished">A iniciar threads de rede...</translation>
+ <translation type="unfinished">A iniciar threads de rede…</translation>
+ </message>
+ <message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erro de sistema durante a transferência: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erro do sistema ao carregar arquivo de bloco externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erro do sistema ao salvar bloco no disco: %s</translation>
</message>
<message>
<source>The source code is available from %s.</source>
- <translation type="unfinished">O código fonte está disponível pelo %s.</translation>
+ <translation type="unfinished">O código-fonte está disponível em %s.</translation>
</message>
<message>
<source>The specified config file %s does not exist</source>
- <translation type="unfinished">O ficheiro de configuração especificado %s não existe
-</translation>
+ <translation type="unfinished">O ficheiro de configuração especificado %s não existe</translation>
</message>
<message>
<source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">O montante da transação é demasiado baixo para pagar a taxa</translation>
+ <translation type="unfinished">A quantia da transação é demasiado baixa para pagar a taxa</translation>
</message>
<message>
<source>The wallet will avoid paying less than the minimum relay fee.</source>
- <translation type="unfinished">A carteira evitará pagar menos que a taxa minima de propagação.</translation>
+ <translation type="unfinished">A carteira evitará pagar menos do que a taxa mínima de retransmissão.</translation>
+ </message>
+ <message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Não há ScriptPubKeyManager para este endereço</translation>
</message>
<message>
<source>This is experimental software.</source>
- <translation type="unfinished">Isto é software experimental.</translation>
+ <translation type="unfinished">Isto é um software experimental.</translation>
</message>
<message>
<source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">Esta é a taxa minima de transação que paga em cada transação.</translation>
+ <translation type="unfinished">Esta é a taxa mínima de transação que paga em cada transação.</translation>
</message>
<message>
<source>This is the transaction fee you will pay if you send a transaction.</source>
@@ -4660,19 +4974,19 @@ A pasta de blocos especificados "%s" não existe.</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>
+ <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>
+ <translation type="unfinished">Quantia da transação demasiado baixa</translation>
</message>
<message>
<source>Transaction amounts must not be negative</source>
- <translation type="unfinished">Os valores da transação não devem ser negativos</translation>
+ <translation type="unfinished">As quantias das transações não devem ser negativas</translation>
</message>
<message>
<source>Transaction change output index out of range</source>
- <translation type="unfinished">Endereço de troco da transação fora da faixa</translation>
+ <translation type="unfinished">O índice de saídas de troca de transações está fora do alcance</translation>
</message>
<message>
<source>Transaction must have at least one recipient</source>
@@ -4680,23 +4994,19 @@ A pasta de blocos especificados "%s" não existe.</translation>
</message>
<message>
<source>Transaction needs a change address, but we can't generate it.</source>
- <translation type="unfinished">Transação precisa de uma mudança de endereço, mas nós não a podemos gerar.</translation>
+ <translation type="unfinished">A transação precisa de um endereço de troco, mas não o conseguimos gerar.</translation>
</message>
<message>
<source>Transaction too large</source>
- <translation type="unfinished">Transação grande demais</translation>
- </message>
- <message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossível alocar memória para a opção "-maxsigcachesize: '%s' MiB</translation>
+ <translation type="unfinished">Transação demasiado grande</translation>
</message>
<message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">Incapaz de vincular à porta %s neste computador (vínculo retornou erro %s)</translation>
+ <translation type="unfinished">Não foi possível vincular a %s neste computador (a vinculação devolveu o erro %s)</translation>
</message>
<message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
- <translation type="unfinished">Impossível associar a %s neste computador. %s provavelmente já está em execução.</translation>
+ <translation type="unfinished">Não foi possível vincular a %s neste computador. %s provavelmente já está em execução.</translation>
</message>
<message>
<source>Unable to create the PID file '%s': %s</source>
@@ -4704,11 +5014,11 @@ A pasta de blocos especificados "%s" não existe.</translation>
</message>
<message>
<source>Unable to find UTXO for external input</source>
- <translation type="unfinished">Impossível localizar e entrada externa UTXO</translation>
+ <translation type="unfinished">Não é possível encontrar UTXO para a entrada externa</translation>
</message>
<message>
<source>Unable to generate initial keys</source>
- <translation type="unfinished">Incapaz de gerar as chaves iniciais</translation>
+ <translation type="unfinished">Não foi possível gerar as chaves iniciais</translation>
</message>
<message>
<source>Unable to generate keys</source>
@@ -4724,23 +5034,23 @@ A pasta de blocos especificados "%s" não existe.</translation>
</message>
<message>
<source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">Não é possível iniciar o servidor HTTP. Verifique o debug.log para detalhes.</translation>
+ <translation type="unfinished">Não é possível iniciar o servidor HTTP. Consulte o registo de depuração para obter detalhes.</translation>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Impossível desconectar carteira antes de migrá-la</translation>
+ <translation type="unfinished">Não foi possível desconectar a carteira antes de a migrar</translation>
</message>
<message>
<source>Unknown -blockfilterindex value %s.</source>
- <translation type="unfinished">Desconhecido -blockfilterindex valor %s.</translation>
+ <translation type="unfinished">Valor %s de -blockfilterindex desconhecido.</translation>
</message>
<message>
<source>Unknown address type '%s'</source>
- <translation type="unfinished">Tipo de endereço desconhecido '%s'</translation>
+ <translation type="unfinished">Tipo de endereço desconhecido: "%s"</translation>
</message>
<message>
<source>Unknown change type '%s'</source>
- <translation type="unfinished">Tipo de mudança desconhecido '%s'</translation>
+ <translation type="unfinished">Tipo de troco desconhecido: "%s"</translation>
</message>
<message>
<source>Unknown network specified in -onlynet: '%s'</source>
@@ -4751,12 +5061,16 @@ A pasta de blocos especificados "%s" não existe.</translation>
<translation type="unfinished">Ativadas novas regras desconhecidas (versionbit %i)</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opção não reconhecida "%s" fornecido em -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
+ <translation type="unfinished">Falha na criação do ficheiro da carteira: %s</translation>
</message>
<message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
@@ -4764,19 +5078,19 @@ A pasta de blocos especificados "%s" não existe.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
- <translation type="unfinished">Categoria de registos desconhecida %s=%s.</translation>
+ <translation type="unfinished">Categoria de registo não suportada %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>
+ <translation type="unfinished">Erro: não foi possível adicionar a transação só de observação %s à carteira de observaçã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>
+ <translation type="unfinished">Erro: não foi possível eliminar transações só de observaçã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>
+ <translation type="unfinished">O comentário no agente do utilizador/user agent (%s) contém caracteres inseguros.</translation>
</message>
<message>
<source>Verifying blocks…</source>
@@ -4788,7 +5102,7 @@ A pasta de blocos especificados "%s" não existe.</translation>
</message>
<message>
<source>Wallet needed to be rewritten: restart %s to complete</source>
- <translation type="unfinished">A carteira precisou de ser reescrita: reinicie %s para completar</translation>
+ <translation type="unfinished">Foi necessário reescrever a carteira: reinicie %s para concluir</translation>
</message>
<message>
<source>Settings file could not be read</source>
@@ -4796,7 +5110,7 @@ A pasta de blocos especificados "%s" não existe.</translation>
</message>
<message>
<source>Settings file could not be written</source>
- <translation type="unfinished">Não foi possível editar o ficheiro de configurações</translation>
+ <translation type="unfinished">Não foi possível escrever o ficheiro de configurações</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 33a9c23d75..6c2c515066 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>
@@ -95,11 +95,11 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Sending addresses - %1</source>
- <translation type="unfinished">Enviando endereços - %1</translation>
+ <translation type="unfinished">Endereços de envio - %1</translation>
</message>
<message>
<source>Receiving addresses - %1</source>
- <translation type="unfinished">Recebendo endereços - %1</translation>
+ <translation type="unfinished">Endereços de recebimento - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -184,6 +184,10 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Digite a antiga e a nova senha da carteira</translation>
</message>
<message>
+ <source>Back</source>
+ <translation type="unfinished">Voltar</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">Lembre-se que sua carteira criptografada não poderá proteger totalmente os seus bitcoins de serem roubados por softwares maldosos que infectem seu computador.</translation>
</message>
@@ -382,7 +386,11 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<numerusform>%nanos </numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">carteira padrão</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -496,7 +504,7 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Assine mensagens com seus endereços Bitcoin para provar que você é dono deles</translation>
+ <translation type="unfinished">Assine mensagens com seus endereços Bitcoin para provar que você é dono delas</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -504,11 +512,11 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verifique mensagens para assegurar que foram assinadas com o endereço Bitcoin especificado</translation>
+ <translation type="unfinished">Verificar mensagens para se assegurar que elas foram assinadas pelo dono de Endereços Bitcoin específicos</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Carregar PSBT do arquivo...</translation>
+ <translation type="unfinished">&amp;Carregar 'PSBT' do arquivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -619,7 +627,7 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Carregar Transação de Bitcoin Parcialmente Assinada</translation>
+ <translation type="unfinished">Carregar</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -693,11 +701,7 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Mascarar os valores na barra Resumo</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">carteira padrão</translation>
+ <translation type="unfinished">Mascarar os valores na aba de visão geral</translation>
</message>
<message>
<source>No wallets available</source>
@@ -966,7 +970,7 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">Copiar troco</translation>
+ <translation type="unfinished">Copiar alteração</translation>
</message>
<message>
<source>(%1 locked)</source>
@@ -1055,7 +1059,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">Migrar Carteira</translation>
+ <translation type="unfinished">Migrar carteira</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1089,10 +1093,6 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Abrir carteira alerta</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">carteira padrão</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Abrir carteira</translation>
@@ -2156,6 +2156,14 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Número de conexões</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Endereços locais</translation>
+ </message>
+ <message>
+ <source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
+ <translation type="unfinished">Endereços de rede que seu nó Bitcoin está usando atualmente para se comunicar com outros nós.</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Corrente de blocos</translation>
</message>
@@ -2204,6 +2212,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Selecione um nó para ver informações detalhadas.</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Ocultar detalhes dos pares</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">Versão da camada de transporte: %1</translation>
</message>
@@ -2212,10 +2224,6 @@ O processo de migração criará um backup da carteira antes da migração. Este
<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>
@@ -2253,7 +2261,7 @@ O processo de migração criará um backup da carteira antes da migração. Este
</message>
<message>
<source>Mapped AS</source>
- <translation type="unfinished">Mapeado como</translation>
+ <translation type="unfinished">S.A. de mapeamento</translation>
</message>
<message>
<source>Whether we relay addresses to this peer.</source>
@@ -2310,6 +2318,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Permissões</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">A cadeia de ID da sessão BIP324 em hexadecimal.</translation>
+ </message>
+ <message>
<source>Services</source>
<translation type="unfinished">Serviços</translation>
</message>
@@ -2427,6 +2439,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Atividade da rede desativada</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nenhum</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Executando comando sem nenhuma carteira</translation>
</message>
@@ -2469,7 +2485,7 @@ 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>
+%7 AVISO: Scammers estão ativamente influenciando usuário a digitarem comandos aqui, roubando os conteúdos de suas carteiras. Não use este terminal sem pleno conhecimento dos efeitos de cada comando.%8</translation>
</message>
<message>
<source>Executing…</source>
@@ -2862,7 +2878,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">Copiar troco</translation>
+ <translation type="unfinished">Copiar alteração</translation>
</message>
<message>
<source>%1 (%2 blocks)</source>
@@ -3104,8 +3120,8 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">&amp;Assinar mensagem</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">Você pode assinar mensagens com seus endereços para provar que você pode receber bitcoins enviados por alguém. Cuidado para não assinar nada vago ou aleatório, pois ataques phishing podem tentar te enganar para assinar coisas para eles como se fosse você. Somente assine termos bem detalhados que você concorde.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Você pode assinar mensagens com seus endereços legados (P2PKH) para provar que pode receber bitcoins enviados a eles. Tenha cuidado para não assinar nada vago ou aleatório, pois ataques de phishing podem tentar enganá-lo para assinar sua identidade para eles. Assine apenas declarações totalmente detalhadas com as quais você concorda.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3192,8 +3208,8 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Por gentileza, cheque o endereço e tente novamente.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">O endereço fornecido não se refere a uma chave.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">O endereço inserido não se refere a uma chave legada (P2PKH). A assinatura de mensagens para SegWit e outros tipos de endereço não P2PKH não são suportadas nesta versão do %1. Por favor, verifique o endereço e tente novamente.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3724,9 +3740,8 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT copiado</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiado para a área de transferência</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Fee-bump PSBT copiado para a área de transferência</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3737,10 +3752,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Não foi possível mandar a transação</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">carteira padrão</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Erro do signatário</translation>
</message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3827,10 +3842,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Mais de um endereço onion associado é fornecido. Usando %s para automaticamento criar serviço onion Tor.</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 verifique se a data e o horário de seu computador estão corretos. Se o relógio de seu computador estiver incorreto, %s não funcionará corretamente.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Por favor contribua se você entender que %s é útil. Visite %s para mais informações sobre o software.</translation>
</message>
@@ -3931,10 +3942,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool deve ser pelo menos %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Aconteceu um erro interno fatal, veja os detalhes em debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Não foi possível encontrar o endereço de -%s: '%s'</translation>
</message>
@@ -3948,7 +3955,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Não foi possível escrever no diretório '%s': verifique as permissões.</translation>
+ <translation type="unfinished">Não foi possível escrever no diretório de dados '%s': verifique as permissões.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -3983,6 +3990,12 @@ Go to File &gt; Open Wallet to load a wallet.
<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 remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Falha ao remover o diretório do snapshot chainstate (%s). Remova-o manualmente antes de reiniciar.
+</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>
@@ -3991,6 +4004,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Falha na estimativa de taxa. Fallbackfee desativada. Espere alguns blocos ou ative %s.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falha ao transferir o ficheiro de bloco para o disco. Isto é provavelmente o resultado de um erro de E/S.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Falha ao transferir o ficheiro undo para o disco. Isto é provavelmente o resultado de um erro de E/S.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opções incompatíveis: "-dnsseed=1" foi explicitamente específicada, mas "-onlynet" proíbe conexões para IPv4/IPv6</translation>
</message>
@@ -3999,6 +4020,14 @@ Go to File &gt; Open Wallet to load a wallet.
<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>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">O peso máximo da transação é inferior ao peso da transação sem entradas</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">O peso máximo da transação é demasiado baixo, não pode acomodar a saída de mudança</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>
@@ -4015,6 +4044,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Conexões de saída limitadas a rede i2p (-onlynet=i2p), mas -i2psam não foi configurado</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">Renomear de '%s' -&gt; '%s'falhou. Não é possível limpar o diretório leveldb do chainstate em segundo plano.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">A combinação das entradas pré-selecionadas e a seleção automática de entradas da carteira excede o peso máximo da transação. Tente enviar uma quantia menor ou consolidar manualmente os UTXOs da sua carteira</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>
@@ -4057,6 +4094,10 @@ Por favor tente atualizar o software para a última versão.
</translation>
</message>
<message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">A data e a hora do seu computador parecem estar mais de %d minutos fora de sincronia com a rede, isso pode levar a uma falha de consenso. Depois de confirmar o relógio do seu computador, essa mensagem não deve mais aparecer quando você reiniciar seu nó. Sem uma reinicialização, ela deve parar de aparecer automaticamente depois que você se conectar a um número suficiente de novos pares de saída, o que pode levar algum tempo. Você pode inspecionar o campo `timeoffset` dos métodos RPC `getpeerinfo` e `getnetworkinfo` para obter mais informações.</translation>
+ </message>
+ <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4069,6 +4110,18 @@ Unable to restore backup of wallet.</source>
Impossível restaurar backup da carteira.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind só pode ser utilizado para conexões de entrada ("out" foi passado)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Ocorreu um fatal internal error, consulte debug.log para obter detalhes:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Não foram encontrados os dados assumeutxo para o blockhash em causa '%s'.</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">A verificação dos blocos foi interrompida</translation>
</message>
@@ -4077,6 +4130,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">A configuração %s somente é aplicada na rede %s quando na sessão [%s].</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bloco corrompido encontrado indicando possível falha de hardware.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Detectado Banco de dados de blocos corrompido</translation>
</message>
@@ -4101,6 +4158,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Carregamento terminado!</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Falha na verificação de integridade da criptografia de curva elíptica. %s está sendo desligado.</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>
@@ -4213,10 +4274,22 @@ Impossível restaurar backup da carteira.</translation>
<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 connect best block (%s).</source>
+ <translation type="unfinished">Falha ao conectar o melhor bloco (%s).</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Falha ao desconectar o bloco.</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>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Falha ao ler o bloco.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Falha ao escanear novamente a carteira durante a inicialização</translation>
</message>
@@ -4229,6 +4302,22 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Falha ao verificar a base de dados</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Falha ao escrever bloco.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Falha ao escrever na base de dados de índices de blocos.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Falha ao escrever na base de dados de moedas.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Falha ao escrever dados de anulação.</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">Falha ao remover a transação: %s</translation>
</message>
@@ -4321,6 +4410,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Carregando carteira...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">O peso máximo da transação deve estar entre %d e %d</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Faltando quantia</translation>
</message>
@@ -4349,6 +4442,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Não há solução para entrada pré-selecionada %s</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">Apenas a direção foi definida, sem permissões: '%s'</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">O modo prune não pode ser configurado com um valor negativo.</translation>
</message>
@@ -4393,6 +4490,19 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Sessão [%s] não reconhecida.</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">O signatário não fez eco do endereço</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">O signatário fez eco de um endereço inesperado
+%s</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">O signatário retornou erro: %s</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">Assinatura de transação falhou</translation>
</message>
@@ -4421,6 +4531,18 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Iniciando atividades da rede...</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Erro de sistema durante a transferência: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">Erro do sistema ao carregar arquivo de bloco externo: %s</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">Erro do sistema ao salvar bloco no disco: %s</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">O código fonte está disponível pelo %s.</translation>
</message>
@@ -4433,6 +4555,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">A carteira irá evitar pagar menos que a taxa mínima de retransmissão.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Não há ScriptPubKeyManager para este endereço</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Este é um software experimental.</translation>
</message>
@@ -4473,10 +4599,6 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Transação muito grande</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Impossível alocar memória para a opção "-maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Erro ao vincular em %s neste computador (bind retornou erro %s)</translation>
</message>
@@ -4529,6 +4651,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Rede desconhecida especificada em -onlynet: '%s'</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Opção não reconhecida "%s" fornecido em -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
<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>
diff --git a/src/qt/locale/bitcoin_ro.ts b/src/qt/locale/bitcoin_ro.ts
index 059436329d..33a478d217 100644
--- a/src/qt/locale/bitcoin_ro.ts
+++ b/src/qt/locale/bitcoin_ro.ts
@@ -181,6 +181,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
 </translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continua</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">Reţineti: criptarea portofelului dvs. nu vă poate proteja în totalitate bitcoin-urile împotriva furtului de malware care vă infectează computerul.</translation>
</message>
@@ -225,6 +229,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Parola portofelului a fost schimbata.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Schimbarea frazei de acces a esuat</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Atenţie! Caps Lock este pornit!</translation>
</message>
@@ -365,7 +373,15 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>%1 kB</source>
+ <translation type="unfinished">%1kB</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">portofel implicit</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -417,6 +433,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Crează un portofel nou</translation>
</message>
<message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">&amp;Reduce</translation>
+ </message>
+ <message>
<source>Wallet:</source>
<translation type="unfinished">Portofel:</translation>
</message>
@@ -598,10 +618,18 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Actualizat</translation>
</message>
<message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctr+Q</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction</source>
<translation type="unfinished">Încărcați Tranzacția Bitcoin Parțial Semnată</translation>
</message>
<message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Incarca PSBT din &amp;notite</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">Încărcați Tranzacția Bitcoin Parțial Semnată din clipboard</translation>
</message>
@@ -638,10 +666,28 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Inchide portofel</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Recupereaza Portofelul...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Recupereaza Portofelul din fisierele rezerva</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Închideți toate portofelele</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Transfera Portofelul</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Transfera un portofel</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Arată mesajul de ajutor %1 pentru a obţine o listă cu opţiunile posibile de linii de comandă Bitcoin</translation>
</message>
@@ -654,10 +700,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Mascați valorile din fila Prezentare generală</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portofel implicit</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Niciun portofel disponibil</translation>
</message>
@@ -686,6 +728,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">&amp;Fereastră</translation>
</message>
<message>
+ <source>Ctrl+M</source>
+ <translation type="unfinished">Ctr+M</translation>
+ </message>
+ <message>
<source>Main Window</source>
<translation type="unfinished">Fereastra principală</translation>
</message>
@@ -693,6 +739,14 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<source>%1 client</source>
<translation type="unfinished">Client %1</translation>
</message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">&amp;Ascunde</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">A&amp;rata</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -708,6 +762,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Pulsează pentru mai multe acțiuni.</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Eroare creare portofel</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Eroare: %1</translation>
</message>
@@ -862,6 +920,22 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Copiază suma</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Copiaza adresa</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Copiaza si eticheteaza</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">copiaza &amp;valoarea</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">copiaza ID-ul de tranzactie si indexul de iesire</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">Copiază cantitea</translation>
</message>
@@ -910,6 +984,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Crează portofel</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">Creeaza Protofel&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Create wallet failed</source>
<translation type="unfinished">Crearea portofelului a eÅŸuat</translation>
</message>
@@ -932,6 +1011,29 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Muta portofelul</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Esti sigur ca vrei sa muti portofelul &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Transfera Portofelul</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Mutare esuata</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Mutarea s-a efectuat cu succes</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -942,15 +1044,16 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Atenționare la deschiderea portofelului</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portofel implicit</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Deschide portofel</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">Deschidere Portofel&lt;b&gt;%1&lt;/b&gt;</translation>
+ </message>
+</context>
<context>
<name>RestoreWalletActivity</name>
<message>
@@ -959,6 +1062,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Restaurare portofel</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">Restabilirea Portofelului&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">Restaurarea portofelului nereusita</translation>
@@ -1004,6 +1112,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Crează portofel</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Esti la un pas distanta pentru a-ti crea noul tau portofel!</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Numele portofelului</translation>
</message>
@@ -1248,6 +1360,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<context>
<name>ShutdownWindow</name>
<message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">%1 se închide</translation>
+ </message>
+ <message>
<source>Do not shut down the computer until this window disappears.</source>
<translation type="unfinished">Nu închide calculatorul pînă ce această fereastră nu dispare.</translation>
</message>
@@ -1554,6 +1670,13 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
</message>
</context>
<context>
+ <name>OptionsModel</name>
+ <message>
+ <source>Could not read setting "%1", %2.</source>
+ <translation type="unfinished">nu s-a putut citi setarea "%1", %2</translation>
+ </message>
+</context>
+<context>
<name>OverviewPage</name>
<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>
@@ -1635,6 +1758,14 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Inchide</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">Nu s-a reusit incarcarea tranzactiei: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">Nu s-a reusit semnarea tranzactiei: %1</translation>
+ </message>
+ <message>
<source>Save Transaction Data</source>
<translation type="unfinished">Salvați datele tranzacției</translation>
</message>
@@ -1643,6 +1774,14 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">adresa proprie</translation>
</message>
<message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">Nu s-a putut calcula comisionul de tranzactie sau suma totala al tranzactiei.</translation>
+ </message>
+ <message>
+ <source>Pays transaction fee: </source>
+ <translation type="unfinished">Plateste comisionul de tranzactie: </translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">Suma totală</translation>
</message>
@@ -1690,6 +1829,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Agent utilizator</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">Ani</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">Direcţie</translation>
@@ -1733,6 +1877,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<context>
<name>QRImageWidget</name>
<message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Salveaza Imaginea...</translation>
+ </message>
+ <message>
<source>&amp;Copy Image</source>
<translation type="unfinished">&amp;Copiaza Imaginea</translation>
</message>
@@ -1752,7 +1900,12 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<source>Save QR Code</source>
<translation type="unfinished">Salvează codul QR</translation>
</message>
- </context>
+ <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">Imagine PNG</translation>
+ </message>
+</context>
<context>
<name>RPCConsole</name>
<message>
@@ -1836,6 +1989,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Selectaţi un partener pentru a vedea informaţiile detaliate.</translation>
</message>
<message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID-ul Sesiunii</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versiune</translation>
</message>
@@ -1852,6 +2009,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Blocuri Sincronizate</translation>
</message>
<message>
+ <source>Last Transaction</source>
+ <translation type="unfinished">Ultima Tranzactie</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation type="unfinished">Agent utilizator</translation>
</message>
@@ -1872,6 +2033,14 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Mareste fontul</translation>
</message>
<message>
+ <source>Permissions</source>
+ <translation type="unfinished">Permisiuni</translation>
+ </message>
+ <message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">Directie/Tip</translation>
+ </message>
+ <message>
<source>Services</source>
<translation type="unfinished">Servicii</translation>
</message>
@@ -1940,6 +2109,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">IeÅŸire:</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <extracomment>Context menu action to copy the address of a peer.</extracomment>
+ <translation type="unfinished">&amp;Copiaza adresa</translation>
+ </message>
+ <message>
<source>&amp;Disconnect</source>
<translation type="unfinished">&amp;Deconectare</translation>
</message>
@@ -1960,10 +2134,18 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Activitatea retelei a fost oprita.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Niciuna</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Executarea comenzii fara nici un portofel.</translation>
</message>
<message>
+ <source>Ctrl+I</source>
+ <translation type="unfinished">Ctrl+l</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Executarea comenzii folosind portofelul "%1"</translation>
</message>
@@ -1988,6 +2170,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Interzicere pentru</translation>
</message>
<message>
+ <source>Never</source>
+ <translation type="unfinished">Niciodata</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation type="unfinished">Necunoscut</translation>
</message>
@@ -2055,6 +2241,18 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Copiază &amp;URl</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Copiaza adresa</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Copiaza si eticheteaza</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">copiaza &amp;valoarea</translation>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">Portofelul nu a putut fi deblocat.</translation>
</message>
@@ -2086,6 +2284,14 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Copiază &amp;adresa</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">&amp;Verifica</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Salveaza Imaginea...</translation>
+ </message>
+ <message>
<source>Payment information</source>
<translation type="unfinished">Informaţiile plată</translation>
</message>
@@ -2216,6 +2422,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Şterge toate câmpurile formularului.</translation>
</message>
<message>
+ <source>Choose…</source>
+ <translation type="unfinished">Alege...</translation>
+ </message>
+ <message>
<source>Confirmation time target:</source>
<translation type="unfinished">Timp confirmare tinta:</translation>
</message>
@@ -2276,6 +2486,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">%1 la %2</translation>
</message>
<message>
+ <source>Sign failed</source>
+ <translation type="unfinished">Semnatura esuata</translation>
+ </message>
+ <message>
<source>Save Transaction Data</source>
<translation type="unfinished">Salvați datele tranzacției</translation>
</message>
@@ -2438,10 +2652,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">&amp;Semnează mesaj</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">Puteţi semna mesaje/contracte cu adresele dvs. pentru a demostra ca puteti primi bitcoini trimisi la ele. Aveţi grijă să nu semnaţi nimic vag sau aleator, deoarece atacurile de tip phishing vă pot păcăli să le transferaţi identitatea. Semnaţi numai declaraţiile detaliate cu care sînteti de acord.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Adresa cu care semnaţi mesajul</translation>
</message>
@@ -2518,10 +2728,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Vă rugăm verificaţi adresa şi încercaţi din nou.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Adresa introdusă nu se referă la o cheie.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Deblocarea portofelului a fost anulata.</translation>
</message>
@@ -2858,6 +3064,31 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Suma minimă</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Copiaza adresa</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Copiaza si eticheteaza</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">copiaza &amp;valoarea</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">Copiaza ID-ul de tranzactie</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">Copiaza toate detaliile tranzacţiei</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">Arata in %1</translation>
+ </message>
+ <message>
<source>Export Transaction History</source>
<translation type="unfinished">Export istoric tranzacţii</translation>
</message>
@@ -2918,6 +3149,14 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<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">Nu a fost incarcat nici un portofel.
+Mergi la Fisiere&gt;Deschide Portofel ca sa incarci un portofel.
+-SAU-</translation>
+ </message>
+ <message>
<source>Create a new wallet</source>
<translation type="unfinished">Crează un portofel nou</translation>
</message>
@@ -2925,6 +3164,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<source>Error</source>
<translation type="unfinished">Eroare</translation>
</message>
+ <message>
+ <source>Load Transaction Data</source>
+ <translation type="unfinished">Incarca datele tranzactiei</translation>
+ </message>
</context>
<context>
<name>WalletModel</name>
@@ -2970,8 +3213,8 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Tranzactia nu a putut fi consemnata.</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">portofel implicit</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Nu se poate afisa adresa</translation>
</message>
</context>
<context>
@@ -3025,10 +3268,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>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>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Va rugam sa contribuiti daca apreciati ca %s va este util. Vizitati %s pentru mai multe informatii despre software.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts
index c7ac89b746..7a54b45768 100644
--- a/src/qt/locale/bitcoin_ru.ts
+++ b/src/qt/locale/bitcoin_ru.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>
@@ -15,7 +15,7 @@
</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>
@@ -86,12 +86,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ <translation type="unfinished">ТекÑÑ‚, разделённый запÑтыми (*.csv)</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>
+ <translation type="unfinished">Произошла ошибка при Ñохранении ÑпиÑка адреÑов в %1. ПожалуйÑта, попробуйте еще раз.</translation>
</message>
<message>
<source>Sending addresses - %1</source>
@@ -125,23 +125,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation type="unfinished">ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°</translation>
+ <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>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Показать парольную фразу</translation>
+ <translation type="unfinished">Показать пароль</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -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">Ð”Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ фразы Ð´Ð»Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ вашего кошелька.</translation>
+ <translation type="unfinished">Ð”Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ вашего кошелька.</translation>
</message>
<message>
<source>Unlock wallet</source>
@@ -157,7 +157,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change passphrase</source>
- <translation type="unfinished">Изменить парольную фразу</translation>
+ <translation type="unfinished">Изменить пароль</translation>
</message>
<message>
<source>Confirm wallet encryption</source>
@@ -165,7 +165,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">Предупреждение: еÑли вы зашифруете кошелёк и потерÑете парольную фразу, вы &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>
@@ -177,11 +177,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
+ <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>Continue</source>
+ <translation type="unfinished">Продолжить</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -189,7 +197,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
@@ -197,7 +205,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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 +213,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>
@@ -221,7 +229,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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,15 +237,15 @@ 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>
- <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>
@@ -303,147 +311,60 @@ 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>
- <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>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">СиÑтемный шрифт по умолчанию "%1"</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform>%n Ñекунда</numerusform>
- <numerusform>%n Ñекунды</numerusform>
- <numerusform>%n Ñекунд</numerusform>
+ <numerusform>%n second(s)</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 минута</numerusform>
- <numerusform>%n минуты</numerusform>
- <numerusform>%n минут</numerusform>
+ <numerusform>%n minute(s)</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 чаÑ</numerusform>
- <numerusform>%n чаÑа</numerusform>
- <numerusform>%n чаÑов</numerusform>
+ <numerusform>%n hour(s)</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 день</numerusform>
- <numerusform>%n днÑ</numerusform>
- <numerusform>%n дней</numerusform>
+ <numerusform>%n day(s)</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 неделÑ</numerusform>
- <numerusform>%n недели</numerusform>
- <numerusform>%n недель</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</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>
- <numerusform>%n года</numerusform>
- <numerusform>%n лет</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <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>
+ <source>default wallet</source>
+ <translation type="unfinished">кошелёк по умолчанию</translation>
</message>
</context>
<context>
@@ -523,7 +444,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Изменить пароль иÑпользуемый Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°</translation>
+ <translation type="unfinished">Изменить пароль, иÑпользуемый Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -539,7 +460,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
@@ -547,15 +468,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>
@@ -563,7 +484,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>
@@ -571,23 +492,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>
@@ -607,19 +528,19 @@ 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>
@@ -631,15 +552,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
- <translation type="unfinished">Параметры командной Ñтроки</translation>
+ <translation type="unfinished">&amp;Параметры командной Ñтроки</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -679,7 +600,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>
@@ -711,7 +632,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Открыть биткойн: URI</translation>
+ <translation type="unfinished">Открыть URI протокола bitcoin:</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -733,7 +654,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -760,10 +681,6 @@ 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>No wallets available</source>
<translation type="unfinished">Ðет доÑтупных кошельков</translation>
</message>
@@ -846,11 +763,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error creating wallet</source>
- <translation type="unfinished">Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°</translation>
+ <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>
+ <translation type="unfinished">Ðе удалоÑÑŒ Ñоздать новый кошелёк, так как программа Ñобрана без поддержки SQLite (необходим Ð´Ð»Ñ Ð´ÐµÑкрипторных кошельков)</translation>
</message>
<message>
<source>Error: %1</source>
@@ -898,7 +815,7 @@ 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>
@@ -906,11 +823,11 @@ 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-Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ &lt;b&gt;включена&lt;/b&gt;</translation>
+ <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>
+ <translation type="unfinished">Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ HD-ключей &lt;b&gt;запрещена&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -948,7 +865,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>
@@ -1137,7 +1054,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">ПеренеÑти Кошелек</translation>
+ <translation type="unfinished">ПеренеÑти кошелек</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1148,14 +1065,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1175,13 +1084,9 @@ The migration process will create a backup of the wallet before migrating. This
<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>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1194,7 +1099,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1204,7 +1109,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1251,7 +1156,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Wallet Name</source>
- <translation type="unfinished">Ðазвание кошелька</translation>
+ <translation type="unfinished">Ð˜Ð¼Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°</translation>
</message>
<message>
<source>Wallet</source>
@@ -1271,7 +1176,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
@@ -1291,7 +1196,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>External signer</source>
- <translation type="unfinished">ВнешнÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ñторона</translation>
+ <translation type="unfinished">Внешний подпиÑант</translation>
</message>
<message>
<source>Create</source>
@@ -1339,15 +1244,15 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">Введенный Ð°Ð´Ñ€ÐµÑ "%1" недейÑтвителен в Ñети Биткоин.</translation>
+ <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>
+ <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>
+ <translation type="unfinished">Введённый Ð°Ð´Ñ€ÐµÑ "%1" уже ÑущеÑтвует в адреÑной книге Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹ "%2".</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -1365,10 +1270,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1386,7 +1287,7 @@ The migration process will create a backup of the wallet before migrating. This
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform>%n ГБ меÑта доÑтупен</numerusform>
+ <numerusform>%n ГБ меÑта доÑтупно</numerusform>
<numerusform>%n ГБ меÑта доÑтупно</numerusform>
<numerusform>%n ГБ меÑта доÑтупно</numerusform>
</translation>
@@ -1430,7 +1331,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
@@ -1438,7 +1339,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">Ошибка: невозможно Ñоздать указанный каталог данных "%1".</translation>
+ <translation type="unfinished">Ошибка: не удалоÑÑŒ Ñоздать указанный каталог данных "%1".</translation>
</message>
<message>
<source>Error</source>
@@ -1482,7 +1383,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Use the default data directory</source>
- <translation type="unfinished">ИÑпользовать Ñтандартный каталог данных</translation>
+ <translation type="unfinished">ИÑпользовать каталог данных по умолчанию</translation>
</message>
<message>
<source>Use a custom data directory:</source>
@@ -1497,11 +1398,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>About %1</source>
- <translation type="unfinished">О %1</translation>
+ <translation type="unfinished">О программе %1</translation>
</message>
<message>
<source>Command-line options</source>
- <translation type="unfinished">Опции командной Ñтроки</translation>
+ <translation type="unfinished">Параметры командной Ñтроки</translation>
</message>
</context>
<context>
@@ -1512,22 +1413,18 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">Ðе выключайте компьютер, пока Ñто окно не пропадёт.</translation>
+ <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>
+ <translation type="unfinished">Попытка потратить ÑредÑтва, иÑпользованные в транзакциÑÑ…, которые ещё не Ñинхронизированы, будет отклонена Ñетью.</translation>
</message>
<message>
<source>Number of blocks left</source>
@@ -1562,16 +1459,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Скрыть</translation>
</message>
<message>
- <source>Esc</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>
+ <translation type="unfinished">ÐеизвеÑтно. Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² (%1, %2%)…</translation>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
@@ -1602,7 +1495,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">ÐвтоматичеÑки запуÑкать %1поÑле входа в ÑиÑтему.</translation>
+ <translation type="unfinished">ÐвтоматичеÑки запуÑкать %1 поÑле входа в ÑиÑтему.</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1626,7 +1519,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи-Ñервера (к примеру, 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>
@@ -1637,6 +1530,10 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1719,10 +1616,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">ЭкÑпертные наÑтройки</translation>
</message>
<message>
- <source>Enable coin &amp;control features</source>
- <translation type="unfinished">Включить возможноÑÑ‚ÑŒ &amp;ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð½ÐµÑ‚Ð°Ð¼Ð¸</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">ЕÑли вы отключите трату неподтверждённой Ñдачи, Ñдачу от транзакции Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать до тех пор, пока у Ñтой транзакции не будет Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одного подтверждениÑ. Это также влиÑет на раÑчёт вашего баланÑа.</translation>
</message>
@@ -1866,7 +1759,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Cancel</source>
- <translation type="unfinished">О&amp;тмена</translation>
+ <translation type="unfinished">&amp;Отмена</translation>
</message>
<message>
<source>Compiled without external signing support (required for external signing)</source>
@@ -1889,7 +1782,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
+ <translation type="unfinished">Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк клиента.</translation>
</message>
<message>
<source>Client will be shut down. Do you want to proceed?</source>
@@ -1941,10 +1834,6 @@ The migration process will create a backup of the wallet before migrating. This
<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">ÐžÑ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÐ¼Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть уÑтаревшей. Ваш кошелёк автоматичеÑки ÑинхронизируетÑÑ Ñ Ñетью Bitcoin поÑле подключениÑ, и Ñтот процеÑÑ Ð¿Ð¾ÐºÐ° не завершён.</translation>
</message>
@@ -2008,1104 +1897,35 @@ The migration process will create a backup of the wallet before migrating. This
<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">Включён режим приватноÑти Ð´Ð»Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸ Обзор. Чтобы показать данные, Ñнимите отметку Ñ Ð¿ÑƒÐ½ÐºÑ‚Ð° ÐаÑтройки -&gt; Скрыть значениÑ.</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">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÑƒÑпешно отправлена! Идентификатор транзакции: %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>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>
- <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">Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить обработчик click-to-pay Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð° 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, наÑтоÑтельно рекомендуетÑÑ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ любые инÑтрукции продавцов Ñменить кошелёк.
-ЕÑли вы получили Ñту ошибку, вам Ñледует попроÑить у продавца 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! Это может быть вызвано тем, что биткоин-Ð°Ð´Ñ€ÐµÑ Ð½ÐµÐ²ÐµÑ€ÐµÐ½ или параметры 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>Ping</source>
- <extracomment>Title of Peers Table column which indicates the current latency of the connection with the peer.</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>
- </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">Ðаправление</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>
- <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;Сохранить изображение…</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;Копировать изображение</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 в QR-код.</translation>
- </message>
- <message>
- <source>QR code support not available.</source>
- <translation type="unfinished">Поддержка QR-кодов недоÑтупна.</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">Сохранить QR-код</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>
<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;ИнформациÑ</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;СброÑ</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;Узлы</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 в шеÑтнадцатеричном формате, еÑли таковой имеетÑÑ.</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>
- <message>
- <source>Transaction Relay</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">ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ð°Ñ ÐС</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>
- </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>
- </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>
- </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>
- </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>
- </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>
- </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>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Окно ноды - [%1]</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</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">Ð’Ñ€ÐµÐ¼Ñ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° принÑÑ‚Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ транзакции в наш mempool от Ñтого узла.</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">Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ°</translation>
- </message>
- <message>
- <source>The duration of a currently outstanding ping.</source>
- <translation type="unfinished">Задержка между запроÑом к узлу и ответом от него.</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">Ожидание отклика</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">Минимальное Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ°</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;Открыть</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">&amp;КонÑоль</translation>
- </message>
- <message>
- <source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;Сетевой трафик</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;Копировать адреÑ</translation>
- </message>
- <message>
- <source>&amp;Disconnect</source>
- <translation type="unfinished">О&amp;тключитьÑÑ</translation>
- </message>
- <message>
- <source>1 &amp;hour</source>
- <translation type="unfinished">1 &amp;чаÑ</translation>
- </message>
- <message>
- <source>1 d&amp;ay</source>
- <translation type="unfinished">1 &amp;день</translation>
- </message>
- <message>
- <source>1 &amp;week</source>
- <translation type="unfinished">1 &amp;неделÑ</translation>
- </message>
- <message>
- <source>1 &amp;year</source>
- <translation type="unfinished">1 &amp;год</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;Копировать IP или маÑку подÑети</translation>
- </message>
- <message>
- <source>&amp;Unban</source>
- <translation type="unfinished">&amp;Разбанить</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>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">Добро пожаловать в RPC-конÑоль %1.
-ИÑпользуйте Ñтрелки вверх и вниз, чтобы перемещатьÑÑ Ð¿Ð¾ иÑтории и %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;Сумма:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Метка:</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">&amp;Сообщение:</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">ÐеобÑзательное Ñообщение Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа платежа, которое будет показано при открытии запроÑа. Внимание: Ñто Ñообщение не будет отправлено вмеÑте Ñ Ð¿Ð»Ð°Ñ‚ÐµÐ¶Ð¾Ð¼ через Ñеть Bitcoin.</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;Создать новый Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ</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;метку</translation>
- </message>
- <message>
- <source>Copy &amp;message</source>
- <translation type="unfinished">Копировать &amp;Ñообщение</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Копировать Ñ&amp;умму</translation>
- </message>
- <message>
- <source>Base58 (Legacy)</source>
- <translation type="unfinished">Base58 (УÑтаревший)</translation>
- </message>
- <message>
- <source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">Ðе рекомендуетÑÑ Ð¸Ð·-за выÑоких комиÑÑий и меньшей уÑтойчивоÑти к опечаткам.</translation>
- </message>
- <message>
- <source>Generates an address compatible with older wallets.</source>
- <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">Создать 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>
- </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>
-</context>
+ </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;адреÑ</translation>
- </message>
- <message>
- <source>&amp;Verify</source>
- <translation type="unfinished">&amp;Проверить</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;Сохранить изображение…</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>
<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>
- <message>
- <source>Requested</source>
- <translation type="unfinished">Запрошено</translation>
- </message>
-</context>
+ </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">за килобайт</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;получателÑ</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">Укажите пользовательÑкую комиÑÑию за КБ (1000 байт) виртуального размера транзакции.
-
-Примечание: комиÑÑÐ¸Ñ Ñ€Ð°ÑÑчитываетÑÑ Ð¿Ñ€Ð¾Ð¿Ð¾Ñ€Ñ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾ размеру в байтах. Так при комиÑÑии "100 Ñатоши за kvB (виртуальный КБ)" Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ размером 500 виртуальных байт (половина 1 kvB) комиÑÑÐ¸Ñ Ð±ÑƒÐ´ÐµÑ‚ вÑего 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">Включить 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>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">ОчиÑтить &amp;вÑÑ‘</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;Отправить</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">Копировать количеÑтво</translation>
</message>
@@ -3114,833 +1934,70 @@ 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 fee</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>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;без подпиÑи</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">Ð’Ñ‹ можете увеличить комиÑÑию позже (иÑпользуетÑÑ 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">ПожалуйÑта, проверьте черновик вашей транзакции. Будет Ñоздана чаÑтично подпиÑÐ°Ð½Ð½Ð°Ñ Ð±Ð¸Ñ‚ÐºÐ¾Ð¸Ð½-Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ (PSBT), которую можно Ñохранить или Ñкопировать, поÑле чего подпиÑать, например, офлайновым кошельком %1 или PSBT-ÑовмеÑтимым аппаратным кошельком.</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>
- </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>
- </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">Ðе иÑпользуетÑÑ Replace-By-Fee, 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>
- <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>
- <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>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1из кошелька '%2'</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Подтверждение ожидаетÑÑ Ñ‡ÐµÑ€ÐµÐ· %n блок.</numerusform>
- <numerusform>Подтверждение ожидаетÑÑ Ñ‡ÐµÑ€ÐµÐ· %n блока.</numerusform>
- <numerusform>Подтверждение ожидаетÑÑ Ñ‡ÐµÑ€ÐµÐ· %n блоков.</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</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">Внимание: неверный биткоин-адреÑ</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;Сумма:</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">&amp;Отправить на:</translation>
- </message>
- <message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Метка:</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;ычеÑÑ‚ÑŒ комиÑÑию из Ñуммы</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">Сообщение, которое было прикреплено к URI. Оно будет Ñохранено вмеÑте Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÐµÐ¹ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ удобÑтва. Обратите внимание: Ñто Ñообщение не будет отправлено в Ñеть Bitcoin.</translation>
- </message>
-</context>
-<context>
- <name>SendConfirmationDialog</name>
- <message>
- <source>Send</source>
- <translation type="unfinished">Отправить</translation>
- </message>
- <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;ПодпиÑать Ñообщение</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>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Ð’Ñ‹ можете подпиÑывать ÑообщениÑ/ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ñвоими уÑтаревшими (P2PKH) адреÑами, чтобы доказать, что вы можете получать биткоины на них. Будьте оÑторожны и не подпиÑывайте непонÑтные или Ñлучайные ÑообщениÑ, так как мошенники могут таким образом пытатьÑÑ Ð¿Ñ€Ð¸Ñвоить вашу личноÑÑ‚ÑŒ. ПодпиÑывайте только такие ÑообщениÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы ÑоглаÑны вплоть до мелочей.</translation>
</message>
<message>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished">Введите здеÑÑŒ Ñообщение, которое вы хотите подпиÑать</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">Введенный Ð°Ð´Ñ€ÐµÑ Ð½Ðµ отноÑитÑÑ Ðº уÑтаревшему (P2PKH) ключу. ПодпиÑывание Ñообщений Ð´Ð»Ñ SegWit и других не--P2PKH типов адреÑов не поддерживаетÑÑ Ð² Ñтой верÑии %1. ПожалуйÑта, проверьте Ð°Ð´Ñ€ÐµÑ Ð¸ попробуйте ещё раз.</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;Ñообщение</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;вÑÑ‘</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">П&amp;роверить Ñообщение</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;Ñообщение</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>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(нажмите q, чтобы завершить работу и продолжить позже)</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">нажмите q Ð´Ð»Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ</translation>
- </message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
- <message>
- <source>kB/s</source>
- <translation type="unfinished">кБ/Ñ</translation>
- </message>
-</context>
+ </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>
- <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>
- </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>
- </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>
- <numerusform>Ñозреет через %n блока</numerusform>
- <numerusform>Ñозреет через %n блоков</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</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">Идентификатор транзакции</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>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>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Сертификат не был подтверждён)</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>
<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">ПодтверждаетÑÑ (%1 из %2 рекомендуемых подтверждений)</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>
- <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>
<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>
- <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 transaction &amp;ID</source>
- <translation type="unfinished">Копировать ID &amp;транзакции</translation>
- </message>
- <message>
- <source>Copy &amp;raw transaction</source>
- <translation type="unfinished">Копировать &amp;иÑходный код транзакции</translation>
- </message>
- <message>
- <source>Copy full transaction &amp;details</source>
- <translation type="unfinished">Копировать &amp;вÑе подробноÑти транзакции</translation>
- </message>
- <message>
- <source>&amp;Show transaction details</source>
- <translation type="unfinished">&amp;Показать подробноÑти транзакции</translation>
- </message>
- <message>
- <source>Increase transaction &amp;fee</source>
- <translation type="unfinished">Увеличить комиÑÑию</translation>
- </message>
- <message>
- <source>A&amp;bandon transaction</source>
- <translation type="unfinished">&amp;Отказ от транзакции</translation>
- </message>
- <message>
- <source>&amp;Edit address label</source>
- <translation type="unfinished">&amp;Изменить метку адреÑа</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>
@@ -4068,9 +2125,8 @@ 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>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">PSBT Ñкопирована в буфер обмена.</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -4081,12 +2137,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>
+ <source>Signer error</source>
+ <translation type="unfinished">Ошибка подпиÑи</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">кошелёк по умолчанию</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ отобразить адреÑ</translation>
</message>
</context>
<context>
@@ -4110,7 +2166,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>
@@ -4220,10 +2276,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4288,10 +2340,6 @@ 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>
@@ -4301,7 +2349,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
+ <translation type="unfinished">Кошелёк уÑпешно Ñоздан. Старый формат кошелька признан уÑтаревшим. Поддержка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ° в Ñтом формате и его открытие в будущем будут удалены.</translation>
</message>
<message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
@@ -4332,10 +2380,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool должен быть минимум %d МБ</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>
@@ -4349,7 +2393,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ запиÑÑŒ в каталог данных "%s"; проверьте разрешениÑ.</translation>
+ <translation type="unfinished">Ðе удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ запиÑÑŒ в каталог данных '%s'; проверьте разрешениÑ.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -4388,10 +2432,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4570,10 +2610,6 @@ Unable to restore backup of wallet.</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>
@@ -4622,372 +2658,20 @@ Unable to restore backup of wallet.</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>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>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>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ отключить блок</translation>
</message>
<message>
- <source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">ÐедоÑтаточное значение dbcache Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ блока</translation>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ прочитать блок</translation>
</message>
<message>
- <source>Insufficient funds</source>
- <translation type="unfinished">ÐедоÑтаточно ÑредÑтв</translation>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ запиÑать блок</translation>
</message>
<message>
- <source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ Ñ…Ð¾Ñта в -i2psam: "%s"</translation>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Ðе удалоÑÑŒ Ñоздать кошелёк 1%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>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s'</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>
- <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>
- <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>
- </message>
- <message>
- <source>Missing solving data for estimating transaction size</source>
- <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>
- </message>
- <message>
- <source>Not enough file descriptors available.</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>
- <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">Кошелёк будет ÑтаратьÑÑ Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚ÑŒ не меньше минимальной комиÑÑии Ð´Ð»Ñ Ñ€ÐµÑ‚Ñ€Ð°Ð½ÑлÑции.</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 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>
- </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" МиБ</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">Ðевозможно привÑзатьÑÑ (bind) к %s на Ñтом компьютере (ошибка %s)</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer. %s is probably already running.</source>
- <translation type="unfinished">Ðевозможно привÑзатьÑÑ (bind) к %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">Ошибка при разборе параметра -maxuploadtarget: "%s"</translation>
- </message>
- <message>
- <source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">Ðевозможно запуÑтить HTTP-Ñервер. ПодробноÑти в файле debug.log.</translation>
- </message>
- <message>
- <source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Ðе удалоÑÑŒ выгрузить кошелёк перед миграцией</translation>
- </message>
- <message>
- <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>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>User Agent comment (%s) contains unsafe characters.</source>
- <translation type="unfinished">Комментарий User Agent (%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>
- <translation type="unfinished">Файл наÑтроек не может быть прочитан</translation>
- </message>
- <message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">Файл наÑтроек не может быть запиÑан</translation>
- </message>
-</context>
+ </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 5206b23486..cc6b40c945 100644
--- a/src/qt/locale/bitcoin_si.ts
+++ b/src/qt/locale/bitcoin_si.ts
@@ -294,7 +294,11 @@
<numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">පෙරනිමි පසුම්බිය</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -368,7 +372,7 @@
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;පසුම්බිය උපස්ථය…</translation>
+ <translation type="unfinished">&amp;පසුම්බිය උපස්ථකරන්න…</translation>
</message>
<message>
<source>Close Wallet…</source>
@@ -396,7 +400,7 @@
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">(%1%) à·à·Šâ€à¶»à·“ර්ෂ සමමුහූර්ත වෙමින්…</translation>
+ <translation type="unfinished">(%1%) à·à·“ර්ෂ සමමුහූර්ත වෙමින්…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -422,6 +426,10 @@
<translation type="unfinished">තොරතුර</translation>
</message>
<message>
+ <source>Up to date</source>
+ <translation type="unfinished">යà·à·€à¶­à·Šà¶šà·à¶½à·“නයි</translation>
+ </message>
+ <message>
<source>&amp;Sending addresses</source>
<translation type="unfinished">&amp;යවන ලිපින</translation>
</message>
@@ -431,11 +439,11 @@
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">පසුම්බිය බලන්න</translation>
+ <translation type="unfinished">පසුම්බිය විවෘත කරන්න</translation>
</message>
<message>
<source>Open a wallet</source>
- <translation type="unfinished">පසුම්බියක් බලන්න</translation>
+ <translation type="unfinished">පසුම්බියක් විවෘත කරන්න</translation>
</message>
<message>
<source>Close wallet</source>
@@ -451,10 +459,6 @@
<translation type="unfinished">සියළු පසුම්බි වසන්න</translation>
</message>
<message>
- <source>default 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>
@@ -631,10 +635,6 @@
<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>
@@ -1231,11 +1231,7 @@
<source>Send Coins</source>
<translation type="unfinished">කà·à·ƒà·’ යවන්න</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">පෙරනිමි පසුම්බිය</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts
index d0e8b11fe8..855bfd371d 100644
--- a/src/qt/locale/bitcoin_sk.ts
+++ b/src/qt/locale/bitcoin_sk.ts
@@ -167,6 +167,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Zadajte starú a novú frázu pre túto peňaženku.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">PokraÄovaÅ¥</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">Pamätajte, že zaÅ¡ifrovanie peňaženky neochráni úplne vaÅ¡e bitcoiny pred ukradnutím Å¡kodlivými programami vo vaÅ¡om poÄítaÄi.</translation>
</message>
@@ -387,7 +391,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n rokov</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">predvolená peňaženka</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -637,7 +645,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Okno uzlov</translation>
+ <translation type="unfinished">Uzlové okno</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
@@ -694,10 +702,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Skryť hodnoty v karte "Prehľad"</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">predvolená peňaženka</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Nie je dostupná žiadna peňaženka</translation>
</message>
@@ -1050,10 +1054,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Varovanie otvárania peňaženky</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">predvolená peňaženka</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Otvoriť peňaženku</translation>
@@ -2253,7 +2253,7 @@ Ak ste dostali túto chybu mali by ste požiadaÅ¥ obchodníka o URI kompatibilnÃ
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">Okno uzlov</translation>
+ <translation type="unfinished">Uzlové okno</translation>
</message>
<message>
<source>Current block height</source>
@@ -2461,6 +2461,10 @@ Ak ste dostali túto chybu mali by ste požiadaÅ¥ obchodníka o URI kompatibilnÃ
<translation type="unfinished">Sieťová aktivita zakázaná</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Žiadne</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Príkaz sa vykonáva bez peňaženky</translation>
</message>
@@ -3146,10 +3150,6 @@ Poznámka: KeÄže poplatok je poÄítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">&amp;Podpísať Správu</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">Môžete podpísaÅ¥ správy svojou adresou a dokázaÅ¥, že viete prijímaÅ¥ mince zaslané na túto adresu. BuÄte vÅ¡ak opatrní a podpíšte len podrobné prehlásenia, s ktorými plne súhlasíte, nakoľko útoky typu "phishing" Vás môžu lákaÅ¥ k podpísaniu nejasných alebo príliÅ¡ vÅ¡eobecných tvrdení Äím prevezmú vaÅ¡u identitu.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin adresa pre podpísanie správy s</translation>
</message>
@@ -3234,10 +3234,6 @@ Poznámka: KeÄže poplatok je poÄítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Prosím skontrolujte adresu a skúste znova.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Vložená adresa nezodpovedá žiadnemu kľúÄu.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Odomknutie peňaženky bolo zrušené.</translation>
</message>
@@ -3801,10 +3797,6 @@ ChoÄte do Súbor &gt; OtvoriÅ¥ Peňaženku, pre naÄítanie peňaženky.
<source>Can't display address</source>
<translation type="unfinished">Nemôžem zobraziť adresu</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">predvolená peňaženka</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3925,10 +3917,6 @@ ChoÄte do Súbor &gt; OtvoriÅ¥ Peňaženku, pre naÄítanie peňaženky.
<translation type="unfinished">Nezadaný formát súboru peňaženky. Pre použitie createfromdump musíte zadať -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">Prosím skontrolujte systémový Äas a dátum. KeÄ je váš Äas nesprávny, %s nebude fungovaÅ¥ správne.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">KeÄ si myslíte, že %s je užitoÄný, podporte nás. Pre viac informácií o software navÅ¡tívte %s.</translation>
</message>
@@ -4021,10 +4009,6 @@ ChoÄte do Súbor &gt; OtvoriÅ¥ Peňaženku, pre naÄítanie peňaženky.
<translation type="unfinished">-maxmempool musí byť najmenej %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Nastala fatálna interná chyba, pre viac informácií pozrite debug.log</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Nedá preložiť -%s adresu: '%s'</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sl.ts b/src/qt/locale/bitcoin_sl.ts
index ceae34b731..5dea2adaaa 100644
--- a/src/qt/locale/bitcoin_sl.ts
+++ b/src/qt/locale/bitcoin_sl.ts
@@ -176,6 +176,10 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Vnesite staro geslo in novo geslo za denarnico.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nadaljuj</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">Pomnite, da Å¡ifriranje denarnice ne more prepreÄiti morebitnim virusom na vaÅ¡em raÄunalniku, da bi ukradli vaÅ¡e bitcoine.</translation>
</message>
@@ -271,8 +275,7 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</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">Želite ponastaviti nastavitve na privzete vrednosti ali prekiniti urejanje brez sprememb?
-</translation>
+ <translation type="unfinished">Želite ponastaviti nastavitve na privzete vrednosti ali prekiniti urejanje brez sprememb?</translation>
</message>
<message>
<source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
@@ -400,7 +403,11 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<numerusform>%n let</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">privzeta denarnica</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -529,65 +536,73 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">&amp;Naloži DPBT iz datoteke...</translation>
</message>
<message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">Povezujem se s soležniki...</translation>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Odpri &amp;URI...</translation>
</message>
<message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Zahtevajte plaÄilo (ustvarite zahtevek s QR-kodo in URI tipa bitcoin:)</translation>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Zapri denarnico...</translation>
</message>
<message>
- <source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Prikaži seznam naslovov in oznak, na katere ste kdaj poslali plaÄila</translation>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Ustvari denarnico...</translation>
</message>
<message>
- <source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Prikaži seznam naslovov in oznak, na katere ste kdaj prejeli plaÄila</translation>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Zapri vse denarnice...</translation>
</message>
<message>
- <source>&amp;Command-line options</source>
- <translation type="unfinished">Možnosti &amp;ukazne vrstice</translation>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Datoteka</translation>
</message>
- <message numerus="yes">
- <source>Processed %n block(s) of transaction history.</source>
- <translation type="unfinished">
- <numerusform>Obdelan %n blok zgodovine transakcij.</numerusform>
- <numerusform>Obdelana %n bloka zgodovine transakcij.</numerusform>
- <numerusform>Obdelani %n bloki zgodovine transakcij.</numerusform>
- <numerusform>Obdelanih %n blokov zgodovine transakcij.</numerusform>
- </translation>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Nastavitve</translation>
</message>
<message>
- <source>%1 behind</source>
- <translation type="unfinished">%1 zaostanka</translation>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;PomoÄ</translation>
</message>
<message>
- <source>Catching up…</source>
- <translation type="unfinished">Dohitevam...</translation>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Orodna vrstica zavihkov</translation>
</message>
<message>
- <source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Zadnji prejeti blok je star %1.</translation>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Sinhroniziram zaglavja (%1%)...</translation>
</message>
<message>
- <source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Novejše transakcije še ne bodo vidne.</translation>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Dohitevam omrežje ...</translation>
</message>
<message>
- <source>Error</source>
- <translation type="unfinished">Napaka</translation>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Izdelujem kazalo blokov na disku...</translation>
</message>
<message>
- <source>Warning</source>
- <translation type="unfinished">Opozorilo</translation>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Procesiram bloke na disku...</translation>
</message>
<message>
- <source>Information</source>
- <translation type="unfinished">Informacije</translation>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Povezujem se s soležniki…</translation>
</message>
<message>
- <source>Up to date</source>
- <translation type="unfinished">Ažurno</translation>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp;Možnosti iz ukazne vrstice</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform>Obdelan %n blok zgodovine transakcij.</numerusform>
+ <numerusform>Obdelana %n bloka zgodovine transakcij.</numerusform>
+ <numerusform>Obdelani %n bloki zgodovine transakcij.</numerusform>
+ <numerusform>Obdelanih %n blokov zgodovine transakcij.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Naloži delno podpisano bitcoin-transakcijo</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -656,10 +671,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Zamaskiraj vrednosti v zavihku Pregled</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">privzeta denarnica</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Ni denarnic na voljo</translation>
</message>
@@ -688,6 +699,18 @@ 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>
@@ -730,6 +753,10 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Predsinhronizacija zaglavij (%1 %)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Napaka pri ustvarjanju denarnice</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Napaka: %1</translation>
</message>
@@ -928,6 +955,10 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Kopiraj vraÄilo</translation>
</message>
<message>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1 zaklenjeno)</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>
@@ -997,10 +1028,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Opozorilo pri odpiranju denarnice</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">privzeta denarnica</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Odpri denarnico</translation>
@@ -2469,6 +2496,10 @@ Svetujemo, da prodajalca prosite, naj vam priskrbi URI na podlagi BIP21.</transl
<translation type="unfinished">Omrežna aktivnost onemogoÄena.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Jih ni</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Izvajam ukaz brez denarnice</translation>
</message>
@@ -3185,10 +3216,6 @@ Opomba: Ker se provizija izraÄuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">&amp;PodpiÅ¡i sporoÄilo</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">S svojimi naslovi lahko podpisujete sporoÄila ali dogovore in s tem dokazujete, da na teh naslovih lahko prejemate kovance. Bodite previdni in ne podpisujte niÄesar nejasnega ali nakljuÄnega, ker vas zlikovci preko ribarjenja (phishing) lahko prelisiÄijo, da na njih prepiÅ¡ete svojo identiteto. Podpisujte samo podrobno opisane izjave, s katerimi se strinjate.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-naslov, s katerim podpisujete sporoÄilo</translation>
</message>
@@ -3273,10 +3300,6 @@ Opomba: Ker se provizija izraÄuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Prosimo, preverite naslov in poskusite znova.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">VneÅ¡eni naslov se ne nanaÅ¡a na kljuÄ.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Odklepanje denarnice je bilo preklicano.</translation>
</message>
@@ -3844,11 +3867,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">DPBT kopirana</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Kopirano na odložiÅ¡Äe</translation>
- </message>
- <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Ne morem podpisati transakcije.</translation>
</message>
@@ -3860,10 +3878,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<source>Can't display address</source>
<translation type="unfinished">Ne morem prikazati naslova</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">privzeta denarnica</translation>
- </message>
</context>
<context>
<name>WalletView</name>
@@ -3984,10 +3998,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">Potrebno je doloÄiti obliko izvozne (dump) datoteke. Z ukazom createfromdump morate uporabiti možnost -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">Opozorilo: Preverite, Äe sta datum in ura na vaÅ¡em raÄunalniku toÄna! %s ne bo deloval pravilno, Äe je nastavljeni Äas nepravilen.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Prosimo, prispevajte, Äe se vam zdi %s uporaben. Za dodatne informacije o programski opremi obiÅ¡Äite %s.</translation>
</message>
@@ -4084,10 +4094,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">-maxmempool mora biti vsaj %d MB</translation>
</message>
<message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Prišlo je do usodne notranje napake. Za podrobnosti glejte datoteko debug.log.</translation>
- </message>
- <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">Naslova -%s ni mogoÄe razreÅ¡iti: '%s'</translation>
</message>
@@ -4100,6 +4106,10 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">Nastavitev -peerblockfilters ni veljavna brez nastavitve -blockfilterindex.</translation>
</message>
<message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">Nimam dostopa za pisanje v podatkovni mapi '%s'; preveri dovoljenja.</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>
@@ -4212,6 +4222,10 @@ Obnovitev varnostne kopije denarnice ni bila mogoÄa.</translation>
<translation type="unfinished">Napaka pri odpiranju podatkovne baze blokov</translation>
</message>
<message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Napaka pri branju nastavitvene datoteke: %s</translation>
+ </message>
+ <message>
<source>Error reading from database, shutting down.</source>
<translation type="unfinished">Napaka pri branju iz podarkovne baze, zapiram.</translation>
</message>
@@ -4508,10 +4522,6 @@ Obnovitev varnostne kopije denarnice ni bila mogoÄa.</translation>
<translation type="unfinished">Transkacija je prevelika</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Spodletelo je dodeljevanje pomnilnika za -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Na tem raÄunalniku ni bilo mogoÄe vezati naslova %s (vrnjena napaka: %s)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sn.ts b/src/qt/locale/bitcoin_sn.ts
index bfdb6c951b..634e27c1a1 100644
--- a/src/qt/locale/bitcoin_sn.ts
+++ b/src/qt/locale/bitcoin_sn.ts
@@ -247,6 +247,10 @@
<source>N/A</source>
<translation type="unfinished">Hapana</translation>
</message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">Hapana</translation>
+ </message>
</context>
<context>
<name>RecentRequestsTableModel</name>
diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts
index 5646cf7938..b366aa3b9c 100644
--- a/src/qt/locale/bitcoin_sr.ts
+++ b/src/qt/locale/bitcoin_sr.ts
@@ -184,6 +184,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">УнеÑи Ñтару лозинку и нову лозинку новчаника.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nastavi</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>
@@ -224,6 +228,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">ПриÑтупна фраза унета за дешифровање новчаника је нетачна. Садржи нулти карактер (тј. - нулти бајт). Ðко је приÑтупна фраза поÑтављена Ñа верзијом овог Ñофтвера Ñтаријом од 25.0, покушајте поново Ñамо Ñа знаковима до — али не укључујући — првог нултог знака. Ðко је ово уÑпешно, поÑтавите нову приÑтупну фразу да биÑте избегли овај проблем у будућноÑти.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Лозинка новчаника уÑпешно је промењена.</translation>
</message>
@@ -232,6 +240,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Promena lozinke nije uspela</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">Упозорање Caps Lock дугме укључено!</translation>
</message>
@@ -250,6 +262,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>
@@ -401,7 +417,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished">%1 килобајта</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">подразумевани новчаник</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -638,6 +658,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Учитај делимично потпиÑану Bitcoin транÑакцију</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">Учитај делимично потпиÑану Bitcoin транÑакцију из clipboard-a</translation>
</message>
@@ -703,10 +727,6 @@ 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>No wallets available</source>
<translation type="unfinished">Ðема доÑтупних новчаника</translation>
</message>
@@ -716,6 +736,11 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -1040,10 +1065,6 @@ 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>
@@ -2359,6 +2380,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ÐктивноÑÑ‚ мреже онемогућена</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nijedan</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Извршење команде без новчаника</translation>
</message>
@@ -3030,8 +3055,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>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>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">&amp;Потпиши поруку</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3118,10 +3143,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>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>
@@ -3179,6 +3200,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>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>
@@ -3658,11 +3684,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Could not commit transaction</source>
<translation type="unfinished">ТранÑакција није могућа</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3718,10 +3740,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>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>
diff --git a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
index a10aa71c10..b4c3906a17 100644
--- a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
+++ b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
@@ -184,6 +184,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">УнеÑи Ñтару лозинку и нову лозинку новчаника.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nastavi</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>
@@ -224,6 +228,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">ПриÑтупна фраза унета за дешифровање новчаника је нетачна. Садржи нулти карактер (тј. - нулти бајт). Ðко је приÑтупна фраза поÑтављена Ñа верзијом овог Ñофтвера Ñтаријом од 25.0, покушајте поново Ñамо Ñа знаковима до — али не укључујући — првог нултог знака. Ðко је ово уÑпешно, поÑтавите нову приÑтупну фразу да биÑте избегли овај проблем у будућноÑти.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Pristupna fraza novÄanika je uspeÅ¡no promenjena.</translation>
</message>
@@ -232,6 +240,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Promena lozinke nije uspela</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">Upozorenje: Caps Lock je ukljuÄen!</translation>
</message>
@@ -246,6 +258,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>
@@ -397,7 +413,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished">%1 килобајта</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">подразумевани новчаник</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -487,7 +507,7 @@ 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;Opcije…</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
@@ -615,11 +635,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Грешка</translation>
+ <translation type="unfinished">Greska</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Упозорење</translation>
+ <translation type="unfinished">Upozorenje</translation>
</message>
<message>
<source>Information</source>
@@ -634,6 +654,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Учитај делимично потпиÑану Bitcoin транÑакцију</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">Учитај делимично потпиÑану Bitcoin транÑакцију из clipboard-a</translation>
</message>
@@ -699,10 +723,6 @@ 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>No wallets available</source>
<translation type="unfinished">Ðема доÑтупних новчаника</translation>
</message>
@@ -712,6 +732,11 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -1036,10 +1061,6 @@ 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">Otvori novÄanik</translation>
@@ -2355,6 +2376,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ÐктивноÑÑ‚ мреже онемогућена</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nijedan</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Извршење команде без новчаника</translation>
</message>
@@ -3026,8 +3051,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>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>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">&amp;Потпиши поруку</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3114,10 +3139,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>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>
@@ -3175,6 +3196,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>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>
@@ -3654,11 +3680,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Could not commit transaction</source>
<translation type="unfinished">ТранÑакција није могућа</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3714,10 +3736,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>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>
diff --git a/src/qt/locale/bitcoin_sr@latin.ts b/src/qt/locale/bitcoin_sr@latin.ts
index c7b80f3b02..395752767d 100644
--- a/src/qt/locale/bitcoin_sr@latin.ts
+++ b/src/qt/locale/bitcoin_sr@latin.ts
@@ -184,6 +184,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Unesite u novÄanik staru lozinku i novu lozinku.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Nastavi</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>
@@ -224,6 +228,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Pristupna fraza za dekriptovanje novÄanika nije taÄna.</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">Pristupna fraza novÄanika je uspeÅ¡no promenjena.</translation>
</message>
@@ -232,6 +240,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Promena lozinke nije uspela</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">Upozorenje: Caps Lock je ukljuÄen!</translation>
</message>
@@ -246,6 +258,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>
@@ -397,7 +413,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 kB</source>
<translation type="unfinished">%1 килобајта</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">подразумевани новчаник</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -487,7 +507,7 @@ 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;Opcije…</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
@@ -634,6 +654,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Учитај делимично потпиÑану Bitcoin транÑакцију</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">Учитај делимично потпиÑану Bitcoin транÑакцију из clipboard-a</translation>
</message>
@@ -699,10 +723,6 @@ 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>No wallets available</source>
<translation type="unfinished">Ðема доÑтупних новчаника</translation>
</message>
@@ -712,6 +732,11 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -1036,10 +1061,6 @@ 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">Otvori novÄanik</translation>
@@ -2351,6 +2372,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ÐктивноÑÑ‚ мреже онемогућена</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Nijedan</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Извршење команде без новчаника</translation>
</message>
@@ -3022,8 +3047,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>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>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">&amp;Потпиши поруку</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -3110,10 +3135,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>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>
@@ -3171,6 +3192,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>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>
@@ -3650,11 +3676,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>Could not commit transaction</source>
<translation type="unfinished">ТранÑакција није могућа</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">подразумевани новчаник</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3710,10 +3732,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>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>
diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts
index 19903798dd..1bf74501cc 100644
--- a/src/qt/locale/bitcoin_sv.ts
+++ b/src/qt/locale/bitcoin_sv.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Högerklicka för att redigera adressen eller etiketten.</translation>
+ <translation type="unfinished">Adresi veya etiketi düzenlemek için sağ tıklayın.</translation>
</message>
<message>
<source>Create a new address</source>
@@ -26,10 +26,6 @@
<translation type="unfinished">S&amp;täng</translation>
</message>
<message>
- <source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Ta bort den valda adressen från listan</translation>
- </message>
- <message>
<source>Enter address or label to search</source>
<translation type="unfinished">Ange en adress eller etikett att söka efter</translation>
</message>
@@ -50,10 +46,6 @@
<translation type="unfinished">Välj en adress att skicka transaktionen till</translation>
</message>
<message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">Välj en adress att ta emot transaktionen med</translation>
- </message>
- <message>
<source>C&amp;hoose</source>
<translation type="unfinished">V&amp;älj</translation>
</message>
@@ -62,11 +54,6 @@
<translation type="unfinished">Detta är dina Bitcoin-adresser för att skicka betalningar. Kontrollera alltid belopp och mottagaradress innan du skickar 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">Detta är dina Bitcoinadresser för att ta emot betalningar. Använd knappen 'Skapa ny mottagaradress' i mottagsfliken för att skapa nya adresser. Signering är bara tillgänglig för adresser av typen 'legacy'</translation>
- </message>
- <message>
<source>&amp;Copy Address</source>
<translation type="unfinished">&amp;Kopiera adress</translation>
</message>
@@ -94,10 +81,6 @@ 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>
@@ -184,6 +167,14 @@ Försök igen.</translation>
<translation type="unfinished">Ange den gamla lösenfrasen och den nya lösenfrasen för plånboken.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Fortsätt</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Tillbaka</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">Kom ihåg att kryptering av din plånbok inte helt kan skydda dig från stöld av dina bitcoins om skadlig kod infekterat din dator.</translation>
</message>
@@ -296,13 +287,17 @@ Försök igen.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 har inte avslutats korrekt ännu...</translation>
+ <translation type="unfinished">%1 har inte avslutats korrekt än...</translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished">okänd</translation>
</message>
<message>
+ <source>Custom…</source>
+ <translation type="unfinished">Anpassad...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Belopp</translation>
</message>
@@ -341,36 +336,36 @@ Försök igen.</translation>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <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 />
- <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 />
- <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 />
- <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 />
- <numerusform />
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
</translation>
</message>
<message>
@@ -380,11 +375,15 @@ Försök igen.</translation>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standardplånbok</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -558,7 +557,7 @@ Försök igen.</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Processar block på disken…</translation>
+ <translation type="unfinished">Behandlar block på disken…</translation>
</message>
<message>
<source>Connecting to peers…</source>
@@ -694,10 +693,6 @@ Försök igen.</translation>
<translation type="unfinished">Dölj värden i översiktsfliken</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standardplånbok</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Inga plånböcker tillgängliga</translation>
</message>
@@ -739,7 +734,7 @@ Försök igen.</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">&amp;Dölj</translation>
+ <translation type="unfinished">och göm</translation>
</message>
<message>
<source>S&amp;how</source>
@@ -1054,7 +1049,7 @@ Försök igen.</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>
+ <translation type="unfinished">Är du säker att du vill migrera plånboken &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.
@@ -1098,10 +1093,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Öppna plånboksvarning</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standardplånbok</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Öppna plånbok</translation>
@@ -1397,6 +1388,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Denna första synkronisering är väldigt krävande, och kan påvisa hårdvaruproblem hos din dator som tidigare inte visat sig. Varje gång du kör %1, kommer nerladdningen att fortsätta där den avslutades.</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">När du trycker OK kommer %1 att börja ladda ner och bearbeta den fullständiga %4-blockkedjan (%2 GB), med början vid de tidigaste transaktionerna %3 när %4 först startades.</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">Om du valt att begränsa storleken på blockkedjan (gallring), måste historiska data ändå laddas ner och behandlas, men kommer därefter att tas bort för att spara lagringsutrymme.</translation>
</message>
@@ -1481,7 +1476,15 @@ Om den här plånboken innehåller lösbara</translation>
<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>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Okänd. Synkar huvuden (%1, %2%)...</translation>
+ </message>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Okänd. För-synkar rubriker (%1, %2%)...</translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1513,6 +1516,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">&amp;Starta %1 vid systemlogin</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">Aktivering av ansning reducerar diskutrymmet som behövs för att lagra transaktioner. Alla block är fortfarande fullt validerade. Inaktivering av denna funktion betyder att hela blockkedjan måste laddas ner på nytt.</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation type="unfinished">Storleken på &amp;databascache</translation>
</message>
@@ -1521,6 +1528,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Antalet skript&amp;verifikationstrådar</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">Hela sökvägen till ett %1 kompatibelt script (t,ex. C:\Downloads\hwi.exe eller /Users/du/Downloads/hwi.py). Varning: Skadlig programvara kan stjäla dina mynt!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Proxyns IP-adress (t.ex. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1537,6 +1548,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Typsnitt på översiktsfliken:</translation>
</message>
<message>
+ <source>Options set in this dialog are overridden by the command line:</source>
+ <translation type="unfinished">Alternativ som anges i denna dialog åsidosätts av kommandoraden:</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>
@@ -1565,10 +1580,25 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Vid avstängning av denna inställning kommer den fullständiga blockkedjan behövas laddas ned igen.</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">Maximal storlek för databasens cacheminne. Större cache kan bidra till snabbare synkronisering, dock blir fördelen mindre uppenbar för de flesta användningsområdena efter den initiala synkroniseringen. En lägre storlek på databasens cacheminne minskar minnesanvändningen. Mempoolens outnyttjade minne delas med denna cache.</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">Sätt antalet trådar för skriptverifiering. Negativa värden motsvarar antalet kärnor som skall lämnas tillgängliga för systemet. </translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished">(0 = auto, &lt;0 = lämna så många kärnor lediga)</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">Detta tillåter dig eller ett tredjepartsverktyg att kommunicera med noden genom kommandotolken och JSON-RPC-kommandon. </translation>
+ </message>
+ <message>
<source>Enable R&amp;PC server</source>
<extracomment>An Options window setting to enable the RPC server.</extracomment>
<translation type="unfinished">Aktivera R&amp;PC-server</translation>
@@ -2207,6 +2237,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Riktning/Typ</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">BIP324 sessions ID-strängen i hex.</translation>
+ </message>
+ <message>
<source>Services</source>
<translation type="unfinished">Tjänster</translation>
</message>
@@ -2322,10 +2356,18 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Nätverksaktivitet inaktiverad</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Ingen</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Utför instruktion utan plånbok</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Nodfönster - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Utför instruktion med plånbok "%1"</translation>
</message>
@@ -2745,6 +2787,10 @@ Om den här plånboken innehåller lösbara</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>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 från plånbok '%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">Vill du skapa den här transaktionen?</translation>
@@ -2801,8 +2847,8 @@ Om den här plånboken innehåller lösbara</translation>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
<message>
@@ -2907,10 +2953,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">&amp;Signera meddelande</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">Du kan signera meddelanden/avtal med dina adresser för att bevisa att du kan ta emot bitcoin som skickats till dem. Var försiktig så du inte signerar något oklart eller konstigt, eftersom phishing-angrepp kan försöka få dig att signera över din identitet till dem. Signera endast väldetaljerade meddelanden som du godkänner.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation type="unfinished">Bitcoin-adress att signera meddelandet med</translation>
</message>
@@ -2995,10 +3037,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Kontrollera adressen och försök igen.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Den angivna adressen refererar inte till en nyckel.</translation>
- </message>
- <message>
<source>Wallet unlock was cancelled.</source>
<translation type="unfinished">Upplåsningen av plånboken avbröts.</translation>
</message>
@@ -3111,8 +3149,8 @@ Om den här plånboken innehåller lösbara</translation>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<message>
@@ -3509,6 +3547,10 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">PSBT kopierad</translation>
</message>
<message>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Avgifts-höjande PSBT kopierad till urklipp</translation>
+ </message>
+ <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">Kan ej signera transaktion.</translation>
</message>
@@ -3517,12 +3559,12 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">Kunde inte skicka transaktion</translation>
</message>
<message>
- <source>Can't display address</source>
- <translation type="unfinished">Kan inte visa adress</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">Signeringsfel</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">Standardplånbok</translation>
+ <source>Can't display address</source>
+ <translation type="unfinished">Kan inte visa adress</translation>
</message>
</context>
<context>
@@ -3588,10 +3630,6 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">Fler än en onion-adress finns tillgänglig. Den automatiskt skapade Tor-tjänsten kommer använda %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">Kontrollera att din dators datum och tid är korrekt! Om klockan går fel kommer %s inte att fungera korrekt.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">Var snäll och bidra om du finner %s användbar. Besök %s för mer information om mjukvaran.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sw.ts b/src/qt/locale/bitcoin_sw.ts
index 499eb68538..0497444d5e 100644
--- a/src/qt/locale/bitcoin_sw.ts
+++ b/src/qt/locale/bitcoin_sw.ts
@@ -243,6 +243,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Faili ya mipangilio ya asilimia %1 inaweza kuwa mbovu au batili.</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">Ubaguzi wa kukimbia</translation>
</message>
@@ -321,7 +325,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">mkoba chaguo-msingi</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -357,6 +365,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Kuhusu &amp;Qt</translation>
</message>
<message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">Onyesha habari kuhusu Qt</translation>
+ </message>
+ <message>
<source>Modify configuration options for %1</source>
<translation type="unfinished">Badilisha chaguo za usanidi kwa %1</translation>
</message>
@@ -379,7 +391,7 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">Proxy imeamilishwa: %1</translation>
+ <translation type="unfinished">Proxy &lt;b&gt;imeamilishwa&lt;/b&gt;: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -398,14 +410,27 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">&amp;TUMA</translation>
</message>
<message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">&amp;Pokea</translation>
+ </message>
+ <message>
<source>&amp;Options…</source>
<translation type="unfinished">&amp;Chaguo...</translation>
</message>
<message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Simba Mkoba...</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;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Hifadhi Mkoba...
+</translation>
+ </message>
+ <message>
<source>&amp;Change Passphrase…</source>
<translation type="unfinished">&amp;Badilisha Nenosiri...</translation>
</message>
@@ -418,10 +443,18 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Saini ujumbe na anwani zako za Bitcoin ili kuthibitisha umiliki wao.</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Thibitisha ujumbe...</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>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Pakia PSBT kutoka faili...</translation>
+ </message>
+ <message>
<source>Open &amp;URI…</source>
<translation type="unfinished">Fungua &amp;URI ...</translation>
</message>
@@ -479,7 +512,7 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</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>
+ <translation type="unfinished">Onyesha orodha ya anuani za kutuma zilizotumika na chapa</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
@@ -497,10 +530,159 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</translation>
</message>
<message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1 nyuma</translation>
+ </message>
+ <message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Inakamata...</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">Shughuli baada ya hii bado hazitaonekana.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Kosa</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">Onyo</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">Habari</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">Imesasishwa</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Pakia Muamala wa Bitcoin Uliosainiwa Kiasi</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Pakia PSBT kutoka &amp;clipboard...</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">Pakia Muamala wa Bitcoin Uliosainiwa Kiasi kutoka kwenye ubao wa kunakili</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Dirisha la nodi</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Fungua utatuzi wa nodi na koni ya uchunguzi</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">&amp;Anwani za kutuma</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">&amp;Inapokea anwani</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">Fungua bitcoin: URI</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Fungua Pochi</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Fungua pochi</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Funga pochi</translation>
+ </message>
+ <message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Rejesha Pochi...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Rejesha mkoba kutoka kwa faili ya chelezo</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Funga pochi zote</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Hamisha Pochi</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Hamisha mkoba</translation>
+ </message>
+ <message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished">Onyesha %1 ujumbe wa usaidizi ili kupata orodha na chaguo zinazowezekana za mstari wa amri za Bitcoin</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">&amp;Funga maadili</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Ficha maadili kwenye kichupo cha Muhtasari</translation>
+ </message>
+ <message>
+ <source>No wallets available</source>
+ <translation type="unfinished">Hakuna pochi zinazopatikana</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Data ya Pochi</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Pakia Hifadhi Nakala ya Wallet</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">Rejesha Pochi</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>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Dirisha</translation>
+ </message>
+ <message>
+ <source>Zoom</source>
+ <translation type="unfinished">Kuza</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">Dirisha Kuu</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 mteja</translation>
+ </message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">&amp;Ficha</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">Jinsi &amp; jinsi</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -510,13 +692,98 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</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">Bofya kwa vitendo zaidi.</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">Onyesha kichupo cha Marika</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Zima shughuli za mtandao</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Washa shughuli za mtandao</translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Kusawazisha Vichwa vya awali (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Hitilafu unapounda pochi</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Haiwezi kuunda pochi mpya, programu iliundwa bila usaidizi wa sqlite (inahitajika kwa pochi za maelezo)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Kosa: %1</translation>
</message>
<message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Onyo: %1</translation>
+ </message>
+ <message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">Tarehe: %1</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation type="unfinished">Kiasi: %1
+</translation>
+ </message>
+ <message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">Pochi: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation type="unfinished">Aina: %1</translation>
+ </message>
+ <message>
<source>Label: %1
</source>
- <translation type="unfinished">Chapa: %1</translation>
+ <translation type="unfinished">Chapa: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation type="unfinished">Anwani: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">Umetuma muamala</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">Muamala unaoingia</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
+ <translation type="unfinished">Uzalishaji wa ufunguo wa HD ni &lt;b&gt;kuwezeshwa &lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Uzalishaji wa ufunguo wa HD ni &lt;b&gt;kutowezeshwa&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Ufunguo wa kibinafsi &lt;b&gt; umezimwa &lt;/b&gt;</translation>
</message>
</context>
<context>
@@ -526,6 +793,18 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Wingi</translation>
</message>
<message>
+ <source>Amount:</source>
+ <translation type="unfinished">Kiasi:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">Ada:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">Baada ya Ada</translation>
+ </message>
+ <message>
<source>Received with label</source>
<translation type="unfinished">Imepokelewa na chapa</translation>
</message>
@@ -539,8 +818,28 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Hamisha Pochi</translation>
+ </message>
+ </context>
+<context>
+ <name>OpenWalletActivity</name>
+ <message>
+ <source>Open Wallet</source>
+ <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
+ <translation type="unfinished">Fungua Pochi</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">Rejesha Pochi</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">Rejesha onyo la pochi</translation>
@@ -549,9 +848,17 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<context>
<name>WalletController</name>
<message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Funga Pochi</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">Kufunga pochi kwa muda mrefu sana kunaweza kusababisha kusawazisha tena mnyororo mzima ikiwa upogoaji umewezeshwa.</translation>
</message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Funga pochi zote</translation>
+ </message>
</context>
<context>
<name>CreateWalletDialog</name>
@@ -657,6 +964,21 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<numerusform />
</translation>
</message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Onyo</translation>
+ </message>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Dirisha</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Onyo</translation>
+ </message>
</context>
<context>
<name>PeerTableModel</name>
@@ -674,6 +996,13 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
</context>
<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Dirisha la nodi</translation>
+ </message>
+ </context>
+<context>
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Label:</source>
@@ -699,6 +1028,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<context>
<name>ReceiveRequestDialog</name>
<message>
+ <source>Amount:</source>
+ <translation type="unfinished">Kiasi:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">Chapa:</translation>
</message>
@@ -724,6 +1057,18 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>Quantity:</source>
<translation type="unfinished">Wingi</translation>
</message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Kiasi:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">Ada:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">Baada ya Ada</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -818,6 +1163,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>Create a new wallet</source>
<translation type="unfinished">Unda mkoba mpya</translation>
</message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Onyo</translation>
+ </message>
</context>
<context>
<name>WalletView</name>
@@ -829,6 +1178,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">Toa data katika kichupo cha sasa hadi kwenye faili</translation>
</message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Data ya Pochi</translation>
+ </message>
</context>
<context>
<name>bitcoin-core</name>
diff --git a/src/qt/locale/bitcoin_szl.ts b/src/qt/locale/bitcoin_szl.ts
index 81a33250ad..83ba8cb6fb 100644
--- a/src/qt/locale/bitcoin_szl.ts
+++ b/src/qt/locale/bitcoin_szl.ts
@@ -260,7 +260,11 @@
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">wychodny portmanyj</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -427,10 +431,6 @@
<translation type="unfinished">PokÅż pÅmoc %1 coby zobÅczyć wykÅz wszyjskich ôpcyji piski nakÅzaÅ„.</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">wychodny portmanyj</translation>
- </message>
- <message>
<source>&amp;Window</source>
<translation type="unfinished">Ô&amp;kno</translation>
</message>
@@ -622,13 +622,6 @@
</message>
</context>
<context>
- <name>OpenWalletActivity</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">wychodny portmanyj</translation>
- </message>
- </context>
-<context>
<name>CreateWalletDialog</name>
<message>
<source>Wallet</source>
@@ -1593,11 +1586,7 @@
<source>New fee:</source>
<translation type="unfinished">NowŠôpÅ‚Åcka:</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">wychodny portmanyj</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_ta.ts b/src/qt/locale/bitcoin_ta.ts
index 6255126438..797a07b778 100644
--- a/src/qt/locale/bitcoin_ta.ts
+++ b/src/qt/locale/bitcoin_ta.ts
@@ -342,7 +342,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ வாலடà¯</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -408,7 +412,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">பà¯à®°à®¾à®•à¯à®¸à®¿ இயகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯: %1</translation>
+ <translation type="unfinished">பà¯à®°à®¾à®•à¯à®¸à®¿ &lt;b&gt;இயகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯&lt;/b&gt;: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -575,10 +579,6 @@ 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>No wallets available</source>
<translation type="unfinished">வாலட௠எதà¯à®µà¯à®®à¯ இலà¯à®²à¯ˆ</translation>
</message>
@@ -665,23 +665,23 @@ 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 à®®à¯à®•à¯à®•à®¿à®¯ தலைமà¯à®±à¯ˆ இயகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</translation>
+ <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 à®®à¯à®•à¯à®•à®¿à®¯ தலைமà¯à®±à¯ˆ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯</translation>
+ <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">தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</translation>
+ <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">Wallet கà¯à®±à®¿à®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ தறà¯à®ªà¯‹à®¤à¯ திறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</translation>
+ <translation type="unfinished">Wallet &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">Wallet கà¯à®±à®¿à®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ தறà¯à®ªà¯‹à®¤à¯ பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯</translation>
+ <translation type="unfinished">Wallet &lt;b&gt;கà¯à®±à®¿à®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯&lt;/b&gt; தறà¯à®ªà¯‹à®¤à¯ &lt;b&gt;பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -833,10 +833,6 @@ 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>
@@ -1788,6 +1784,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">நெடà¯à®µà¯Šà®°à¯à®•à¯ செயலà¯à®ªà®¾à®Ÿà¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">யாரà¯à®®à¯</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">எநà¯à®¤ பணமà¯à®®à¯ இலà¯à®²à®¾à®®à®²à¯ கடà¯à®Ÿà®³à¯ˆà®¯à¯ˆ நிறைவேறà¯à®±à¯à®®à¯</translation>
</message>
@@ -1844,7 +1844,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">பணம௠செலà¯à®¤à¯à®¤ வேணà¯à®Ÿà¯à®®à¯†à®©à®¿à®²à¯ இநà¯à®¤ படிவதà¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯. அனைதà¯à®¤à¯ தà¯à®±à¯ˆà®•à®³à¯ விரà¯à®ªà¯à®ªà®®à®¾à®©à®µà¯ˆ.</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>
@@ -2157,6 +2157,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -2164,6 +2168,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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">
@@ -2265,10 +2273,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;செயà¯à®¤à®¿à®¯à¯ˆ கையொபà¯à®ªà®®à®¿à®Ÿà¯à®™à¯à®•à®³à¯</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>
@@ -2345,10 +2349,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -2552,7 +2552,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>This pane shows a detailed description of the transaction</source>
<translation type="unfinished">இநà¯à®¤ பலகம௠பரிவரà¯à®¤à¯à®¤à®©à¯ˆ பறà¯à®±à®¿à®¯ விரிவான விளகà¯à®•à®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•à®¿à®±à®¤à¯</translation>
</message>
- </context>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">%1 கà¯à®•à®¾à®© விவரஙà¯à®•à®³à¯</translation>
+ </message>
+</context>
<context>
<name>TransactionTableModel</name>
<message>
@@ -2580,10 +2584,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•à®¿à®±à®¤à¯ (%1 ன௠%2 பரிநà¯à®¤à¯à®°à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯à®•à®²à¯)</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>
@@ -2810,11 +2822,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Could not commit transaction</source>
<translation type="unfinished">பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®¯à¯ˆ கமிட௠செயà¯à®¯ à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ வாலடà¯</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2865,10 +2873,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">எமà¯à®à®Ÿà®¿ சாபà¯à®Ÿà¯à®µà¯‡à®°à¯ விதிமà¯à®±à¯ˆà®•à®³à®¿à®©à¯ கீழ௠பகிரà¯à®¨à¯à®¤à®³à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯, அதனà¯à®Ÿà®©à¯ கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³ %s அலà¯à®²à®¤à¯ %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>
- <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>
@@ -3009,6 +3013,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">-%s=&lt;amount&gt;: '%s' கான தவறான தொகை</translation>
</message>
<message>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation type="unfinished">-அனà¯à®®à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿ தவறான நெடà¯à®®à®¾à®¸à¯à®•à¯: '%s'</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation type="unfinished">போதà¯à®®à®¾à®© ஃபைல௠டிஸà¯à®•à®¿à®°à®¿à®ªà¯à®Ÿà®¾à®°à¯ கிடைகà¯à®•à®µà®¿à®²à¯à®²à¯ˆ.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_te.ts b/src/qt/locale/bitcoin_te.ts
index e30f9bebf5..28fabe2339 100644
--- a/src/qt/locale/bitcoin_te.ts
+++ b/src/qt/locale/bitcoin_te.ts
@@ -172,6 +172,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">వాలెటౠకోసం à°•à±à°°à±Šà°¤à±à°¤ పాసà±â€Œà°«à±à°°à±‡à°œà±â€Œà°¨à°¿ నమోదౠచేయండి.&lt;br/&gt; దయచేసి &lt;b&gt;పది లేదా అంతకంటే à°Žà°•à±à°•à±à°µ యాదృచà±à°›à°¿à°• à°…à°•à±à°·à°°à°¾à°²&lt;/b&gt; పాసà±â€Œà°«à±à°°à±‡à°œà±â€Œà°¨à°¿ లేదా &lt;b&gt;ఎనిమిది లేదా అంతకంటే à°Žà°•à±à°•à±à°µ పదాలనౠఉపయోగించండి.&lt;/b&gt;</translation>
</message>
<message>
+ <source>Continue</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>
@@ -379,7 +383,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n సంవతà±à°¸à°°à°‚(à°²à±)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">డిఫాలà±à°Ÿà± వాలెటà±</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -473,7 +481,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
@@ -578,8 +586,8 @@ 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>
+ <numerusform>లావాదేవీ %n à°šà°°à°¿à°¤à±à°° యొకà±à°• à°ªà±à°°à°¾à°¸à±†à°¸à± చేయబడిన à°¬à±à°²à°¾à°•à±(à°²à±).</numerusform>
+ <numerusform>లావాదేవీ %n à°šà°°à°¿à°¤à±à°° యొకà±à°• à°ªà±à°°à°¾à°¸à±†à°¸à± చేయబడిన à°¬à±à°²à°¾à°•à±(à°²à±).</numerusform>
</translation>
</message>
<message>
@@ -685,10 +693,6 @@ 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>No wallets available</source>
<translation type="unfinished">వాలెటà±à°²à± à°…à°‚à°¦à±à°¬à°¾à°Ÿà±à°²à±‹ లేవà±</translation>
</message>
@@ -734,7 +738,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">S&amp;ఎలా</translation>
+ <translation type="unfinished">&amp;చూపించà±</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -1040,10 +1044,6 @@ 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>
@@ -2136,6 +2136,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;కాపీ à°šà°¿à°°à±à°¨à°¾à°®à°¾</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">à°à°¦à±€ లేదà±</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">à°•à±</translation>
</message>
@@ -2494,13 +2498,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">డిఫాలà±à°Ÿà± వాలెటà±</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
@@ -2611,10 +2608,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">లావాదేవీ చాలా పెదà±à°¦à°¦à°¿</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">-maxsigcacheize కోసం మెమరీని కేటాయించడం సాధà±à°¯à°‚ కాలేదà±: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %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
new file mode 100644
index 0000000000..464e39cbac
--- /dev/null
+++ b/src/qt/locale/bitcoin_th.ts
@@ -0,0 +1,340 @@
+<TS version="2.1" language="th">
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">ย้อนà¸à¸¥à¸±à¸š</translation>
+ </message>
+ </context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 ยังไม่ออà¸à¸­à¸¢à¹ˆà¸²à¸‡à¸›à¸¥à¸­à¸”ภัย...</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>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">เปลี่ยนรหัสผ่านที่ใช้สำหรับà¸à¸²à¸£à¹€à¸‚้ารหัสà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¹€à¸‡à¸´à¸™</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">เข้ารหัสà¸à¸¸à¸à¹à¸ˆà¸ªà¹ˆà¸§à¸™à¸•à¸±à¸§à¸—ี่เป็นของà¸à¸£à¸°à¹€à¸›à¹‹à¸²à¸ªà¸•à¸²à¸‡à¸„์ของคุณ</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">เซ็นชื่อด้วยข้อความ ที่เà¸à¹‡à¸š Bitcoin เพื่อà¹à¸ªà¸”งว่าท่านเป็นเจ้าของ bitcoin นี้จริง</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;File</source>
+ <translation type="unfinished">&amp;ไฟล์</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <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>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>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp;ตัวเลือภCommand-line</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform>ประมวลผล %n บล็อà¸à¸‚องประวัติà¸à¸²à¸£à¸—ำธุรà¸à¸£à¸£à¸¡</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>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">โหลด PSBT จาà¸à¸„ลิปบอร์ด...</translation>
+ </message>
+ <message>
+ <source>Node window</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 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>&amp;Mask values</source>
+ <translation type="unfinished">&amp;ค่ามาสà¸à¹Œ</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</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>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>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(ไม่มีเลเบล)</translation>
+ </message>
+ <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>
+ </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>Intro</name>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <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>
+ </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 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>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">หน้าต่างโหนด</translation>
+ </message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(ไม่มีเลเบล)</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>
+ </translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(ไม่มีเลเบล)</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>
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>(no label)</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 0afd01fd71..7a0a69513f 100644
--- a/src/qt/locale/bitcoin_tk.ts
+++ b/src/qt/locale/bitcoin_tk.ts
@@ -176,6 +176,10 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gapjyk üçin öňki we täze parol sözlemiňi ýaz.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Dowam et</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">Gapjygyňy şifrlemek kompýuteriňe zyýanly programma ýokuşmak arkaly bitkoinleriň ogurlanmagyndan doly gorap bilmejekdigini ýatdan çykarma.</translation>
</message>
@@ -399,7 +403,11 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<numerusform>%n ýyl</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">deslapky bellenen gapjyk</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -636,7 +644,7 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Bölekleýýin gol çekilen bitkoin amalyny (BGÇBA) ýükle</translation>
+ <translation type="unfinished">Bölekleýýin gol çekilen bitkoin geleşigini ýükle</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -644,7 +652,7 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Bölekleýin gol çekilen bitkoin amalyny alyş-çalyş panelinden ýükle</translation>
+ <translation type="unfinished">Bölekleýin gol çekilen bitkoin geleşigini alyş-çalyş panelinden ýükle</translation>
</message>
<message>
<source>Node window</source>
@@ -705,10 +713,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gözden geçir bölüminde sanlaryň üstüni ört</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">deslapky bellenen gapjyk</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Elýeterli gapjyk ýok</translation>
</message>
@@ -1060,10 +1064,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gapjyk açmak duýduryşy</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">deslapky bellenen gapjyk</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Gapjygy aç</translation>
@@ -2326,6 +2326,10 @@ Size bu ýalňyşlyk gelýän bolsa, siz täjirden BIP21-e gabat gelýän URI-ni
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">&amp;Salgyny göçür</translation>
</message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">ýok</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -2582,13 +2586,6 @@ Size bu ýalňyşlyk gelýän bolsa, siz täjirden BIP21-e gabat gelýän URI-ni
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">deslapky bellenen gapjyk</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_tl.ts b/src/qt/locale/bitcoin_tl.ts
index aaa9d64ccd..b042fb8ea9 100644
--- a/src/qt/locale/bitcoin_tl.ts
+++ b/src/qt/locale/bitcoin_tl.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">pindutin lamang ang kanang pindutan 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>
@@ -23,7 +23,7 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">Isara</translation>
+ <translation type="unfinished">(Do you mean: Close?) :isara, sarado </translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -55,7 +55,7 @@
</message>
<message>
<source>C&amp;hoose</source>
- <translation type="unfinished">&amp;Pumili</translation>
+ <translation type="unfinished">(do you mean: CHOOSE?) ;Pumili,Piliin.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
@@ -319,7 +319,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">pitaka na ♦default♦</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -359,6 +363,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Patungkol sa &amp;♦Qt♦</translation>
</message>
<message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">Ipakita ang impormasyon tungkol sa Qt</translation>
+ </message>
+ <message>
<source>Modify configuration options for %1</source>
<translation type="unfinished">Baguhin ang mga pagpipilian sa ♦configuration♦ para sa 1%1</translation>
</message>
@@ -405,7 +413,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;I-encrypt ang pitaka</translation>
+ <translation type="unfinished">&amp;I-encrypt ang Pitaka</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -603,10 +611,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">I-mask ang mga halaga sa loob ng ♦Overview tab♦</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">pitaka na ♦default♦</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Walang pitaka na mayroon</translation>
</message>
@@ -914,10 +918,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Babala sa pagbukas ng pitaka</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">pitaka na ♦default♦</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Buksan ang pitaka</translation>
@@ -1444,13 +1444,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">pitaka na ♦default♦</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts
index ba3ecca680..569a7c27be 100644
--- a/src/qt/locale/bitcoin_tr.ts
+++ b/src/qt/locale/bitcoin_tr.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Adresi veya etiketi düzenlemek için sağ tıklayın</translation>
+ <translation type="unfinished">Sağ tık ile adres ve etiket düzenle</translation>
</message>
<message>
<source>Create a new address</source>
@@ -185,6 +185,14 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdanınızın eski ve yeni parolasını giriniz.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Devam</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation type="unfinished">Geri</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">Cüzdanınızı şifrelemenin bilgisayarınıza bulaşan kötü amaçlı yazılımlar tarafından bitcoinlerinizin çalınmasına karşı tamamen koruyamayacağını unutmayın.</translation>
</message>
@@ -225,6 +233,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdan parolasının kaldırılması için girilen parola yanlış.</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">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</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Cüzdan parolası başarılı bir şekilde değiştirildi</translation>
</message>
@@ -259,10 +271,18 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Sızıntı istisnası</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Önemli bir hata oluştu. %1 artık güvenli bir şekilde devam edemeyecek ve çıkacak.</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">İç hata</translation>
</message>
- </context>
+ <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">Bir iç hata oluştu. %1 güvenli bir şekilde devam etmeye çalışacak. Bu, aşağıda açıklandığı gibi rapor edilebilecek beklenmedik bir hatadır.</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -288,6 +308,18 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">bilinmeyen</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">YerleÅŸtir "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Varsayılan sistem fontu "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Özel…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Mitar</translation>
</message>
@@ -380,7 +412,11 @@ Cüzdan kilidini aç.</translation>
<numerusform>%n yıl</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">varsayılan cüzdan</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -661,6 +697,14 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Tüm cüzdanları kapat</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Cüzdanı Taşı</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Bir Cüzdanı Taşı</translation>
+ </message>
+ <message>
<source>&amp;Mask values</source>
<translation type="unfinished">&amp; DeÄŸerleri maskele</translation>
</message>
@@ -669,10 +713,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Genel Bakış sekmesindeki değerleri maskeleyin</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">varsayılan cüzdan</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Erişilebilir cüzdan yok</translation>
</message>
@@ -733,11 +773,6 @@ 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>
@@ -752,6 +787,14 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ãœstbilgiler senkronize ediliyor (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Cüzdan oluşturulurken hata meydana geldi</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Yeni cüzdan oluşturulamıyor, yazılım SQLite desteği olmadan derlenmiş (descriptor cüzdanlar için gereklidir).</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Hata: %1</translation>
</message>
@@ -805,11 +848,11 @@ Cüzdan kilidini aç.</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">HD anahtar üreticiler kullanilabilir</translation>
+ <translation type="unfinished">HD anahtar üreticiler &lt;b&gt;kullanilabilir&lt;/b&gt;</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">HD anahtar üreticiler kullanılamaz</translation>
+ <translation type="unfinished">HD anahtar üreticiler &lt;b&gt;kullanılamaz&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -817,11 +860,11 @@ Cüzdan kilidini aç.</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">Cüzdan &lt;b&gt;şifrelenmiş&lt;/b&gt; ve şu anda &lt;b&gt;kilitli değil</translation>
+ <translation type="unfinished">Cüzdan &lt;b&gt;şifrelenmiş&lt;/b&gt; ve şu anda &lt;b&gt;kilitli değil&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">Cüzdan &lt;b&gt;şifrelenmiş&lt;/b&gt; ve şu anda &lt;b&gt;kilitlidir</translation>
+ <translation type="unfinished">Cüzdan &lt;b&gt;şifrelenmiş&lt;/b&gt; ve şu anda &lt;b&gt;kilitlidir&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -979,10 +1022,6 @@ 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>
@@ -1001,6 +1040,57 @@ Cüzdan kilidini aç.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Cüzdanı taşı</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Cüzdanı taşımak istediğine emin misin &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">Cüzdanı taşımak, bu cüzdanı bir veya daha fazla descriptor cüzdana dönüştürecektir. Yeni bir cüzdan yedeği oluşturulması gerekecektir.
+Eğer bu cüzdan yalnızca izlenen scriptler içeriyorsa, bu scriptleri içeren yeni bir cüzdan oluşturulacaktır.
+Eğer bu cüzdan çözülebilir ama izlenmeyen scriptler içeriyorsa, bu scriptleri içeren farklı ve yeni bir cüzdan oluşturulacaktır.
+
+Taşıma işlemi, taşıma işleminden önce cüzdanın bir yedeğini oluşturacaktır. Bu yedek dosya &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak olarak adlandırılacak ve bu cüzdanın bulunduğu dizinde bulunacaktır. Yanlış bir taşıma durumunda, yedek "Cüzdanı Geri Yükle" işlevi ile geri yüklenebilir.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Cüzdanı Taşı</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Cüzdan Taşınıyor &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Cüzdan '%1' başarıyla taşındı.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Yalnızca izlenen scriptler yeni bir cüzdana taşındı, adı '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Çözülebilir ama izlenmeyen scriptler yeni bir cüzdana taşındı, adı '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Taşıma başarısız oldu</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Taşıma Başarılı</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1011,10 +1101,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Açık cüzdan uyarısı</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">varsayılan cüzdan</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Cüzdanı Aç</translation>
@@ -1083,6 +1169,14 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdan Oluştur</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Yeni cüzdanını yaratmaktan bir adım uzaktasın!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Lütfen bir isim sağla ve, isteğe bağlı olarak, gelişmiş seçenekleri etkinleştir.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Cüzdan İsmi</translation>
</message>
@@ -1409,6 +1503,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Pencere kapatıldığında uygulamadan çıkmak yerine uygulamayı küçültür. Bu seçenek etkinleştirildiğinde, uygulama sadece menüden çıkış seçildiğinde kapanacaktır.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Genel Bakış sekmesindeki yazı tipi:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Bu iletişim kutusundan ayarlanan seçenekler komut satırı tarafından geçersiz kılınır:</translation>
</message>
@@ -1812,6 +1910,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">PSBT diske kaydedildi.</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Gönderiler %1 ile %2</translation>
+ </message>
+ <message>
<source>own address</source>
<translation type="unfinished">kendi adresiniz</translation>
</message>
@@ -2056,10 +2158,18 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ayrıntılı bilgi görmek için bir eş seçin.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Taşıma katmanı versiyonu: %1</translation>
+ </message>
+ <message>
<source>Transport</source>
<translation type="unfinished">Aktar</translation>
</message>
<message>
+ <source>Session ID</source>
+ <translation type="unfinished">Oturum ID</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Sürüm</translation>
</message>
@@ -2146,6 +2256,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Yön/Tür</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">BIP324 oturum kimliği ID dizesi onaltılık ( hex ) biçimde</translation>
+ </message>
+ <message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<translation type="unfinished">Bu çiftin bağlı olduğu internet protokolü : IPv4, IPv6, Onion, I2P, ya da CJDNS.</translation>
</message>
@@ -2226,6 +2340,21 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Dışarı:</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">keÅŸfediliyor: eÅŸ v1 veya v2 olabilir</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: şifrelenmemiş, açık metin taşıma protokolü</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 şifrelenmiş taşıma protokolü</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">&amp;Adresi kopyala</translation>
@@ -2264,10 +2393,18 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ağ etkinliği devre dışı bırakıldı</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">BoÅŸ</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Komut cüzdan olmadan çalıştırılıyor.</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">BaÄŸlanan pencere - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Komut "%1" cüzdanı kullanılarak çalıştırılıyor.</translation>
</message>
@@ -2645,6 +2782,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">veya</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 Cüzdandan '%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">Bu iÅŸlemi oluÅŸturmak ister misiniz?</translation>
@@ -2664,6 +2805,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">İşlem ücreti</translation>
</message>
<message>
+ <source>Total Amount</source>
+ <translation type="unfinished">Toplam Tutar</translation>
+ </message>
+ <message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
@@ -2809,8 +2954,8 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ä°leti &amp;imzala</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">Adreslerinize yollanan bitcoinleri alabileceğiniz ispatlamak için adreslerinizle iletiler/anlaşmalar imzalayabilirsiniz. Oltalama saldırılarının kimliğinizi imzanızla elde etmeyi deneyebilecekleri için belirsiz ya da rastgele hiçbir şey imzalamamaya dikkat ediniz. Sadece ayrıntılı açıklaması olan ve tümüne katıldığınız ifadeleri imzalayınız.</translation>
+ <source>You can sign messages/agreements with your legacy (P2PKH) 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">Eski (P2PKH) adreslerinizle mesajları/anlaşmaları imzalayarak bu adreslere gönderilen Bitcoin'leri alabileceğinizi unutmayın. Belirsiz veya rastgele şeyleri imzalamaktan kaçının, çünkü kimlik bilgilerinizi çalmak isteyen oltalama saldırıları sizi kandırmaya çalışabilir. Sadece tamamen ayrıntılı ve onayladığınız beyanları imzalayın.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -2893,8 +3038,8 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Lütfen adresi kontrol edip tekrar deneyiniz.</translation>
</message>
<message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Girilen adres herhangi bir anahtara iÅŸaret etmemektedir.</translation>
+ <source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
+ <translation type="unfinished">Girilen adres, eski (P2PKH) bir anahtarı belirtmiyor. Bu sürümde SegWit ve diğer P2PKH olmayan %1 versiyon adres türleri için mesajla imzalama desteklenmiyor. Lütfen adresi kontrol edin ve tekrar deneyin.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
@@ -3079,6 +3224,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Çıktı indeksi</translation>
</message>
<message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Sertifika doğrulanmadı)</translation>
+ </message>
+ <message>
<source>Merchant</source>
<translation type="unfinished">Tüccar</translation>
</message>
@@ -3397,9 +3546,8 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">PSBT kopyalandı</translation>
</message>
<message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Panoya kopyalandı</translation>
+ <source>Fee-bump PSBT copied to clipboard</source>
+ <translation type="unfinished">Ücret artırma PSBT'si panoya kopyalandı</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3410,10 +3558,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Alışveriş taahüt edilemedi.</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">varsayılan cüzdan</translation>
+ <source>Signer error</source>
+ <translation type="unfinished">imzalayıcı hatası</translation>
</message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -3461,6 +3609,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">%s geliÅŸtiricileri</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 anlık görüntü durumunu doğrulamada başarısız oldu. Bu, bir donanım sorunu, yazılımda bir hata veya geçersiz bir anlık görüntünün yüklenmesine izin veren kötü bir yazılım değişikliği olduğunu gösterir. Bu nedenle, düğüm kapanacak ve anlık görüntüye dayanan herhangi bir durumu kullanmayı bırakacak, zincir yüksekliğini %d'den %d'e sıfırlayacaktır. Bir sonraki yeniden başlatmada, düğüm herhangi bir anlık görüntü verisi kullanmadan %d'den senkronizasyona devam edecektir. Bu olayı %s'ye bildiriniz ve anlık görüntüyü nasıl elde ettiğinizi de ekleyiniz. Geçersiz anlık görüntü zincir durumu, bu hatanın nedenini teşhis etmekte yardımcı olabilir diye diskte bırakılacaktır.</translation>
+ </message>
+ <message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
<translation type="unfinished">%s veri dizininde kilit elde edilemedi. %s muhtemelen hâlihazırda çalışmaktadır.</translation>
</message>
@@ -3477,10 +3629,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Geçersiz veya bozuk peers.dat (%s). Bunun bir hata olduğunu düşünüyorsanız, lütfen %s'e bildirin. Geçici bir çözüm olarak, bir sonraki başlangıçta yeni bir dosya oluşturmak için dosyayı (%s) yoldan çekebilirsiniz (yeniden adlandırabilir, taşıyabilir veya silebilirsiniz).</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">Lütfen bilgisayarınızın tarih ve saatinin doğruluğunu kontrol edin. Hata varsa %s doğru çalışmayacaktır.</translation>
- </message>
- <message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<translation type="unfinished">%s programını faydalı buluyorsanız lütfen katkıda bulununuz. Yazılım hakkında daha fazla bilgi için %s adresini ziyaret ediniz.</translation>
</message>
@@ -3497,6 +3645,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Budama: son cüzdan eşleşmesi budanmış verilerin ötesine gitmektedir. -reindex kullanmanız gerekmektedir (Budanmış düğüm ise tüm blok zincirini tekrar indirmeniz gerekir.)</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' yeniden adlandırması başarısız oldu. Bunu, %s geçersiz anlık görüntü dizinini manuel olarak taşıyarak veya silerek çözmelisiniz; aksi takdirde, bir sonraki başlatmada aynı hata ile karşılaşabilirsiniz."</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">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>
@@ -3521,6 +3673,30 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ağ sürümü zincirinin toplam boyutu (%i) en yüksek boyutu geçmektedir (%i). Kullanıcı aracı açıklamasının sayısı veya boyutunu azaltınız.</translation>
</message>
<message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">Bilinmeyen cüzdan dosya biçimi “%s†girildi. Lütfen “bdb†veya “sqlite†formatlarından birini girin.</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">Desteklenmeyen kategoriye özgü günlükleme seviyesi %1$s=%2$s. Beklenen: %1$s=&lt;category&gt;:&lt;loglevel&gt;. Geçerli kategoriler: %3$s. Geçerli günlükleme seviyeleri: %4$s.</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">Cüzdan başarıyla oluşturuldu. Eski cüzdan türü kullanımdan kaldırılmaktadır ve eski cüzdan oluşturma ve açma desteği gelecekte kaldırılacaktır.</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">Cüzdan başarıyla yüklendi. Eski cüzdan türü kullanımdan kaldırılacak ve eski cüzdanların oluşturulması ve açılması desteği gelecekte kaldırılacaktır. Eski cüzdanlar, migratewallet komutuyla descriptor cüzdana dönüştürülebilir.</translation>
+ </message>
+ <message>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">Uyarı: Dumpfile cüzdan formatı "%s", komut satırında belirtilen formatla "%s" eşleşmiyor.</translation>
+ </message>
+ <message>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">Uyarı: {%s} cüzdanında özel anahtarlarla devre dışı bırakılmış özel anahtarlar algılandı</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">Uyarı: Ağ eşlerimizle tamamen anlaşamamışız gibi görünüyor! Güncelleme yapmanız gerekebilir ya da diğer düğümlerin güncelleme yapmaları gerekebilir.</translation>
</message>
@@ -3545,6 +3721,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">-dnsseed false olarak ayarlanırken -forcednsseed true olarak ayarlanamıyor.</translation>
</message>
<message>
+ <source>Cannot set -peerblockfilters without -blockfilterindex.</source>
+ <translation type="unfinished">-blockfilterindex olmadan -peerblockfilters ayarlanamıyor.</translation>
+ </message>
+ <message>
<source>Cannot write to data directory '%s'; check permissions.</source>
<translation type="unfinished">Veriler '%s' klasörüne yazılamıyor ; yetkilendirmeyi kontrol edin.</translation>
</message>
@@ -3557,20 +3737,90 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">%s yüklenirken hata oluştu: Harici imzalayan cüzdanı derlenmiş harici imzalayan desteği olmadan yükleniyor</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">Okumada Hata %s! Tüm anahtarlar doğru okundu, ancak işlem verileri veya adres metadata verileri eksik veya hatalı olabilir.</translation>
+ </message>
+ <message>
+ <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Hata: Cüzdandaki adres defteri verilerinin taşınan cüzdanlara ait olduğu tespit edilemiyor</translation>
+ </message>
+ <message>
+ <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
+ <translation type="unfinished">Hata: Geçiş sırasında yinelenen tanımlayıcılar oluşturuldu. Cüzdanınız bozulmuş olabilir.</translation>
+ </message>
+ <message>
+ <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Hata: Cüzdandaki %s işleminin taşınan cüzdanlara ait olduğu tespit edilemiyor</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Ücret artışını hesaplamada başarısız olundu, çünkü onaylanmamış UTXO'lar, devasa bir onaylanmamış işlemler kümesine bağlı.</translation>
+ </message>
+ <message>
+ <source>Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting.
+</source>
+ <translation type="unfinished">Anlık görüntü zincir durumu dizini (%s) kaldırılamadı. Yeniden başlatmadan önce manuel olarak silin.
+</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Geçersiz peers.dat dosyası yeniden adlandırılamadı. Lütfen taşıyın veya silin ve tekrar deneyin.</translation>
</message>
<message>
+ <source>Flushing block file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Blok dosyasını diske yazma başarısız oldu. Bu muhtemelen bir G/Ç hatasının sonucudur.</translation>
+ </message>
+ <message>
+ <source>Flushing undo file to disk failed. This is likely the result of an I/O error.</source>
+ <translation type="unfinished">Geri alma dosyasını diske yazma başarısız oldu. Bu muhtemelen bir G/Ç hatasının sonucudur.</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is less than transaction weight without inputs</source>
+ <translation type="unfinished">Maksimum işlem ağırlığı, işlem girdi ağırlığından daha küçük olmalıdır.</translation>
+ </message>
+ <message>
+ <source>Maximum transaction weight is too low, can not accommodate change output</source>
+ <translation type="unfinished">Maksimum işlem ağırlığı çok düşük, değişim çıktısını barındıramaz.</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. Cannot clean up the background chainstate leveldb directory.</source>
+ <translation type="unfinished">'%s' -&gt; '%s' yeniden adlandırması başarısız oldu. Arka plan zincir durumu leveldb dizinini temizleyemiyor.</translation>
+ </message>
+ <message>
+ <source>The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Önceden seçilmiş girişlerin ve cüzdanın otomatik giriş seçiminin kombinasyonu, işlemin maksimum ağırlığını aşıyor. Lütfen daha küçük bir miktar göndermeyi deneyin veya cüzdanınızdaki UTXO'ları manuel olarak birleştirin.</translation>
+ </message>
+ <message>
+ <source>Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info.</source>
+ <translation type="unfinished">Bilgisayarınızın tarihi ve saati, ağla %d dakikadan fazla senkronizasyon görünmüyor; bu başarısız işlem hatasına yol açabilir. Bilgisayarınızın saatini düzenledikten sonra, bu mesaj tekrar görünmemelidir. Düğümünüzü yeniden başlattığınızda mesaj kaybolmalıdır. Yeniden başlatma olmadan, yeterli sayıda yeni çıkış bağlantısı sağladıktan sonra otomatik olarak kaybolmalıdır, bu biraz zaman alabilir. Daha fazla bilgi almak için `getpeerinfo` ve `getnetworkinfo` RPC yöntemlerinin `timeoffset` alanını kontrol edebilirsiniz.</translation>
+ </message>
+ <message>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
Cüzdan yedeği geri yüklenemiyor.</translation>
</message>
<message>
+ <source>whitebind may only be used for incoming connections ("out" was passed)</source>
+ <translation type="unfinished">whitebind yalnızca gelen bağlantılar için kullanılabilir ('out' parametresi pas geçildi)</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">Kritik bir iç hata oluştu, detaylar için debug.log dosyasına bakın:</translation>
+ </message>
+ <message>
+ <source>Assumeutxo data not found for the given blockhash '%s'.</source>
+ <translation type="unfinished">Verilen blok hash '%s' için AssumeUTXO verisi bulunamadı.</translation>
+ </message>
+ <message>
<source>Copyright (C) %i-%i</source>
<translation type="unfinished">Telif Hakkı (C) %i-%i</translation>
</message>
<message>
+ <source>Corrupt block found indicating potential hardware failure.</source>
+ <translation type="unfinished">Bozuk bir blok bulundu, bu donanım arızası kaynaklı olabilir.</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Bozuk blok veritabanı tespit edildi</translation>
</message>
@@ -3587,6 +3837,14 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Yükleme tamamlandı</translation>
</message>
<message>
+ <source>Elliptic curve cryptography sanity check failure. %s is shutting down.</source>
+ <translation type="unfinished">Eliptik eğri kriptografisi sistem sağlığı kontrolü başarısız oldu. %s kapatılıyor.</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Cüzdan verilerinizin silinirken hata. Veri tabanı bağlantı hatası.</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation type="unfinished">Blok veritabanını başlatılırken bir hata meydana geldi</translation>
</message>
@@ -3619,6 +3877,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Veritabanı okuma hatası, program kapatılıyor.</translation>
</message>
<message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Cüzdan verileriniz silinirken hata. Veri tabanı başlatılamadı</translation>
+ </message>
+ <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">Hata: Yeni sadece izlenebilir (watchonly) cüzdanı oluşturulamadı</translation>
</message>
@@ -3627,18 +3889,74 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Hata: Bu cüzdan zaten SQLite kullanıyor</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Hata: Cüzdan okunamadı en iyi blok bulucu kaydı </translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Hata: Cüzdana yazılamadı en iyi blok bulucu kaydı </translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Hata: Yalnızca izlenen cüzdanın en iyi blok bulucu kaydını yazmak mümkün değil</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Hata: %s Cüzdan için adres defteri kopyası oluşturulamadı</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Hata: %sCüzdan için veri tabanında işlem yapılamaz</translation>
+ </message>
+ <message>
+ <source>Failed to connect best block (%s).</source>
+ <translation type="unfinished">En iyi (%s) bloğa bağlanmak başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect block.</source>
+ <translation type="unfinished">Bloğun bağlantısı kesilemedi.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Herhangi bir portun dinlenmesi başarısız oldu. Bunu istiyorsanız -listen=0 seçeneğini kullanınız.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">Bloğu okuma başarısız oldu.</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Başlatma sırasında cüzdanı yeniden tarama işlemi başarısız oldu</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Endekslerin başlatılması başarısız oldu, kapatılıyor..</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Veritabanı doğrulanamadı</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">Bloğa yazma başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">Blok indeks veri tabanına yazma başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed to write to coin database.</source>
+ <translation type="unfinished">Coin veri tabanına yazma başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed to write undo data.</source>
+ <translation type="unfinished">Eski verilere yazma başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">işlemi: %s silme başarısız oldu.</translation>
+ </message>
+ <message>
<source>Importing…</source>
<translation type="unfinished">İçe aktarılıyor...</translation>
</message>
@@ -3668,7 +3986,7 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
</message>
<message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">-%s=&lt;tutar&gt; için geçersiz tutar: '%s'</translation>
+ <translation type="unfinished">Geçersiz tutar için -%s=&lt;amount&gt;: '%s'</translation>
</message>
<message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
@@ -3691,6 +4009,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Cüzdan yükleniyor...</translation>
</message>
<message>
+ <source>Maximum transaction weight must be between %d and %d</source>
+ <translation type="unfinished">Maksimum işlem yükü %d ile %d arasında olmalıdır</translation>
+ </message>
+ <message>
<source>Missing amount</source>
<translation type="unfinished">Eksik tutar</translation>
</message>
@@ -3711,6 +4033,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Kafi derecede dosya tanımlayıcıları mevcut değil.</translation>
</message>
<message>
+ <source>Only direction was set, no permissions: '%s'</source>
+ <translation type="unfinished">'%s' için izin yok. Sadece hedef ayarlandı.</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Budama negatif bir değerle yapılandırılamaz.</translation>
</message>
@@ -3727,6 +4053,18 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Yeniden taranıyor...</translation>
</message>
<message>
+ <source>Signer did not echo address</source>
+ <translation type="unfinished">İmzalayıcı adresi belirtilmedi.</translation>
+ </message>
+ <message>
+ <source>Signer echoed unexpected address %s</source>
+ <translation type="unfinished">İstenmeyen %s adrese imzalama yapıldı.</translation>
+ </message>
+ <message>
+ <source>Signer returned error: %s</source>
+ <translation type="unfinished">%s İmzayıcı hatası tekrarı.</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation type="unfinished">İşlemin imzalanması başarısız oldu</translation>
</message>
@@ -3743,6 +4081,18 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Belirtilen -walletdir "%s" bir dizin deÄŸildir</translation>
</message>
<message>
+ <source>System error while flushing: %s</source>
+ <translation type="unfinished">Temizleme esnasında sistem hatası: %s</translation>
+ </message>
+ <message>
+ <source>System error while loading external block file: %s</source>
+ <translation type="unfinished">%s : Harici blok dosyası yüklenirken sistem hatası.</translation>
+ </message>
+ <message>
+ <source>System error while saving block to disk: %s</source>
+ <translation type="unfinished">%s Bloğu diske kaydederken sistem hatası oluştu.</translation>
+ </message>
+ <message>
<source>The source code is available from %s.</source>
<translation type="unfinished">%s'in kaynak kodu ulaşılabilir.</translation>
</message>
@@ -3755,6 +4105,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">Cüzdan en az aktarma ücretinden daha az ödeme yapmaktan sakınacaktır.</translation>
</message>
<message>
+ <source>There is no ScriptPubKeyManager for this address</source>
+ <translation type="unfinished">Bu adres için bir ScriptPubKeyManager bulunmuyor</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation type="unfinished">Bu deneysel bir uygulamadır.</translation>
</message>
@@ -3767,6 +4121,10 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">-paytxfee çok yüksek bir değere ayarlanmış! Bu, işlemi gönderirseniz ödeyeceğiniz işlem ücretidir.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">%s İşlem bu cüzdana ait değil.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">İşlem tutarı çok düşük</translation>
</message>
@@ -3791,10 +4149,6 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">İşlem çok büyük</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">-maxsigcachesize: ' %s' MiB için bellek konumlandırılamıyor.</translation>
- </message>
- <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation type="unfinished">Bu bilgisayarda %s ögesine bağlanılamadı (bağlanma %s hatasını verdi)</translation>
</message>
@@ -3831,10 +4185,34 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">-onlynet için bilinmeyen bir ağ belirtildi: '%s'</translation>
</message>
<message>
+ <source>Unrecognised option "%s" provided in -test=&lt;option&gt;.</source>
+ <translation type="unfinished">Tanınmayan seçenek "%s" sağlanan -test=&lt;option&gt;.</translation>
+ </message>
+ <message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Desteklenmeyen global günlük seviyesi %s=%s. Geçerli değer:%s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">%s Cüzdan dosyaları oluşturulamadı.</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates %s blok zincirinde desteklenmiyor.</translation>
+ </message>
+ <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Desteklenmeyen günlük kategorisi %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Hata: Sadece izleme %s cüzdanı. tx izleme cüzdanına eklenemedi</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Hata: Yalnızca izlenen işlemler silinemedi.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Kullanıcı Aracı açıklaması (%s) güvensiz karakterler içermektedir.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts
index 7679222848..f4c47b46b2 100644
--- a/src/qt/locale/bitcoin_uk.ts
+++ b/src/qt/locale/bitcoin_uk.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>
@@ -39,7 +39,7 @@
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;ЕкÑпортувати</translation>
+ <translation type="unfinished">ЕкÑпортувати</translation>
</message>
<message>
<source>&amp;Delete</source>
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Введіть Ñтару та нову парольну фразу Ð´Ð»Ñ Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Продовжити</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -457,6 +465,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">гаманець за замовчуваннÑм</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -559,7 +571,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>
@@ -591,15 +603,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>
@@ -619,7 +631,7 @@ 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>
@@ -651,7 +663,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">Параметри &amp;командного Ñ€Ñдка</translation>
+ <translation type="unfinished">П&amp;араметри командного Ñ€Ñдка</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -695,7 +707,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Завантажити чаÑтково підпиÑану біткоїн-транзакцію (PSBT) з файлу</translation>
+ <translation type="unfinished">Завантажити чаÑтково підпиÑану біткоїн-транзакцію (PSBT)</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -715,11 +727,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">ÐдреÑи Ð´Ð»Ñ &amp;відправленнÑ</translation>
+ <translation type="unfinished">&amp;ÐдреÑи Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">ÐдреÑи Ð´Ð»Ñ &amp;отриманнÑ</translation>
+ <translation type="unfinished">&amp;ÐдреÑи Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
@@ -772,10 +784,6 @@ 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>No wallets available</source>
<translation type="unfinished">Гаманців немає</translation>
</message>
@@ -1186,10 +1194,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -2351,6 +2355,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">КількіÑÑ‚ÑŒ підключень</translation>
</message>
<message>
+ <source>Local Addresses</source>
+ <translation type="unfinished">Локальні адреÑи</translation>
+ </message>
+ <message>
<source>Block chain</source>
<translation type="unfinished">Блокчейн</translation>
</message>
@@ -2399,6 +2407,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Виберіть учаÑника Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду детальнішої інформації</translation>
</message>
<message>
+ <source>Hide Peers Detail</source>
+ <translation type="unfinished">Приховати відомоÑÑ‚Ñ– про учаÑника</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">ВерÑÑ–Ñ Ñ‚Ñ€Ð°Ð½Ñпортного рівнÑ: %1</translation>
</message>
@@ -2407,10 +2419,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2709,6 +2717,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Мережева активніÑÑ‚ÑŒ вимкнена.</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">ВідÑутні</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ без гаманцÑ</translation>
</message>
@@ -3442,10 +3454,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>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>
@@ -3530,10 +3538,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>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>
@@ -4115,11 +4119,6 @@ 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>
@@ -4131,16 +4130,12 @@ Go to File &gt; Open Wallet to load a wallet.
<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">ЕкÑпортувати</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -4192,7 +4187,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
@@ -4267,10 +4262,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4379,10 +4370,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">-maxmempool має бути не менше %d МБ</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>
@@ -4973,10 +4960,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ велика</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Ðе вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ пам'ÑÑ‚ÑŒ Ð´Ð»Ñ -maxsigcachesize: '%s' МіБ</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>
diff --git a/src/qt/locale/bitcoin_ur.ts b/src/qt/locale/bitcoin_ur.ts
index c0ff575864..de2357da71 100644
--- a/src/qt/locale/bitcoin_ur.ts
+++ b/src/qt/locale/bitcoin_ur.ts
@@ -2,12 +2,12 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Create a new address</source>
- <translation type="unfinished">نیا Ù¾ØªÛ ØªØ®Ù„ÛŒÙ‚ کریں</translation>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">ایڈریس یا لیبل میں ترمیم کرنے کے لیے رائیٹ کلک کریں</translation>
</message>
<message>
- <source>&amp;New</source>
- <translation type="unfinished">اور نیا</translation>
+ <source>Create a new address</source>
+ <translation type="unfinished">نیا ایڈریس بنائیں</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -89,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>
@@ -171,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">پرس Ú©Û’ لئے پرانا پاسÙریج اور نیا پاسÙریز درج کریں۔</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">جاری رکھیں</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -211,6 +227,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">آپ کا والٹ کھولنے Ú©Û’ لیے جو Ø®ÙÛŒÛ Ù„Ùظ (passphrase) دیا گیا ÛÛ’ ÙˆÛ ØºÙ„Ø· ÛÛ’Û” اس میں ایک خالی حر٠(null character) موجود ÛÛ’Û” اگر ÛŒÛ Ø®ÙÛŒÛ Ù„Ùظ اس ساÙÙ¹ ویئر Ú©Û’ ورژن 25.0 سے Ù¾ÛÙ„Û’ والے ورژن میں بنایا گیا تھا تو براÛ٠کرم Ù¾ÛÙ„Û’ خالی حر٠سے Ù¾ÛÙ„Û’ تک Ú©Û’ حرو٠استعمال کرکے Ø¯ÙˆØ¨Ø§Ø±Û Ú©ÙˆØ´Ø´ کریں۔ اگر ÛŒÛ Ú©Ø§Ù…ÛŒØ§Ø¨ Ûوجائے تو مستقبل میں اس مسئلے سے بچنے Ú©Û’ لیے نیا Ø®ÙÛŒÛ Ù„Ùظ مقرر کرلیں۔</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">والیٹ کا پاسÙریز کامیابی Ú©Û’ ساتھ تبدیل کردیا گیا تھا۔</translation>
</message>
@@ -265,6 +285,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">خرابی:%1</translation>
</message>
@@ -335,7 +360,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û ÙˆØ§Ù„ÛŒÙ¹</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -563,6 +592,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 کو &amp;clipboard سے لوڈ کریں...</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">کلپ بورڈ سے جزوی طور پر دستخط Ø´Ø¯Û Ø¨Ù¹ کوائن ٹرانزیکشن لوڈ کریں۔</translation>
</message>
@@ -599,10 +632,28 @@ 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>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>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>
@@ -615,14 +666,25 @@ 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>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>
@@ -672,6 +734,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -733,7 +799,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Private key &lt;b&gt;disabled&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>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>Original message:</source>
@@ -904,6 +974,27 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <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 Ûوگا اور ÛŒÛ Ø§Ø³ والیٹ Ú©ÛŒ ڈائرکٹری میں مل سکتی ÛÛ’Û” غلط منتقلی Ú©ÛŒ صورت میں، بیک اپ Ú©Ùˆ "Restore Wallet" Ùعالیت Ú©Û’ ساتھ بحال کیا جا سکتا ÛÛ’Û”</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">والیٹ منتقل کریں</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -914,16 +1005,20 @@ 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>
</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>
@@ -949,6 +1044,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -1037,6 +1136,14 @@ 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>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">والیٹ Ú©Ùˆ غیر مقÙÙ„ Ù†Ûیں کیا جا سکا۔</translation>
</message>
@@ -1333,6 +1440,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ú©Ù†Ùیگریشن Ú©Û’ اختیارات</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">جاری رکھیں</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">نقص</translation>
</message>
@@ -2110,10 +2221,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">دستخط - ایک پیغام پر دستخط / تصدیق کریں۔</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>
@@ -2288,11 +2395,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>Send Coins</source>
<translation type="unfinished">سکے بھیجیں۔</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">Ù¾ÛÙ„Û’ سے Ø·Û’ Ø´Ø¯Û ÙˆØ§Ù„ÛŒÙ¹</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
@@ -2303,6 +2406,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>Export the data in the current tab to a file</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>
</context>
<context>
<name>bitcoin-core</name>
diff --git a/src/qt/locale/bitcoin_uz.ts b/src/qt/locale/bitcoin_uz.ts
index b7193d36b8..0ecf99ac43 100644
--- a/src/qt/locale/bitcoin_uz.ts
+++ b/src/qt/locale/bitcoin_uz.ts
@@ -365,6 +365,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart hamyon</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -443,7 +447,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Hamyon shifrlanishi uchun ishlatilgan maxfiy so'zni almashtirish</translation>
+ <translation type="unfinished">Паролни ўзгартириш ҳамённи кодлашда фойдаланилади</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -463,7 +467,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Hamyonga tegishli bo'lgan maxfiy so'zlarni shifrlash</translation>
+ <translation type="unfinished">Ҳамёнингизга тегишли махфий калитларни кодлаш</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -479,7 +483,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Bitkoin manzillarga ega ekaningizni tasdiqlash uchun xabarni signlang</translation>
+ <translation type="unfinished">Bitcoin манзилидан унинг ÑгаÑи Ñканлигингизни иÑботлаш учун хабарлар ёзинг</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -487,7 +491,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Xabar belgilangan Bitkoin manzillari bilan imzolanganligiga ishonch hosil qilish uchun ularni tasdiqlang</translation>
+ <translation type="unfinished">Хабарларни махÑÑƒÑ Bitcoin манзилларингиз билан ёзилганлигига ишонч ҳоÑил қилиш учун уларни таÑдиқланг</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
@@ -511,19 +515,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Fayl</translation>
+ <translation type="unfinished">&amp;Файл</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;Sozlamalar</translation>
+ <translation type="unfinished">&amp; Созламалар</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">&amp;Yordam</translation>
+ <translation type="unfinished">&amp;Ðрдам</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">Yorliqlar menyusi</translation>
+ <translation type="unfinished">Ички ойналар аÑбоблар панели</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
@@ -547,19 +551,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Тўловлар (QR кодлари ва bitcoin ёрдамида Ñратишлар: URI’лар) Ñўраш</translation>
+ <translation type="unfinished">To'lovlarni so'rash(QR kolar va bitkoin yaratish: URL manzillar)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Фойдаланилган жўнатилган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
+ <translation type="unfinished">Manzillar va yorliqlar ro'yxatini ko'rsatish</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Фойдаланилган қабул қилинган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
+ <translation type="unfinished">Qabul qilish manzillari va yorliqlar ro'yxatini ko'rsatish</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Буйруқлар Ñатри моÑламалари</translation>
+ <translation type="unfinished">&amp;Command-line sozlamalari</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -570,7 +574,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 орқада</translation>
+ <translation type="unfinished">%1 yonida</translation>
</message>
<message>
<source>Catching up…</source>
@@ -578,27 +582,27 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Сўнги қабул қилинган блок %1 олдин Ñратилган.</translation>
+ <translation type="unfinished">%1 oldin oxirgi marta blok qabul qilingan edi.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Бундан кейинги пул ўтказмалари кўринмайдиган бўлади.</translation>
+ <translation type="unfinished">Shundan keyingi operatsiyalar hali ko'rinmaydi.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Хатолик</translation>
+ <translation type="unfinished">Xatolik</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Диққат</translation>
+ <translation type="unfinished">Eslatma</translation>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Маълумот</translation>
+ <translation type="unfinished">Informatsiya</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">Янгиланган</translation>
+ <translation type="unfinished">Hozirgi kunda</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -634,7 +638,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ochiq hamyon</translation>
+ <translation type="unfinished">Hamyonni ochish</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -657,10 +661,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Umumiy ko'rinish menyusidagi qiymatlarni maskirovka qilish</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Hamyonlar mavjud emas</translation>
</message>
@@ -841,7 +841,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Tree mode</source>
- <translation type="unfinished">Daraxt rejimi</translation>
+ <translation type="unfinished">Дарахт уÑулида</translation>
</message>
<message>
<source>List mode</source>
@@ -849,7 +849,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Miqdor</translation>
+ <translation type="unfinished">Миқдори</translation>
</message>
<message>
<source>Received with label</source>
@@ -865,11 +865,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Confirmations</source>
- <translation type="unfinished">Tasdiqlar</translation>
+ <translation type="unfinished">ТаÑдиқлашлар</translation>
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">Tasdiqlangan</translation>
+ <translation type="unfinished">ТаÑдиқланди</translation>
</message>
<message>
<source>Copy amount</source>
@@ -893,7 +893,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">Sarflanmagan miqdorlarni q&amp;ulflash</translation>
+ <translation type="unfinished">Sarflanmagan tranzaksiyalarni q&amp;ulflash</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -917,11 +917,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">O'zgarishni nusxalash</translation>
+ <translation type="unfinished">ÐуÑха қайтими</translation>
</message>
<message>
<source>(%1 locked)</source>
- <translation type="unfinished">(%1 qulflangan)</translation>
+ <translation type="unfinished">(%1 қулфланган)</translation>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
@@ -929,7 +929,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Ðрлиқ мавжуд ÑмаÑ)</translation>
+ <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
</message>
<message>
<source>change from %1 (%2)</source>
@@ -989,10 +989,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Hamyonni ochish ogohlantirishi</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ochiq hamyon</translation>
@@ -1821,6 +1817,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Manzilni nusxalash</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Йўқ</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">%1 орқали</translation>
</message>
@@ -2078,7 +2078,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">O'zgarishni nusxalash</translation>
+ <translation type="unfinished">ÐуÑха қайтими</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2259,7 +2259,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Amount</source>
- <translation type="unfinished">Miqdor</translation>
+ <translation type="unfinished">Миқдори</translation>
</message>
<message>
<source>true</source>
@@ -2469,11 +2469,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">Тангаларни жунат</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_uz@Cyrl.ts b/src/qt/locale/bitcoin_uz@Cyrl.ts
index f335cb39ab..addb6fb9e8 100644
--- a/src/qt/locale/bitcoin_uz@Cyrl.ts
+++ b/src/qt/locale/bitcoin_uz@Cyrl.ts
@@ -370,6 +370,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart hamyon</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -639,7 +643,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ochiq hamyon</translation>
+ <translation type="unfinished">Hamyonni ochish</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -662,10 +666,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Umumiy ko'rinish menyusidagi qiymatlarni maskirovka qilish</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Hamyonlar mavjud emas</translation>
</message>
@@ -898,7 +898,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">Sarflanmagan miqdorlarni q&amp;ulflash</translation>
+ <translation type="unfinished">Sarflanmagan tranzaksiyalarni q&amp;ulflash</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
@@ -994,10 +994,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Hamyonni ochish ogohlantirishi</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ochiq hamyon</translation>
@@ -1826,6 +1822,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Manzilni nusxalash</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Йўқ</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">%1 орқали</translation>
</message>
@@ -2474,11 +2474,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Send Coins</source>
<translation type="unfinished">Тангаларни жунат</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_uz@Latn.ts b/src/qt/locale/bitcoin_uz@Latn.ts
index 823b21be06..75ce7b974d 100644
--- a/src/qt/locale/bitcoin_uz@Latn.ts
+++ b/src/qt/locale/bitcoin_uz@Latn.ts
@@ -370,6 +370,10 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<source>%1 GB</source>
<translation type="unfinished">%1 ГБ</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">standart hamyon</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -448,7 +452,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Hamyon shifrlanishi uchun ishlatilgan maxfiy so'zni almashtirish</translation>
+ <translation type="unfinished">Паролни ўзгартириш ҳамённи кодлашда фойдаланилади</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -468,7 +472,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Hamyonga tegishli bo'lgan maxfiy so'zlarni shifrlash</translation>
+ <translation type="unfinished">Ҳамёнингизга тегишли махфий калитларни кодлаш</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -484,7 +488,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Bitkoin manzillarga ega ekaningizni tasdiqlash uchun xabarni signlang</translation>
+ <translation type="unfinished">Bitcoin манзилидан унинг ÑгаÑи Ñканлигингизни иÑботлаш учун хабарлар ёзинг</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -492,7 +496,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Xabar belgilangan Bitkoin manzillari bilan imzolanganligiga ishonch hosil qilish uchun ularni tasdiqlang</translation>
+ <translation type="unfinished">Хабарларни махÑÑƒÑ Bitcoin манзилларингиз билан ёзилганлигига ишонч ҳоÑил қилиш учун уларни таÑдиқланг</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
@@ -516,19 +520,19 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Fayl</translation>
+ <translation type="unfinished">&amp;Файл</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;Sozlamalar</translation>
+ <translation type="unfinished">&amp; Созламалар</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">&amp;Yordam</translation>
+ <translation type="unfinished">&amp;Ðрдам</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">Yorliqlar menyusi</translation>
+ <translation type="unfinished">Ички ойналар аÑбоблар панели</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
@@ -552,19 +556,19 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Тўловлар (QR кодлари ва bitcoin ёрдамида Ñратишлар: URI’лар) Ñўраш</translation>
+ <translation type="unfinished">To'lovlarni so'rash(QR kolar va bitkoin yaratish: URL manzillar)</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Фойдаланилган жўнатилган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
+ <translation type="unfinished">Manzillar va yorliqlar ro'yxatini ko'rsatish</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Фойдаланилган қабул қилинган манзиллар ва ёрлиқлар рўйхатини кўрÑатиш</translation>
+ <translation type="unfinished">Qabul qilish manzillari va yorliqlar ro'yxatini ko'rsatish</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Буйруқлар Ñатри моÑламалари</translation>
+ <translation type="unfinished">&amp;Command-line sozlamalari</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -575,7 +579,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 орқада</translation>
+ <translation type="unfinished">%1 yonida</translation>
</message>
<message>
<source>Catching up…</source>
@@ -583,27 +587,27 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Сўнги қабул қилинган блок %1 олдин Ñратилган.</translation>
+ <translation type="unfinished">%1 oldin oxirgi marta blok qabul qilingan edi.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Бундан кейинги пул ўтказмалари кўринмайдиган бўлади.</translation>
+ <translation type="unfinished">Shundan keyingi operatsiyalar hali ko'rinmaydi.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Хатолик</translation>
+ <translation type="unfinished">Xatolik</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Диққат</translation>
+ <translation type="unfinished">Eslatma</translation>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Маълумот</translation>
+ <translation type="unfinished">Informatsiya</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">Янгиланган</translation>
+ <translation type="unfinished">Hozirgi kunda</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -639,7 +643,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Ochiq hamyon</translation>
+ <translation type="unfinished">Hamyonni ochish</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -662,10 +666,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Umumiy ko'rinish menyusidagi qiymatlarni maskirovka qilish</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Hamyonlar mavjud emas</translation>
</message>
@@ -994,10 +994,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Hamyonni ochish ogohlantirishi</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
- <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">Ochiq hamyon</translation>
@@ -1826,6 +1822,10 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">&amp;Manzilni nusxalash</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">Йўқ</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">%1 орқали</translation>
</message>
@@ -1964,7 +1964,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ðрлиқ мавжуд ÑмаÑ)</translation>
</message>
<message>
<source>(no message)</source>
@@ -2122,7 +2122,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ðрлиқ мавжуд ÑмаÑ)</translation>
</message>
</context>
<context>
@@ -2330,7 +2330,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</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>
@@ -2474,11 +2474,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<source>Send Coins</source>
<translation type="unfinished">Тангаларни жунат</translation>
</message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">standart hamyon</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletView</name>
<message>
diff --git a/src/qt/locale/bitcoin_vi.ts b/src/qt/locale/bitcoin_vi.ts
index fe69b4c1f3..f675452e26 100644
--- a/src/qt/locale/bitcoin_vi.ts
+++ b/src/qt/locale/bitcoin_vi.ts
@@ -70,10 +70,6 @@
<translation type="unfinished">Xuất danh sách địa chỉ</translation>
</message>
<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>
@@ -156,6 +152,10 @@
<translation type="unfinished">Nhập mật khẩu cũ và mật khẩu mới cho ví.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Tiếp tục</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">Xin lÆ°u ý rằng mã hoá ví của bạn không thể bảo vá» hoàn toàn Bitcoin của bạn khá»i việc bị đánh cắp má»›i các phần má»m gián Ä‘iệp nhiá»…m vào máy tính của bạn.</translation>
</message>
@@ -290,7 +290,11 @@
<numerusform>%nnăm</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">ví mặc định</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -415,18 +419,6 @@
<translation type="unfinished">Äóng tất cả các ví…</translation>
</message>
<message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;Tệp</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <translation type="unfinished">&amp;Cài đặt</translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation type="unfinished">&amp;Giúp đỡ</translation>
- </message>
- <message>
<source>Tabs toolbar</source>
<translation type="unfinished">Các thanh công cụ</translation>
</message>
@@ -446,6 +438,10 @@
<source>Processing blocks on disk…</source>
<translation type="unfinished">Xử lý khối trên đĩa…</translation>
</message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Kết nối với các peer…</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -457,6 +453,10 @@
<translation type="unfinished">%1 phía sau</translation>
</message>
<message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Äang bắt kịp...</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">Lá»—i</translation>
</message>
@@ -470,7 +470,7 @@
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Tải một phần giao dịch Bitcoin đã ký</translation>
+ <translation type="unfinished">Kết nối với mạng Bitcoin thông qua một proxy SOCKS5 riêng cho các dịch vụ Tor hành.</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -490,11 +490,11 @@
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">Các địa chỉ đang &amp;gửi</translation>
+ <translation type="unfinished">&amp;Các địa chỉ đang gửi</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">Các địa chỉ đang &amp;nhận</translation>
+ <translation type="unfinished">&amp;Các địa chỉ đang nhận</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
@@ -539,10 +539,6 @@
<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>
- <message>
<source>No wallets available</source>
<translation type="unfinished">Không có ví nào</translation>
</message>
@@ -561,6 +557,10 @@
<translation type="unfinished">Nhấn Ctrl + M</translation>
</message>
<message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 khách</translation>
+ </message>
+ <message>
<source>&amp;Hide</source>
<translation type="unfinished">&amp;Ẩn</translation>
</message>
@@ -669,10 +669,6 @@
<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>
@@ -1115,10 +1111,6 @@
<source>Label</source>
<translation type="unfinished">Nhãn</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(không có nhãn)</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1156,11 +1148,7 @@
<numerusform>Ước tính sẽ bắt đầu xác nhận trong %n khối.</numerusform>
</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(không có nhãn)</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -1214,10 +1202,6 @@
<source>Label</source>
<translation type="unfinished">Nhãn</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(không có nhãn)</translation>
- </message>
</context>
<context>
<name>TransactionView</name>
@@ -1255,18 +1239,6 @@
</message>
</context>
<context>
- <name>WalletModel</name>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Äã sao chép vào bảng tạm.</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">ví mặc định</translation>
- </message>
-</context>
-<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
@@ -1304,6 +1276,10 @@
<translation type="unfinished">Không thể đặt -forcednsseed thành true khi đặt -dnsseed thành false.</translation>
</message>
<message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">Không thể ghi vào thÆ° mục dữ liệu '%s'; kiểm tra lại quyá»n.</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>
@@ -1450,10 +1426,6 @@ Không thể khôi phục bản sao lưu của ví.</translation>
<translation type="unfinished">Giao dịch cần thay đổi địa chỉ, nhưng chúng tôi không thể tạo địa chỉ đó.</translation>
</message>
<message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Không có khả năng để phân bổ bộ nhớ cho -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
<source>Unable to find UTXO for external input</source>
<translation type="unfinished">Không thể tìm UTXO cho đầu vào từ bên ngoài</translation>
</message>
diff --git a/src/qt/locale/bitcoin_yue.ts b/src/qt/locale/bitcoin_yue.ts
index 1ed37d36ce..ea7a1e177f 100644
--- a/src/qt/locale/bitcoin_yue.ts
+++ b/src/qt/locale/bitcoin_yue.ts
@@ -179,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -261,6 +269,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>
@@ -432,7 +444,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -510,7 +522,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -521,16 +533,8 @@ Signing is only possible with addresses of the type 'legacy'.</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>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -541,22 +545,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -573,32 +565,20 @@ Signing is only possible with addresses of the type 'legacy'.</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;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <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>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -610,7 +590,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>
@@ -622,7 +602,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
@@ -640,15 +620,15 @@ 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>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -660,7 +640,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">資訊</translation>
+ <translation type="unfinished">ä¿¡æ¯</translation>
</message>
<message>
<source>Up to date</source>
@@ -734,7 +714,7 @@ 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帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -745,10 +725,6 @@ 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>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -786,15 +762,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</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;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -806,26 +782,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ <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>
@@ -905,7 +871,7 @@ 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;locked&lt;/b&gt;</source>
- <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&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>
@@ -927,11 +893,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -946,14 +912,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -966,22 +924,10 @@ 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>
@@ -1006,10 +952,6 @@ 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>
@@ -1045,11 +987,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1141,10 +1079,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1480,7 +1414,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1491,11 +1425,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1507,11 +1441,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</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>
@@ -2262,10 +2196,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2372,6 +2302,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2540,7 +2474,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2564,6 +2498,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2599,7 +2537,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2789,11 +2727,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2931,7 +2869,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2945,9 +2883,9 @@ For more information on using this console, type %6.
<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字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–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>
@@ -3062,6 +3000,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>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3070,6 +3012,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3201,7 +3148,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>
@@ -3258,10 +3205,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3271,7 +3214,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>
@@ -3346,10 +3289,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>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>
@@ -3402,6 +3341,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3780,7 +3726,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3918,11 +3864,6 @@ 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>
@@ -3932,11 +3873,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
@@ -3986,6 +3923,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -3999,7 +3940,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <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>
@@ -4027,7 +3968,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%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>
@@ -4066,10 +4009,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4178,10 +4117,6 @@ 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>
@@ -4316,6 +4251,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4333,7 +4272,7 @@ 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">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4424,14 +4363,34 @@ Unable to restore backup of wallet.</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: 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">錯誤:keypool已用完,請先é‡æ–°å‘¼å«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>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4484,6 +4443,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4492,6 +4455,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4516,6 +4487,10 @@ Unable to restore backup of wallet.</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>
@@ -4688,10 +4663,6 @@ Unable to restore backup of wallet.</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. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh-Hans.ts b/src/qt/locale/bitcoin_zh-Hans.ts
index 4b2769a0c5..9f827ee890 100644
--- a/src/qt/locale/bitcoin_zh-Hans.ts
+++ b/src/qt/locale/bitcoin_zh-Hans.ts
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入此钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -433,7 +441,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 B</source>
<translation type="unfinished">%1 字节</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -511,7 +523,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -526,12 +538,8 @@ Signing is only possible with addresses of the type 'legacy'.</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>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -542,22 +550,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -574,32 +570,20 @@ Signing is only possible with addresses of the type 'legacy'.</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;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <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>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -611,7 +595,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>
@@ -641,15 +625,15 @@ 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>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -746,10 +730,6 @@ 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>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -801,7 +781,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>
@@ -1159,10 +1139,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1308,7 +1284,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
@@ -2363,10 +2339,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2473,6 +2445,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2665,6 +2641,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -3386,10 +3366,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3474,10 +3450,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>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>
@@ -4046,11 +4018,6 @@ 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>
@@ -4062,10 +4029,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4198,10 +4161,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4310,10 +4269,6 @@ 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>
@@ -4448,6 +4403,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4640,6 +4599,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">监å¬ç«¯å£å¤±è´¥ã€‚如果你愿æ„çš„è¯ï¼Œè¯·ä½¿ç”¨ -listen=0 å‚数。</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">åˆå§‹åŒ–æ—¶é‡æ‰«æ钱包失败</translation>
</message>
@@ -4652,6 +4615,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">删除交易时失败: %s</translation>
</message>
@@ -4904,10 +4875,6 @@ Unable to restore backup of wallet.</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>
diff --git a/src/qt/locale/bitcoin_zh-Hant.ts b/src/qt/locale/bitcoin_zh-Hant.ts
index 9fe760619b..ee666c5ff3 100644
--- a/src/qt/locale/bitcoin_zh-Hant.ts
+++ b/src/qt/locale/bitcoin_zh-Hant.ts
@@ -179,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -261,6 +269,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>
@@ -432,7 +444,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
-</context>
+ </context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -510,7 +522,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">修改钱包加密密ç </translation>
+ <translation type="unfinished">更改钱包密ç </translation>
</message>
<message>
<source>&amp;Send</source>
@@ -521,16 +533,8 @@ Signing is only possible with addresses of the type 'legacy'.</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>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -541,22 +545,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -573,32 +565,20 @@ Signing is only possible with addresses of the type 'legacy'.</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;F)</translation>
+ <translation type="unfinished">&amp;文件</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">设置(&amp;S)</translation>
+ <translation type="unfinished">&amp;設定</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">帮助(&amp;H)</translation>
+ <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>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -610,7 +590,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>
@@ -640,15 +620,15 @@ 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>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -734,7 +714,7 @@ 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帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -745,10 +725,6 @@ 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>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -770,7 +746,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">钱包å称</translation>
+ <translation type="unfinished">錢包å稱</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -786,15 +762,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</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;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -806,26 +782,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ <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>
@@ -927,11 +893,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -946,14 +912,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -966,22 +924,10 @@ 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>
@@ -1006,10 +952,6 @@ 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>
@@ -1045,11 +987,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1141,10 +1079,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1194,7 +1128,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1245,7 +1179,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
</context>
<context>
@@ -1284,7 +1218,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1307,7 +1241,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1315,7 +1249,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1352,7 +1286,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1383,7 +1317,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <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>
@@ -1391,7 +1325,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>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>
@@ -1437,7 +1371,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1448,15 +1382,15 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</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>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1468,7 +1402,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1480,7 +1414,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1508,7 +1442,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1519,11 +1453,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1535,11 +1469,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</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>
@@ -2290,10 +2224,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2400,6 +2330,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2462,7 +2396,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>
@@ -2568,7 +2502,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2592,6 +2526,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2627,7 +2565,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2817,11 +2755,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2959,7 +2897,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2973,9 +2911,9 @@ For more information on using this console, type %6.
<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字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–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>
@@ -3090,6 +3028,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>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3098,6 +3040,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3229,7 +3176,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>
@@ -3286,10 +3233,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3299,7 +3242,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>
@@ -3374,10 +3317,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>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>
@@ -3430,6 +3369,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3808,7 +3754,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3946,11 +3892,6 @@ 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>
@@ -3960,11 +3901,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
@@ -4014,6 +3951,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4027,7 +3968,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <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>
@@ -4055,7 +3996,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%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>
@@ -4094,10 +4037,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4206,10 +4145,6 @@ 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>
@@ -4344,6 +4279,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4361,7 +4300,7 @@ 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">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4452,14 +4391,34 @@ Unable to restore backup of wallet.</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: 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">錯誤:keypool已用完,請先é‡æ–°å‘¼å«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>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4512,6 +4471,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4520,6 +4483,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4544,6 +4515,10 @@ Unable to restore backup of wallet.</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>
@@ -4716,10 +4691,6 @@ Unable to restore backup of wallet.</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. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh.ts b/src/qt/locale/bitcoin_zh.ts
index 0b2297d0b7..3d279e6da0 100644
--- a/src/qt/locale/bitcoin_zh.ts
+++ b/src/qt/locale/bitcoin_zh.ts
@@ -50,10 +50,6 @@
<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;H)</translation>
</message>
@@ -98,10 +94,6 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -184,6 +176,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -434,14 +434,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
<context>
<name>BitcoinGUI</name>
<message>
@@ -453,6 +449,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">最å°åŒ–</translation>
</message>
<message>
+ <source>Wallet:</source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">更改钱包密ç </translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation type="unfinished">&amp;文件</translation>
</message>
@@ -469,24 +473,20 @@ 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>
+ <translation type="unfinished">请求支付(生æˆäºŒç»´ç å’Œæ¯”特å¸é“¾æŽ¥)</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>
- <translation type="unfinished">命令行选项(&amp;C)</translation>
+ <translation type="unfinished">&amp;命令行选项</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -496,19 +496,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">è½åŽ %1</translation>
- </message>
- <message>
- <source>Catching up…</source>
- <translation type="unfinished">追上中...</translation>
+ <translation type="unfinished">%1 è½åŽ</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">上次接收到的å—是在%1之å‰ç”Ÿæˆçš„。</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">之åŽçš„交易还ä¸å¯è§ã€‚</translation>
</message>
<message>
<source>Error</source>
@@ -520,11 +516,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Information</source>
- <translation type="unfinished">ä¿¡æ¯</translation>
+ <translation type="unfinished">消æ¯</translation>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">已是最新</translation>
+ <translation type="unfinished">最新的</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -573,10 +569,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -589,10 +581,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">显示%1帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</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>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>
@@ -603,6 +608,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
@@ -620,11 +630,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -634,8 +644,18 @@ 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>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>
@@ -737,11 +757,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -753,15 +773,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
+ <translation type="unfinished">計費後金é¡:</translation>
</message>
<message>
<source>Tree mode</source>
@@ -776,40 +788,24 @@ 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>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>
+ <translation type="unfinished">å¤åˆ¶åœ°å€(&amp;C)</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">複製 &amp;label</translation>
+ <translation type="unfinished">å¤åˆ¶æ ‡ç­¾(&amp;L)</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">複製 &amp;amount</translation>
+ <translation type="unfinished">å¤åˆ¶å’Œæ•°é‡</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -820,10 +816,6 @@ 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>
@@ -833,54 +825,33 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">å¤åˆ¶å«äº¤æ˜“费的金é¢</translation>
+ <translation type="unfinished">複製計費後金é¡</translation>
</message>
<message>
<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>
+ <source>Copy change</source>
+ <translation type="unfinished">複製找零金é¡</translation>
</message>
<message>
- <source>change from %1 (%2)</source>
- <translation type="unfinished">æ¥è‡ª %1 的找零 (%2)</translation>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1å·²é”定)</translation>
</message>
<message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
+ <source>(no label)</source>
+ <translation type="unfinished">(无标签)</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">创建钱包</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>
@@ -947,10 +918,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -997,7 +964,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
@@ -1009,7 +976,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1072,7 +1039,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
<message>
<source>Compiled without external signing support (required for external signing)</source>
@@ -1096,7 +1063,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
@@ -1120,7 +1087,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1143,7 +1110,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1151,7 +1118,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1192,7 +1159,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1223,7 +1190,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <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>
@@ -1235,7 +1202,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>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>
@@ -1281,7 +1248,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1292,15 +1259,15 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</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>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1312,7 +1279,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1324,7 +1291,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1332,7 +1299,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">%1 當å‰æ­£åœ¨åŒæ­¥ã€‚它將從peers下載å€å¡Šé ­å’Œå€å¡Šï¼Œä¸¦å°å…¶é€²è¡Œé©—證,直到到é”å€å¡Šéˆçš„頂為止。</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
@@ -1352,7 +1319,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1363,11 +1330,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1379,11 +1346,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</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>
@@ -2151,10 +2118,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2261,6 +2224,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/é¡žåž‹</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2323,7 +2290,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>
@@ -2429,7 +2396,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2453,6 +2420,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2488,7 +2459,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2639,7 +2610,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Could not generate new %1 address</source>
- <translation type="unfinished">无法生æˆæ–°çš„%1地å€</translation>
+ <translation type="unfinished">無法產生新的 %1 地å€</translation>
</message>
</context>
<context>
@@ -2678,11 +2649,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2712,10 +2683,6 @@ For more information on using this console, type %6.
<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>
@@ -2820,7 +2787,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2834,9 +2801,9 @@ For more information on using this console, type %6.
<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字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–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>
@@ -2892,13 +2859,17 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">å¤åˆ¶å«äº¤æ˜“费的金é¢</translation>
+ <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>
@@ -2922,7 +2893,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</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>
+ <translation type="unfinished">產生一個部分簽å的比特幣交易(PSBT)以用於例如離線%1錢包或與PSBT相容的硬體錢包。</translation>
</message>
<message>
<source>Save Transaction Data</source>
@@ -2934,10 +2905,19 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">部分簽å交易(二進ä½)</translation>
</message>
<message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</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>
@@ -3040,11 +3020,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>
@@ -3064,12 +3040,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>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>
+ <translation type="unfinished">從剪貼簿粘貼錢包ä½å€</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3126,10 +3098,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3139,7 +3107,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>
@@ -3214,10 +3182,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>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>
@@ -3270,6 +3234,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3514,10 +3485,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>
@@ -3652,7 +3619,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Confirmed</source>
- <translation type="unfinished">已确认</translation>
+ <translation type="unfinished">已確èª</translation>
</message>
<message>
<source>Watch-only</source>
@@ -3786,11 +3753,6 @@ 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>
@@ -3800,11 +3762,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
@@ -3822,6 +3780,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>
@@ -3850,7 +3813,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
+ <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>
@@ -3866,7 +3829,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <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>
@@ -3894,7 +3857,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%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>
@@ -3933,10 +3898,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4045,10 +4006,6 @@ 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>
@@ -4183,6 +4140,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4200,7 +4161,7 @@ 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">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4283,10 +4244,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法从生æˆçš„scriptpubkeyæå–目标</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: 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: 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>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4335,10 +4316,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4351,6 +4344,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">dbcacheä¸è¶³ä»¥ç”¨äºŽåŒºå—验è¯</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">金é¢ä¸è¶³</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>
@@ -4407,10 +4404,6 @@ Unable to restore backup of wallet.</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 find UTXO for external input</source>
<translation type="unfinished">无法为外部输入找到UTXO</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts
index 21f57a8f6d..7bab106bd5 100644
--- a/src/qt/locale/bitcoin_zh_CN.ts
+++ b/src/qt/locale/bitcoin_zh_CN.ts
@@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">输入此钱包的旧密ç å’Œæ–°å¯†ç ã€‚</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -433,7 +441,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 B</source>
<translation type="unfinished">%1 字节</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
@@ -611,7 +623,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>
@@ -641,15 +653,15 @@ 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>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -746,10 +758,6 @@ 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>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -1039,62 +1047,20 @@ Signing is only possible with addresses of the type 'legacy'.</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>
- <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>
<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>
+ <translation type="unfinished">正在创建钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
<message>
<source>Too many external signers found</source>
- <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>
+ <translation type="unfinished">åµæ¸¬åˆ°çš„外接簽å器éŽå¤š</translation>
</message>
</context>
<context>
@@ -1159,10 +1125,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -2363,10 +2325,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2473,6 +2431,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2665,6 +2627,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">æ— </translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -3386,10 +3352,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3474,10 +3436,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>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>
@@ -4046,11 +4004,6 @@ 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>
@@ -4062,10 +4015,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4198,10 +4147,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4310,10 +4255,6 @@ 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>
@@ -4448,6 +4389,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4640,6 +4585,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">监å¬ç«¯å£å¤±è´¥ã€‚如果你愿æ„çš„è¯ï¼Œè¯·ä½¿ç”¨ -listen=0 å‚数。</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">åˆå§‹åŒ–æ—¶é‡æ‰«æ钱包失败</translation>
</message>
@@ -4652,6 +4601,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4904,10 +4861,6 @@ Unable to restore backup of wallet.</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>
diff --git a/src/qt/locale/bitcoin_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts
index 55551bfe71..174ae53fba 100644
--- a/src/qt/locale/bitcoin_zh_HK.ts
+++ b/src/qt/locale/bitcoin_zh_HK.ts
@@ -183,6 +183,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">請輸入舊密碼和新密碼至錢包。</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">继续</translation>
+ </message>
+ <message>
+ <source>Back</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">請記得將錢包加密ä¸èƒ½å®Œå…¨é˜²æ­¢ä½ çš„ Bitcoins 經被入侵電腦的惡æ„程å¼å·å–。</translation>
</message>
@@ -265,6 +273,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>
@@ -432,6 +444,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">é è¨­éŒ¢åŒ…</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -521,16 +537,8 @@ Signing is only possible with addresses of the type 'legacy'.</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>
+ <translation type="unfinished">將錢包中之密鑰加密</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -541,22 +549,10 @@ Signing is only possible with addresses of the type 'legacy'.</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>
@@ -573,10 +569,6 @@ Signing is only possible with addresses of the type 'legacy'.</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;F</translation>
</message>
@@ -590,15 +582,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</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>
+ <translation type="unfinished">分é å·¥å…·åˆ—</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -610,7 +594,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>
@@ -640,15 +624,15 @@ 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>
- <translation type="unfinished">最新接收到的区å—是在%1之å‰ç”Ÿæˆçš„。</translation>
+ <translation type="unfinished">最新收到的区å—产生于 %1 之å‰ã€‚</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§ã€‚</translation>
+ <translation type="unfinished">在此之åŽçš„交易尚ä¸å¯è§</translation>
</message>
<message>
<source>Error</source>
@@ -734,7 +718,7 @@ 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帮助消æ¯ä»¥èŽ·å¾—å¯èƒ½åŒ…å«Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -745,10 +729,6 @@ 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>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -770,7 +750,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">钱包å称</translation>
+ <translation type="unfinished">錢包å稱</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -786,15 +766,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 client</source>
- <translation type="unfinished">%1 客户端</translation>
+ <translation type="unfinished">%1 客戶端</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;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -806,26 +786,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<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>
+ <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>
@@ -905,7 +875,7 @@ 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;locked&lt;/b&gt;</source>
- <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&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>
@@ -927,11 +897,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Quantity:</source>
- <translation type="unfinished">总é‡:</translation>
+ <translation type="unfinished">數é‡ï¼š</translation>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">ä½å…ƒçµ„數:</translation>
+ <translation type="unfinished">ä½å…ƒçµ„:</translation>
</message>
<message>
<source>Amount:</source>
@@ -939,21 +909,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Fee:</source>
- <translation type="unfinished">费用:</translation>
+ <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>
@@ -966,18 +928,10 @@ 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>
@@ -1006,10 +960,6 @@ 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>
@@ -1045,11 +995,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(找零)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1141,10 +1087,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1194,7 +1136,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">您确定想è¦å…³é—­æ‰€æœ‰é’±åŒ…å—?</translation>
+ <translation type="unfinished">您確定è¦é—œé–‰æ‰€æœ‰éŒ¢åŒ…嗎?</translation>
</message>
</context>
<context>
@@ -1245,7 +1187,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Create</source>
- <translation type="unfinished">创建</translation>
+ <translation type="unfinished">創建</translation>
</message>
</context>
<context>
@@ -1284,7 +1226,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">地å€â€œ%1â€ç‚ºå·²ç™»è¨˜å­˜åœ¨â€œ%2â€çš„地å€ï¼Œå› æ­¤ç„¡æ³•æ–°å¢žç‚ºç™¼é€åœ°å€ã€‚</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
@@ -1307,7 +1249,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">姓å</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1315,7 +1257,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">路径已存在,并且ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚</translation>
+ <translation type="unfinished">已經有指定的路徑了,並且ä¸æ˜¯ä¸€å€‹ç›®éŒ„。</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -1352,7 +1294,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">会在此目录中存储约 %1 GB çš„æ•°æ®ã€‚</translation>
+ <translation type="unfinished">此目錄中將儲存約%1 GB 的資料。</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1383,7 +1325,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">欢迎使用 %1</translation>
+ <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>
@@ -1391,7 +1333,7 @@ The migration process will create a backup of the wallet before migrating. This
</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>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>
@@ -1437,7 +1379,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">在此窗å£æ¶ˆå¤±å‰ä¸è¦å…³é—­è®¡ç®—机。</translation>
+ <translation type="unfinished">在該視窗消失之å‰ï¼Œè«‹å‹¿é—œé–‰é›»è…¦ã€‚</translation>
</message>
</context>
<context>
@@ -1448,15 +1390,15 @@ The migration process will create a backup of the wallet before migrating. This
</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>
+ <translation type="unfinished">最近的交易å¯èƒ½é‚„看ä¸åˆ°ï¼Œå› æ­¤éŒ¢åŒ…餘é¡å¯èƒ½ä¸æ­£ç¢ºã€‚在錢包軟體完æˆè·Ÿ bitcoin 網路的åŒæ­¥å¾Œï¼Œé€™è£¡çš„資訊就會正確。詳情請見下é¢ã€‚</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>
+ <translation type="unfinished">嘗試花費å—尚未顯示的交易影響的比特幣將ä¸æœƒè¢«ç¶²è·¯æŽ¥å—。</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">剩余区å—æ•°é‡</translation>
+ <translation type="unfinished">剩餘å€å¡Šæ•¸é‡</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1468,7 +1410,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">上一区å—时间</translation>
+ <translation type="unfinished">最近å€å¡Šæ™‚é–“</translation>
</message>
<message>
<source>Progress</source>
@@ -1480,7 +1422,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Estimated time left until synced</source>
- <translation type="unfinished">预计剩余åŒæ­¥æ—¶é—´</translation>
+ <translation type="unfinished">é è¨ˆå®ŒæˆåŒæ­¥æ‰€éœ€æ™‚é–“</translation>
</message>
<message>
<source>Hide</source>
@@ -1508,7 +1450,7 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -1519,11 +1461,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>&amp;Main</source>
- <translation type="unfinished">主è¦(&amp;M)</translation>
+ <translation type="unfinished">&amp;主è¦(&amp;Main)</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">在登入系统åŽè‡ªåŠ¨å¯åŠ¨ %1</translation>
+ <translation type="unfinished">登錄系統%1後自動啟動。</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1535,11 +1477,11 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">æ•°æ®åº“缓存大å°(&amp;D)</translation>
+ <translation type="unfinished">資料庫快å–çš„å¤§å° </translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">脚本验è¯çº¿ç¨‹æ•°(&amp;V)</translation>
+ <translation type="unfinished">腳本和驗證線程數</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>
@@ -2219,11 +2161,11 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Network</source>
- <translation type="unfinished">网络</translation>
+ <translation type="unfinished">網路</translation>
</message>
<message>
<source>Name</source>
- <translation type="unfinished">å称</translation>
+ <translation type="unfinished">å稱</translation>
</message>
<message>
<source>Number of connections</source>
@@ -2286,10 +2228,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2396,6 +2334,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/类型</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2458,7 +2400,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>
@@ -2564,7 +2506,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">一天</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2588,6 +2530,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络活动已ç¦ç”¨</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">沒有</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•é’±åŒ…执行命令</translation>
</message>
@@ -2623,7 +2569,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2813,11 +2759,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2955,7 +2901,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2969,9 +2915,9 @@ For more information on using this console, type %6.
<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字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–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>
@@ -3086,6 +3032,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>External balance:</source>
+ <translation type="unfinished">外部餘é¡ï¼š</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">或</translation>
</message>
@@ -3094,6 +3044,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3225,7 +3180,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>
@@ -3282,10 +3237,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3295,7 +3246,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>
@@ -3370,10 +3321,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>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>
@@ -3426,6 +3373,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3942,11 +3896,6 @@ 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>
@@ -3956,11 +3905,7 @@ Go to File &gt; Open Wallet to load a wallet.
</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>
@@ -4010,6 +3955,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4023,7 +3972,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">无法é”定数æ®ç›®å½• %s。%s å¯èƒ½å·²ç»åœ¨è¿è¡Œã€‚</translation>
+ <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>
@@ -4051,7 +4000,9 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%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>
@@ -4090,10 +4041,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4202,10 +4149,6 @@ 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>
@@ -4340,6 +4283,10 @@ Unable to restore backup of wallet.</source>
无法还原钱包备份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">区å—验è¯å·²ä¸­æ–­</translation>
</message>
@@ -4357,7 +4304,7 @@ 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">找ä¸åˆ°asmap 檔案 %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
@@ -4448,14 +4395,34 @@ Unable to restore backup of wallet.</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: 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">錯誤:keypool已用完,請先é‡æ–°å‘¼å«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>
<translation type="unfinished">错误:此钱包已ç»åœ¨ä½¿ç”¨SQLite</translation>
</message>
@@ -4508,6 +4475,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 钱包%sçš„æ•°æ®åº“事务无法被执行</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法å¯åŠ¨ç´¢å¼•ï¼Œå…³é—­ä¸­...</translation>
</message>
@@ -4516,6 +4487,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数æ®åº“失败</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4540,6 +4519,10 @@ Unable to restore backup of wallet.</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>
@@ -4712,10 +4695,6 @@ Unable to restore backup of wallet.</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. %s is probably already running.</source>
<translation type="unfinished">沒辦法繫çµåœ¨é€™å°é›»è…¦ä¸Šçš„ %s 。%s å¯èƒ½å·²ç¶“在執行了。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_TW.ts b/src/qt/locale/bitcoin_zh_TW.ts
index 17332db7b1..72432891a9 100644
--- a/src/qt/locale/bitcoin_zh_TW.ts
+++ b/src/qt/locale/bitcoin_zh_TW.ts
@@ -179,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">輸入錢包的密碼短語和新密碼短語。</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">繼續</translation>
+ </message>
+ <message>
+ <source>Back</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>
@@ -287,7 +295,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>
@@ -436,6 +444,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 GB</source>
<translation type="unfinished">%1 GB (åå„„ä½å…ƒçµ„)</translation>
</message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -525,57 +537,40 @@ Signing is only possible with addresses of the type 'legacy'.</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>
+ <translation type="unfinished">备份钱包(&amp;B)</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>
+ <translation type="unfinished">修改密ç (&amp;C)</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>
+ <translation type="unfinished">从文件加载PSBT(&amp;L)...</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>
- </message>
- <message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">關所有錢包...</translation>
+ <translation type="unfinished">创建钱包...</translation>
</message>
<message>
<source>&amp;File</source>
@@ -594,24 +589,16 @@ 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>
+ <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>
@@ -641,7 +628,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>
@@ -746,10 +733,6 @@ 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>No wallets available</source>
<translation type="unfinished">没有å¯ç”¨çš„钱包</translation>
</message>
@@ -838,7 +821,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>Warning: %1</source>
@@ -992,15 +975,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">複製 &amp;label</translation>
+ <translation type="unfinished">å¤åˆ¶å’Œæ ‡ç­¾</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">複製 &amp;amount</translation>
+ <translation type="unfinished">å¤åˆ¶å’Œæ•°é‡</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -1146,10 +1129,6 @@ The migration process will create a backup of the wallet before migrating. This
<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>
@@ -2305,10 +2284,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<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>
@@ -2411,6 +2386,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">æ–¹å‘/é¡žåž‹</translation>
</message>
<message>
+ <source>The BIP324 session ID string in hex.</source>
+ <translation type="unfinished">å六进制格å¼çš„BIP324会è¯ID。</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>
@@ -2579,7 +2558,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>1 d&amp;ay</source>
- <translation type="unfinished">1 天(&amp;A)</translation>
+ <translation type="unfinished">1 天&amp;</translation>
</message>
<message>
<source>1 &amp;week</source>
@@ -2603,6 +2582,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">網路活動已關閉</translation>
</message>
<message>
+ <source>None</source>
+ <translation type="unfinished">ç„¡</translation>
+ </message>
+ <message>
<source>Executing command without any wallet</source>
<translation type="unfinished">ä¸ä½¿ç”¨ä»»ä½•éŒ¢åŒ…來執行指令</translation>
</message>
@@ -2638,7 +2621,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(节点: %1)</translation>
+ <translation type="unfinished">(åŒå„•:%1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2787,7 +2770,11 @@ 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>
@@ -2824,11 +2811,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Verify</source>
- <translation type="unfinished">验è¯(&amp;V)</translation>
+ <translation type="unfinished">&amp;é©—è­‰</translation>
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">在åƒæ˜¯ç¡¬ä»¶é’±åŒ…å±å¹•çš„地方检验这个地å€</translation>
+ <translation type="unfinished">在例如硬體錢包螢幕上驗證這個地å€</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2966,7 +2953,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">输入...</translation>
+ <translation type="unfinished">輸入…</translation>
</message>
<message>
<source>Choose…</source>
@@ -2980,9 +2967,9 @@ For more information on using this console, type %6.
<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字节) 自定义费率。
+ <translation type="unfinished">指定æ¯åƒå­—節(1,000字節)交易虛擬大å°çš„自訂手續費。
-附注:因为矿工费是按字节计费的,所以如果费率是“æ¯kvB支付100èªâ€ï¼Œé‚£ä¹ˆå¯¹äºŽä¸€ç¬”500虚拟字节 (1kvB的一åŠ) 的交易,最终将åªä¼šäº§ç”Ÿ50èªçš„矿工费。(译注:这里就是æ醒å•ä½æ˜¯å­—节,而ä¸æ˜¯åƒå­—节,如果æžé”™çš„è¯ï¼ŒçŸ¿å·¥è´¹ä¼šè¿‡ä½Žï¼Œå¯¼è‡´äº¤æ˜“长时间无法确认,或者压根无法å‘出)</translation>
+注æ„:由於手續費是按æ¯å­—節計算的,å°æ–¼è™›æ“¬å¤§å°ç‚º500字節(åŠåƒå­—節)的交易,手續費率為「æ¯åƒå­—節100è°ã€ï¼Œæœ€çµ‚å°‡åªæ”¶å–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>
@@ -3071,6 +3058,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Cr&eate未簽å</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>
@@ -3111,6 +3102,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3119,6 +3114,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3307,10 +3307,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<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>
@@ -3395,10 +3391,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>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>
@@ -3451,6 +3443,13 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
</context>
<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">åƒå­—節/秒</translation>
+ </message>
+</context>
+<context>
<name>TransactionDesc</name>
<message>
<source>conflicted with a transaction with %1 confirmations</source>
@@ -3971,11 +3970,6 @@ 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>
@@ -3987,10 +3981,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4039,6 +4029,10 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4080,7 +4074,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">错误: 转储文件标识符记录ä¸æ­£ç¡®ã€‚得到的是 "%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>
@@ -4119,10 +4113,6 @@ Go to File &gt; Open Wallet to load a wallet.
<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>
@@ -4231,10 +4221,6 @@ 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>
@@ -4369,6 +4355,10 @@ Unable to restore backup of wallet.</source>
無法還原錢包備份</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details: </source>
+ <translation type="unfinished">發生致命的內部錯誤,有關詳情請查看 debug.log:</translation>
+ </message>
+ <message>
<source>Block verification was interrupted</source>
<translation type="unfinished">å€å¡Šé©—證已中斷</translation>
</message>
@@ -4385,6 +4375,10 @@ Unable to restore backup of wallet.</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>
@@ -4473,14 +4467,34 @@ Unable to restore backup of wallet.</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: 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">錯誤:keypool已用完,請先é‡æ–°å‘¼å«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>
<translation type="unfinished">錯誤:此錢包已經在使用SQLite</translation>
</message>
@@ -4537,6 +4551,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">在任æ„的通訊埠è½å€™å¤±æ•—。如果你希望這樣的話,å¯ä»¥è¨­å®š -listen=0.</translation>
</message>
<message>
+ <source>Failed to read block.</source>
+ <translation type="unfinished">讀å–å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">åˆå§‹åŒ–時é‡æ–°æŽƒæ錢包失敗了</translation>
</message>
@@ -4549,6 +4567,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">無法驗證資料庫</translation>
</message>
<message>
+ <source>Failed to write block.</source>
+ <translation type="unfinished">寫入å€å¡Šå¤±æ•—。</translation>
+ </message>
+ <message>
+ <source>Failed to write to block index database.</source>
+ <translation type="unfinished">寫入å€å¡Šç´¢å¼•è³‡æ–™åº«å¤±æ•—。</translation>
+ </message>
+ <message>
<source>Failure removing transaction: %s</source>
<translation type="unfinished">%s删除交易时失败: </translation>
</message>
@@ -4781,10 +4807,6 @@ Unable to restore backup of wallet.</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 繫çµ(回傳錯誤 %s)</translation>
</message>
diff --git a/src/qt/modaloverlay.cpp b/src/qt/modaloverlay.cpp
index 7bc6ccdc49..7580f6b47a 100644
--- a/src/qt/modaloverlay.cpp
+++ b/src/qt/modaloverlay.cpp
@@ -25,6 +25,7 @@ ModalOverlay::ModalOverlay(bool enable_wallet, QWidget* parent)
parent->installEventFilter(this);
raise();
}
+ ui->closeButton->installEventFilter(this);
blockProcessTime.clear();
setVisible(false);
@@ -60,6 +61,11 @@ bool ModalOverlay::eventFilter(QObject * obj, QEvent * ev) {
raise();
}
}
+
+ if (obj == ui->closeButton && ev->type() == QEvent::FocusOut && layerIsVisible) {
+ ui->closeButton->setFocus(Qt::OtherFocusReason);
+ }
+
return QWidget::eventFilter(obj, ev);
}
@@ -187,6 +193,10 @@ void ModalOverlay::showHide(bool hide, bool userRequested)
m_animation.setEndValue(QPoint(0, hide ? height() : 0));
m_animation.start(QAbstractAnimation::KeepWhenStopped);
layerIsVisible = !hide;
+
+ if (layerIsVisible) {
+ ui->closeButton->setFocus(Qt::OtherFocusReason);
+ }
}
void ModalOverlay::closeClicked()
diff --git a/src/qt/networkstyle.cpp b/src/qt/networkstyle.cpp
index b6314f5533..d3f7c02d05 100644
--- a/src/qt/networkstyle.cpp
+++ b/src/qt/networkstyle.cpp
@@ -19,6 +19,7 @@ static const struct {
} network_styles[] = {
{ChainType::MAIN, QAPP_APP_NAME_DEFAULT, 0, 0},
{ChainType::TESTNET, QAPP_APP_NAME_TESTNET, 70, 30},
+ {ChainType::TESTNET4, QAPP_APP_NAME_TESTNET4, 70, 30},
{ChainType::SIGNET, QAPP_APP_NAME_SIGNET, 35, 15},
{ChainType::REGTEST, QAPP_APP_NAME_REGTEST, 160, 30},
};
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index ee53a59bb5..0d0fecaf0e 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -87,14 +87,15 @@ void setupFontOptions(QComboBox* cb, QLabel* preview)
}
OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet)
- : QDialog(parent, GUIUtil::dialog_flags),
+ : QDialog(parent, GUIUtil::dialog_flags | Qt::WindowMaximizeButtonHint),
ui(new Ui::OptionsDialog)
{
ui->setupUi(this);
+ ui->verticalLayout->setStretchFactor(ui->tabWidget, 1);
+
/* Main elements init */
- ui->databaseCache->setMinimum(nMinDbCache);
- ui->databaseCache->setMaximum(nMaxDbCache);
+ ui->databaseCache->setRange(nMinDbCache, std::numeric_limits<int>::max());
ui->threadsScriptVerif->setMinimum(-GetNumCores());
ui->threadsScriptVerif->setMaximum(MAX_SCRIPTCHECK_THREADS);
ui->pruneWarning->setVisible(false);
@@ -107,9 +108,6 @@ OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet)
#ifndef USE_UPNP
ui->mapPortUpnp->setEnabled(false);
#endif
-#ifndef USE_NATPMP
- ui->mapPortNatpmp->setEnabled(false);
-#endif
ui->proxyIp->setEnabled(false);
ui->proxyPort->setEnabled(false);
@@ -168,8 +166,15 @@ OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet)
/** check if the locale name consists of 2 parts (language_country) */
if(langStr.contains("_"))
{
- /** display language strings as "native language - native country (locale name)", e.g. "Deutsch - Deutschland (de)" */
- ui->lang->addItem(locale.nativeLanguageName() + QString(" - ") + locale.nativeCountryName() + QString(" (") + langStr + QString(")"), QVariant(langStr));
+ /** display language strings as "native language - native country/territory (locale name)", e.g. "Deutsch - Deutschland (de)" */
+ ui->lang->addItem(locale.nativeLanguageName() + QString(" - ") +
+#if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
+ locale.nativeTerritoryName() +
+#else
+ locale.nativeCountryName() +
+#endif
+ QString(" (") + langStr + QString(")"), QVariant(langStr));
+
}
else
{
@@ -440,7 +445,7 @@ void OptionsDialog::updateProxyValidationState()
QValidatedLineEdit *otherProxyWidget = (pUiProxyIp == ui->proxyIpTor) ? ui->proxyIp : ui->proxyIpTor;
if (pUiProxyIp->isValid() && (!ui->proxyPort->isEnabled() || ui->proxyPort->text().toInt() > 0) && (!ui->proxyPortTor->isEnabled() || ui->proxyPortTor->text().toInt() > 0))
{
- setOkButtonState(otherProxyWidget->isValid()); //only enable ok button if both proxys are valid
+ setOkButtonState(otherProxyWidget->isValid()); //only enable ok button if both proxies are valid
clearStatusLabel();
}
else
diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp
index 0c21c6748d..6a997ce556 100644
--- a/src/qt/optionsmodel.cpp
+++ b/src/qt/optionsmodel.cpp
@@ -414,11 +414,7 @@ QVariant OptionsModel::getOption(OptionID option, const std::string& suffix) con
return false;
#endif // USE_UPNP
case MapPortNatpmp:
-#ifdef USE_NATPMP
return SettingToBool(setting(), DEFAULT_NATPMP);
-#else
- return false;
-#endif // USE_NATPMP
case MinimizeOnClose:
return fMinimizeOnClose;
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index edf417a7cb..ae3f9aa686 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -560,6 +560,7 @@ RPCConsole::RPCConsole(interfaces::Node& node, const PlatformStyle *_platformSty
ui->lineEdit->setMaxLength(16 * 1024 * 1024);
ui->messagesWidget->installEventFilter(this);
+ connect(ui->hidePeersDetailButton, &QAbstractButton::clicked, this, &RPCConsole::clearSelectedNode);
connect(ui->clearButton, &QAbstractButton::clicked, [this] { clear(); });
connect(ui->fontBiggerButton, &QAbstractButton::clicked, this, &RPCConsole::fontBigger);
connect(ui->fontSmallerButton, &QAbstractButton::clicked, this, &RPCConsole::fontSmaller);
@@ -977,6 +978,18 @@ void RPCConsole::updateNetworkState()
}
ui->numberOfConnections->setText(connections);
+
+ QString local_addresses;
+ std::map<CNetAddr, LocalServiceInfo> hosts = clientModel->getNetLocalAddresses();
+ for (const auto& [addr, info] : hosts) {
+ local_addresses += QString::fromStdString(addr.ToStringAddr());
+ if (!addr.IsI2P()) local_addresses += ":" + QString::number(info.nPort);
+ local_addresses += ", ";
+ }
+ local_addresses.chop(2); // remove last ", "
+ if (local_addresses.isEmpty()) local_addresses = tr("None");
+
+ ui->localAddresses->setText(local_addresses);
}
void RPCConsole::setNumConnections(int count)
@@ -1000,15 +1013,16 @@ void RPCConsole::setNumBlocks(int count, const QDateTime& blockDate, double nVer
}
}
-void RPCConsole::setMempoolSize(long numberOfTxs, size_t dynUsage)
+void RPCConsole::setMempoolSize(long numberOfTxs, size_t dynUsage, size_t maxUsage)
{
ui->mempoolNumberTxs->setText(QString::number(numberOfTxs));
- if (dynUsage < 1000000) {
- ui->mempoolSize->setText(QObject::tr("%1 kB").arg(dynUsage / 1000.0, 0, 'f', 2));
- } else {
- ui->mempoolSize->setText(QObject::tr("%1 MB").arg(dynUsage / 1000000.0, 0, 'f', 2));
- }
+ const auto cur_usage_str = dynUsage < 1000000 ?
+ QObject::tr("%1 kB").arg(dynUsage / 1000.0, 0, 'f', 2) :
+ QObject::tr("%1 MB").arg(dynUsage / 1000000.0, 0, 'f', 2);
+ const auto max_usage_str = QObject::tr("%1 MB").arg(maxUsage / 1000000.0, 0, 'f', 2);
+
+ ui->mempoolSize->setText(cur_usage_str + " / " + max_usage_str);
}
void RPCConsole::on_lineEdit_returnPressed()
@@ -1250,6 +1264,7 @@ void RPCConsole::updateDetailWidget()
ui->peerRelayTxes->setText(stats->nodeStateStats.m_relay_txs ? ts.yes : ts.no);
}
+ ui->hidePeersDetailButton->setIcon(platformStyle->SingleColorIcon(QStringLiteral(":/icons/remove")));
ui->peersTabRightPanel->show();
}
@@ -1400,4 +1415,4 @@ void RPCConsole::updateWindowTitle()
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 d6a5035c33..4747e611d0 100644
--- a/src/qt/rpcconsole.h
+++ b/src/qt/rpcconsole.h
@@ -121,7 +121,7 @@ public Q_SLOTS:
/** Set number of blocks and last block date shown in the UI */
void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType synctype);
/** Set size (number of transactions and memory usage) of the mempool in the UI */
- void setMempoolSize(long numberOfTxs, size_t dynUsage);
+ void setMempoolSize(long numberOfTxs, size_t dynUsage, size_t maxUsage);
/** Go forward or back in history */
void browseHistory(int offset);
/** Scroll console view to end */
diff --git a/src/qt/test/CMakeLists.txt b/src/qt/test/CMakeLists.txt
new file mode 100644
index 0000000000..582ed71466
--- /dev/null
+++ b/src/qt/test/CMakeLists.txt
@@ -0,0 +1,56 @@
+# Copyright (c) 2024-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_executable(test_bitcoin-qt
+ apptests.cpp
+ optiontests.cpp
+ rpcnestedtests.cpp
+ test_main.cpp
+ uritests.cpp
+ util.cpp
+ ../../init/bitcoin-qt.cpp
+)
+
+target_link_libraries(test_bitcoin-qt
+ core_interface
+ bitcoinqt
+ test_util
+ bitcoin_node
+ Boost::headers
+ Qt5::Test
+)
+
+import_plugins(test_bitcoin-qt)
+
+if(ENABLE_WALLET)
+ target_sources(test_bitcoin-qt
+ PRIVATE
+ addressbooktests.cpp
+ wallettests.cpp
+ ../../wallet/test/wallet_test_fixture.cpp
+ )
+endif()
+
+if(NOT QT_IS_STATIC)
+ add_custom_command(
+ TARGET test_bitcoin-qt POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_PROPERTY:Qt5::QMinimalIntegrationPlugin,LOCATION_$<UPPER_CASE:$<CONFIG>>> $<TARGET_FILE_DIR:test_bitcoin-qt>/plugins/platforms
+ VERBATIM
+ )
+endif()
+
+add_test(NAME test_bitcoin-qt
+ COMMAND test_bitcoin-qt
+)
+if(WIN32 AND VCPKG_TARGET_TRIPLET)
+ # On Windows, vcpkg configures Qt with `-opengl dynamic`, which makes
+ # the "minimal" platform plugin unusable due to internal Qt bugs.
+ set_tests_properties(test_bitcoin-qt PROPERTIES
+ ENVIRONMENT "QT_QPA_PLATFORM=windows"
+ )
+endif()
+
+install(TARGETS test_bitcoin-qt
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
diff --git a/src/qt/test/Makefile b/src/qt/test/Makefile
deleted file mode 100644
index a02f86b62a..0000000000
--- a/src/qt/test/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-all:
- $(MAKE) -C ../../ test_bitcoin_qt
-clean:
- $(MAKE) -C ../../ test_bitcoin_qt_clean
-check:
- $(MAKE) -C ../../ test_bitcoin_qt_check
diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp
index f310d0a02b..958cc7ae88 100644
--- a/src/qt/test/test_main.cpp
+++ b/src/qt/test/test_main.cpp
@@ -28,22 +28,6 @@
#include <functional>
-#if defined(QT_STATICPLUGIN)
-#include <QtPlugin>
-#if defined(QT_QPA_PLATFORM_MINIMAL)
-Q_IMPORT_PLUGIN(QMinimalIntegrationPlugin);
-#endif
-#if defined(QT_QPA_PLATFORM_XCB)
-Q_IMPORT_PLUGIN(QXcbIntegrationPlugin);
-#elif defined(QT_QPA_PLATFORM_WINDOWS)
-Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
-#elif defined(QT_QPA_PLATFORM_COCOA)
-Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin);
-#elif defined(QT_QPA_PLATFORM_ANDROID)
-Q_IMPORT_PLUGIN(QAndroidPlatformIntegrationPlugin)
-#endif
-#endif
-
const std::function<void(const std::string&)> G_TEST_LOG_FUN{};
const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS{};
diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp
index 603df0b15f..6a573d284c 100644
--- a/src/qt/test/wallettests.cpp
+++ b/src/qt/test/wallettests.cpp
@@ -199,7 +199,7 @@ std::shared_ptr<CWallet> SetupLegacyWatchOnlyWallet(interfaces::Node& node, Test
wallet->SetupLegacyScriptPubKeyMan();
// Add watched key
CPubKey pubKey = test.coinbaseKey.GetPubKey();
- bool import_keys = wallet->ImportPubKeys({pubKey.GetID()}, {{pubKey.GetID(), pubKey}} , /*key_origins=*/{}, /*add_keypool=*/false, /*internal=*/false, /*timestamp=*/1);
+ bool import_keys = wallet->ImportPubKeys({{pubKey.GetID(), false}}, {{pubKey.GetID(), pubKey}} , /*key_origins=*/{}, /*add_keypool=*/false, /*timestamp=*/1);
assert(import_keys);
wallet->SetLastBlockProcessed(105, WITH_LOCK(node.context()->chainman->GetMutex(), return node.context()->chainman->ActiveChain().Tip()->GetBlockHash()));
}
@@ -218,8 +218,10 @@ std::shared_ptr<CWallet> SetupDescriptorsWallet(interfaces::Node& node, TestChai
// Add the coinbase key
FlatSigningProvider provider;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(test.coinbaseKey) + ")", provider, error, /* require_checksum=*/ false);
- assert(desc);
+ auto descs = Parse("combo(" + EncodeSecret(test.coinbaseKey) + ")", provider, error, /* require_checksum=*/ false);
+ assert(!descs.empty());
+ assert(descs.size() == 1);
+ auto& desc = descs.at(0);
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
if (!wallet->AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
CTxDestination dest = GetDestinationForKey(test.coinbaseKey.GetPubKey(), wallet->m_default_address_type);
diff --git a/src/qt/transactiondesc.h b/src/qt/transactiondesc.h
index e64f2cace1..b92df67f41 100644
--- a/src/qt/transactiondesc.h
+++ b/src/qt/transactiondesc.h
@@ -29,7 +29,7 @@ public:
static QString toHTML(interfaces::Node& node, interfaces::Wallet& wallet, TransactionRecord* rec, BitcoinUnit unit);
private:
- TransactionDesc() {}
+ TransactionDesc() = default;
static QString FormatTxStatus(const interfaces::WalletTxStatus& status, bool inMempool);
};
diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp
index d4267fcf61..9214e7723d 100644
--- a/src/qt/transactiontablemodel.cpp
+++ b/src/qt/transactiontablemodel.cpp
@@ -277,7 +277,7 @@ void TransactionTableModel::updateAmountColumnTitle()
void TransactionTableModel::updateTransaction(const QString &hash, int status, bool showTransaction)
{
uint256 updated;
- updated.SetHex(hash.toStdString());
+ updated.SetHexDeprecated(hash.toStdString());
priv->updateWallet(walletModel->wallet(), updated, status, showTransaction);
}
diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp
index 7e24dbd3ec..2aaa65c6f7 100644
--- a/src/qt/transactionview.cpp
+++ b/src/qt/transactionview.cpp
@@ -396,7 +396,7 @@ void TransactionView::contextualMenu(const QPoint &point)
// check if transaction can be abandoned, disable context menu action in case it doesn't
uint256 hash;
- hash.SetHex(selection.at(0).data(TransactionTableModel::TxHashRole).toString().toStdString());
+ hash.SetHexDeprecated(selection.at(0).data(TransactionTableModel::TxHashRole).toString().toStdString());
abandonAction->setEnabled(model->wallet().transactionCanBeAbandoned(hash));
bumpFeeAction->setEnabled(model->wallet().transactionCanBeBumped(hash));
copyAddressAction->setEnabled(GUIUtil::hasEntryData(transactionView, 0, TransactionTableModel::AddressRole));
@@ -416,7 +416,7 @@ void TransactionView::abandonTx()
// get the hash from the TxHashRole (QVariant / QString)
uint256 hash;
QString hashQStr = selection.at(0).data(TransactionTableModel::TxHashRole).toString();
- hash.SetHex(hashQStr.toStdString());
+ hash.SetHexDeprecated(hashQStr.toStdString());
// Abandon the wallet transaction over the walletModel
model->wallet().abandonTransaction(hash);
@@ -431,7 +431,7 @@ void TransactionView::bumpFee([[maybe_unused]] bool checked)
// get the hash from the TxHashRole (QVariant / QString)
uint256 hash;
QString hashQStr = selection.at(0).data(TransactionTableModel::TxHashRole).toString();
- hash.SetHex(hashQStr.toStdString());
+ hash.SetHexDeprecated(hashQStr.toStdString());
// Bump tx fee over the walletModel
uint256 newHash;
diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp
index 34b47c90a3..dd093e984a 100644
--- a/src/qt/walletcontroller.cpp
+++ b/src/qt/walletcontroller.cpp
@@ -65,20 +65,28 @@ WalletController::~WalletController()
delete m_activity_worker;
}
-std::map<std::string, bool> WalletController::listWalletDir() const
+std::map<std::string, std::pair<bool, std::string>> WalletController::listWalletDir() const
{
QMutexLocker locker(&m_mutex);
- std::map<std::string, bool> wallets;
- for (const std::string& name : m_node.walletLoader().listWalletDir()) {
- wallets[name] = false;
+ std::map<std::string, std::pair<bool, std::string>> wallets;
+ for (const auto& [name, format] : m_node.walletLoader().listWalletDir()) {
+ wallets[name] = std::make_pair(false, format);
}
for (WalletModel* wallet_model : m_wallets) {
auto it = wallets.find(wallet_model->wallet().getWalletName());
- if (it != wallets.end()) it->second = true;
+ if (it != wallets.end()) it->second.first = true;
}
return wallets;
}
+void WalletController::removeWallet(WalletModel* wallet_model)
+{
+ // Once the wallet is successfully removed from the node, the model will emit the 'WalletModel::unload' signal.
+ // This signal is already connected and will complete the removal of the view from the GUI.
+ // Look at 'WalletController::getOrCreateWallet' for the signal connection.
+ wallet_model->wallet().remove();
+}
+
void WalletController::closeWallet(WalletModel* wallet_model, QWidget* parent)
{
QMessageBox box(parent);
@@ -89,10 +97,7 @@ void WalletController::closeWallet(WalletModel* wallet_model, QWidget* parent)
box.setDefaultButton(QMessageBox::Yes);
if (box.exec() != QMessageBox::Yes) return;
- // First remove wallet from node.
- wallet_model->wallet().remove();
- // Now release the model.
- removeAndDeleteWallet(wallet_model);
+ removeWallet(wallet_model);
}
void WalletController::closeAllWallets(QWidget* parent)
@@ -105,11 +110,8 @@ void WalletController::closeAllWallets(QWidget* parent)
QMutexLocker locker(&m_mutex);
for (WalletModel* wallet_model : m_wallets) {
- wallet_model->wallet().remove();
- Q_EMIT walletRemoved(wallet_model);
- delete wallet_model;
+ removeWallet(wallet_model);
}
- m_wallets.clear();
}
WalletModel* WalletController::getOrCreateWallet(std::unique_ptr<interfaces::Wallet> wallet)
@@ -150,9 +152,10 @@ WalletModel* WalletController::getOrCreateWallet(std::unique_ptr<interfaces::Wal
assert(called);
connect(wallet_model, &WalletModel::unload, this, [this, wallet_model] {
- // Defer removeAndDeleteWallet when no modal widget is active.
+ // Defer removeAndDeleteWallet when no modal widget is actively waiting for an action.
// TODO: remove this workaround by removing usage of QDialog::exec.
- if (QApplication::activeModalWidget()) {
+ QWidget* active_dialog = QApplication::activeModalWidget();
+ if (active_dialog && dynamic_cast<QProgressDialog*>(active_dialog) == nullptr) {
connect(qApp, &QApplication::focusWindowChanged, wallet_model, [this, wallet_model]() {
if (!QApplication::activeModalWidget()) {
removeAndDeleteWallet(wallet_model);
@@ -343,7 +346,7 @@ void OpenWalletActivity::finish()
void OpenWalletActivity::open(const std::string& path)
{
- QString name = path.empty() ? QString("["+tr("default wallet")+"]") : QString::fromStdString(path);
+ QString name = GUIUtil::WalletDisplayName(path);
showProgressDialog(
//: Title of window indicating the progress of opening of a wallet.
@@ -436,12 +439,12 @@ void RestoreWalletActivity::finish()
Q_EMIT finished();
}
-void MigrateWalletActivity::migrate(WalletModel* wallet_model)
+void MigrateWalletActivity::migrate(const std::string& name)
{
// Warn the user about migration
QMessageBox box(m_parent_widget);
box.setWindowTitle(tr("Migrate wallet"));
- box.setText(tr("Are you sure you wish to migrate the wallet <i>%1</i>?").arg(GUIUtil::HtmlEscape(wallet_model->getDisplayName())));
+ box.setText(tr("Are you sure you wish to migrate the wallet <i>%1</i>?").arg(GUIUtil::HtmlEscape(GUIUtil::WalletDisplayName(name))));
box.setInformativeText(tr("Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.\n"
"If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.\n"
"If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.\n\n"
@@ -452,31 +455,25 @@ void MigrateWalletActivity::migrate(WalletModel* wallet_model)
box.setDefaultButton(QMessageBox::Yes);
if (box.exec() != QMessageBox::Yes) return;
- // Get the passphrase if it is encrypted regardless of it is locked or unlocked. We need the passphrase itself.
SecureString passphrase;
- WalletModel::EncryptionStatus enc_status = wallet_model->getEncryptionStatus();
- if (enc_status == WalletModel::EncryptionStatus::Locked || enc_status == WalletModel::EncryptionStatus::Unlocked) {
- AskPassphraseDialog dlg(AskPassphraseDialog::Unlock, m_parent_widget, &passphrase);
- dlg.setModel(wallet_model);
- dlg.exec();
+ if (node().walletLoader().isEncrypted(name)) {
+ // Get the passphrase for the wallet
+ AskPassphraseDialog dlg(AskPassphraseDialog::UnlockMigration, m_parent_widget, &passphrase);
+ if (dlg.exec() == QDialog::Rejected) return;
}
- // GUI needs to remove the wallet so that it can actually be unloaded by migration
- const std::string name = wallet_model->wallet().getWalletName();
- m_wallet_controller->removeAndDeleteWallet(wallet_model);
-
showProgressDialog(tr("Migrate Wallet"), tr("Migrating Wallet <b>%1</b>…").arg(GUIUtil::HtmlEscape(name)));
QTimer::singleShot(0, worker(), [this, name, passphrase] {
auto res{node().walletLoader().migrateWallet(name, passphrase)};
if (res) {
- m_success_message = tr("The wallet '%1' was migrated successfully.").arg(GUIUtil::HtmlEscape(res->wallet->getWalletName()));
+ m_success_message = tr("The wallet '%1' was migrated successfully.").arg(GUIUtil::HtmlEscape(GUIUtil::WalletDisplayName(res->wallet->getWalletName())));
if (res->watchonly_wallet_name) {
- m_success_message += QChar(' ') + tr("Watchonly scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(res->watchonly_wallet_name.value()));
+ m_success_message += QChar(' ') + tr("Watchonly scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(GUIUtil::WalletDisplayName(res->watchonly_wallet_name.value())));
}
if (res->solvables_wallet_name) {
- m_success_message += QChar(' ') + tr("Solvable but not watched scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(res->solvables_wallet_name.value()));
+ m_success_message += QChar(' ') + tr("Solvable but not watched scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(GUIUtil::WalletDisplayName(res->solvables_wallet_name.value())));
}
m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(res->wallet));
} else {
diff --git a/src/qt/walletcontroller.h b/src/qt/walletcontroller.h
index c595ba998d..4d2ba43539 100644
--- a/src/qt/walletcontroller.h
+++ b/src/qt/walletcontroller.h
@@ -61,13 +61,11 @@ public:
//! Returns all wallet names in the wallet dir mapped to whether the wallet
//! is loaded.
- std::map<std::string, bool> listWalletDir() const;
+ std::map<std::string, std::pair<bool, std::string>> listWalletDir() const;
void closeWallet(WalletModel* wallet_model, QWidget* parent = nullptr);
void closeAllWallets(QWidget* parent = nullptr);
- void migrateWallet(WalletModel* wallet_model, QWidget* parent = nullptr);
-
Q_SIGNALS:
void walletAdded(WalletModel* wallet_model);
void walletRemoved(WalletModel* wallet_model);
@@ -87,6 +85,9 @@ private:
friend class WalletControllerActivity;
friend class MigrateWalletActivity;
+
+ //! Starts the wallet closure procedure
+ void removeWallet(WalletModel* wallet_model);
};
class WalletControllerActivity : public QObject
@@ -186,7 +187,7 @@ class MigrateWalletActivity : public WalletControllerActivity
public:
MigrateWalletActivity(WalletController* wallet_controller, QWidget* parent) : WalletControllerActivity(wallet_controller, parent) {}
- void migrate(WalletModel* wallet_model);
+ void migrate(const std::string& path);
Q_SIGNALS:
void migrated(WalletModel* wallet_model);
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index f8ce068e12..0a01c0a45b 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -594,8 +594,7 @@ QString WalletModel::getWalletName() const
QString WalletModel::getDisplayName() const
{
- const QString name = getWalletName();
- return name.isEmpty() ? "["+tr("default wallet")+"]" : name;
+ return GUIUtil::WalletDisplayName(getWalletName());
}
bool WalletModel::isMultiwallet() const
diff --git a/src/random.cpp b/src/random.cpp
index 239d5bc6fe..c89ee9f38b 100644
--- a/src/random.cpp
+++ b/src/random.cpp
@@ -23,6 +23,7 @@
#include <array>
#include <cmath>
#include <cstdlib>
+#include <optional>
#include <thread>
#ifdef WIN32
@@ -44,13 +45,23 @@
#include <sys/auxv.h>
#endif
-[[noreturn]] static void RandFailure()
+namespace {
+
+/* Number of random bytes returned by GetOSRand.
+ * When changing this constant make sure to change all call sites, and make
+ * sure that the underlying OS APIs for all platforms support the number.
+ * (many cap out at 256 bytes).
+ */
+static const int NUM_OS_RANDOM_BYTES = 32;
+
+
+[[noreturn]] void RandFailure()
{
- LogPrintf("Failed to read randomness, aborting\n");
+ LogError("Failed to read randomness, aborting\n");
std::abort();
}
-static inline int64_t GetPerformanceCounter() noexcept
+inline int64_t GetPerformanceCounter() noexcept
{
// Read the hardware time stamp counter when available.
// See https://en.wikipedia.org/wiki/Time_Stamp_Counter for more information.
@@ -71,10 +82,10 @@ static inline int64_t GetPerformanceCounter() noexcept
}
#ifdef HAVE_GETCPUID
-static bool g_rdrand_supported = false;
-static bool g_rdseed_supported = false;
-static constexpr uint32_t CPUID_F1_ECX_RDRAND = 0x40000000;
-static constexpr uint32_t CPUID_F7_EBX_RDSEED = 0x00040000;
+bool g_rdrand_supported = false;
+bool g_rdseed_supported = false;
+constexpr uint32_t CPUID_F1_ECX_RDRAND = 0x40000000;
+constexpr uint32_t CPUID_F7_EBX_RDSEED = 0x00040000;
#ifdef bit_RDRND
static_assert(CPUID_F1_ECX_RDRAND == bit_RDRND, "Unexpected value for bit_RDRND");
#endif
@@ -82,7 +93,7 @@ static_assert(CPUID_F1_ECX_RDRAND == bit_RDRND, "Unexpected value for bit_RDRND"
static_assert(CPUID_F7_EBX_RDSEED == bit_RDSEED, "Unexpected value for bit_RDSEED");
#endif
-static void InitHardwareRand()
+void InitHardwareRand()
{
uint32_t eax, ebx, ecx, edx;
GetCPUID(1, 0, eax, ebx, ecx, edx);
@@ -95,7 +106,7 @@ static void InitHardwareRand()
}
}
-static void ReportHardwareRand()
+void ReportHardwareRand()
{
// This must be done in a separate function, as InitHardwareRand() may be indirectly called
// from global constructors, before logging is initialized.
@@ -111,7 +122,7 @@ static void ReportHardwareRand()
*
* Must only be called when RdRand is supported.
*/
-static uint64_t GetRdRand() noexcept
+uint64_t GetRdRand() noexcept
{
// RdRand may very rarely fail. Invoke it up to 10 times in a loop to reduce this risk.
#ifdef __i386__
@@ -146,7 +157,7 @@ static uint64_t GetRdRand() noexcept
*
* Must only be called when RdSeed is supported.
*/
-static uint64_t GetRdSeed() noexcept
+uint64_t GetRdSeed() noexcept
{
// RdSeed may fail when the HW RNG is overloaded. Loop indefinitely until enough entropy is gathered,
// but pause after every failure.
@@ -180,16 +191,16 @@ static uint64_t GetRdSeed() noexcept
#elif defined(__aarch64__) && defined(HWCAP2_RNG)
-static bool g_rndr_supported = false;
+bool g_rndr_supported = false;
-static void InitHardwareRand()
+void InitHardwareRand()
{
if (getauxval(AT_HWCAP2) & HWCAP2_RNG) {
g_rndr_supported = true;
}
}
-static void ReportHardwareRand()
+void ReportHardwareRand()
{
// This must be done in a separate function, as InitHardwareRand() may be indirectly called
// from global constructors, before logging is initialized.
@@ -202,7 +213,7 @@ static void ReportHardwareRand()
*
* Must only be called when RNDR is supported.
*/
-static uint64_t GetRNDR() noexcept
+uint64_t GetRNDR() noexcept
{
uint8_t ok;
uint64_t r1;
@@ -220,7 +231,7 @@ static uint64_t GetRNDR() noexcept
*
* Must only be called when RNDRRS is supported.
*/
-static uint64_t GetRNDRRS() noexcept
+uint64_t GetRNDRRS() noexcept
{
uint8_t ok;
uint64_t r1;
@@ -240,12 +251,12 @@ static uint64_t GetRNDRRS() noexcept
* Slower sources should probably be invoked separately, and/or only from
* RandAddPeriodic (which is called once a minute).
*/
-static void InitHardwareRand() {}
-static void ReportHardwareRand() {}
+void InitHardwareRand() {}
+void ReportHardwareRand() {}
#endif
/** Add 64 bits of entropy gathered from hardware to hasher. Do nothing if not supported. */
-static void SeedHardwareFast(CSHA512& hasher) noexcept {
+void SeedHardwareFast(CSHA512& hasher) noexcept {
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
if (g_rdrand_supported) {
uint64_t out = GetRdRand();
@@ -262,7 +273,7 @@ static void SeedHardwareFast(CSHA512& hasher) noexcept {
}
/** Add 256 bits of entropy gathered from hardware to hasher. Do nothing if not supported. */
-static void SeedHardwareSlow(CSHA512& hasher) noexcept {
+void SeedHardwareSlow(CSHA512& hasher) noexcept {
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
// When we want 256 bits of entropy, prefer RdSeed over RdRand, as it's
// guaranteed to produce independent randomness on every call.
@@ -295,7 +306,7 @@ static void SeedHardwareSlow(CSHA512& hasher) noexcept {
}
/** Use repeated SHA512 to strengthen the randomness in seed32, and feed into hasher. */
-static void Strengthen(const unsigned char (&seed)[32], SteadyClock::duration dur, CSHA512& hasher) noexcept
+void Strengthen(const unsigned char (&seed)[32], SteadyClock::duration dur, CSHA512& hasher) noexcept
{
CSHA512 inner_hasher;
inner_hasher.Write(seed, sizeof(seed));
@@ -326,7 +337,7 @@ static void Strengthen(const unsigned char (&seed)[32], SteadyClock::duration du
/** Fallback: get 32 bytes of system entropy from /dev/urandom. The most
* compatible way to get cryptographic randomness on UNIX-ish platforms.
*/
-[[maybe_unused]] static void GetDevURandom(unsigned char *ent32)
+[[maybe_unused]] void GetDevURandom(unsigned char *ent32)
{
int f = open("/dev/urandom", O_RDONLY);
if (f == -1) {
@@ -401,8 +412,6 @@ void GetOSRand(unsigned char *ent32)
#endif
}
-namespace {
-
class RNGState {
Mutex m_mutex;
/* The RNG state consists of 256 bits of entropy, taken from the output of
@@ -417,6 +426,10 @@ class RNGState {
uint64_t m_counter GUARDED_BY(m_mutex) = 0;
bool m_strongly_seeded GUARDED_BY(m_mutex) = false;
+ /** If not nullopt, the output of this RNGState is redirected and drawn from here
+ * (unless always_use_real_rng is passed to MixExtract). */
+ std::optional<ChaCha20> m_deterministic_prng GUARDED_BY(m_mutex);
+
Mutex m_events_mutex;
CSHA256 m_events_hasher GUARDED_BY(m_events_mutex);
@@ -457,11 +470,21 @@ public:
m_events_hasher.Write(events_hash, 32);
}
+ /** Make the output of MixExtract (unless always_use_real_rng) deterministic, with specified seed. */
+ void MakeDeterministic(const uint256& seed) noexcept EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
+ {
+ LOCK(m_mutex);
+ m_deterministic_prng.emplace(MakeByteSpan(seed));
+ }
+
/** Extract up to 32 bytes of entropy from the RNG state, mixing in new entropy from hasher.
*
* If this function has never been called with strong_seed = true, false is returned.
+ *
+ * If always_use_real_rng is false, and MakeDeterministic has been called before, output
+ * from the deterministic PRNG instead.
*/
- bool MixExtract(unsigned char* out, size_t num, CSHA512&& hasher, bool strong_seed) noexcept EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
+ bool MixExtract(unsigned char* out, size_t num, CSHA512&& hasher, bool strong_seed, bool always_use_real_rng) noexcept EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
{
assert(num <= 32);
unsigned char buf[64];
@@ -479,6 +502,13 @@ public:
hasher.Finalize(buf);
// Store the last 32 bytes of the hash output as new RNG state.
memcpy(m_state, buf + 32, 32);
+ // Handle requests for deterministic randomness.
+ if (!always_use_real_rng && m_deterministic_prng.has_value()) [[unlikely]] {
+ // Overwrite the beginning of buf, which will be used for output.
+ m_deterministic_prng->Keystream(AsWritableBytes(Span{buf, num}));
+ // Do not require strong seeding for deterministic output.
+ ret = true;
+ }
}
// If desired, copy (up to) the first 32 bytes of the hash output as output.
if (num) {
@@ -499,20 +529,19 @@ RNGState& GetRNGState() noexcept
static std::vector<RNGState, secure_allocator<RNGState>> g_rng(1);
return g_rng[0];
}
-}
/* A note on the use of noexcept in the seeding functions below:
*
* None of the RNG code should ever throw any exception.
*/
-static void SeedTimestamp(CSHA512& hasher) noexcept
+void SeedTimestamp(CSHA512& hasher) noexcept
{
int64_t perfcounter = GetPerformanceCounter();
hasher.Write((const unsigned char*)&perfcounter, sizeof(perfcounter));
}
-static void SeedFast(CSHA512& hasher) noexcept
+void SeedFast(CSHA512& hasher) noexcept
{
unsigned char buffer[32];
@@ -527,7 +556,7 @@ static void SeedFast(CSHA512& hasher) noexcept
SeedTimestamp(hasher);
}
-static void SeedSlow(CSHA512& hasher, RNGState& rng) noexcept
+void SeedSlow(CSHA512& hasher, RNGState& rng) noexcept
{
unsigned char buffer[32];
@@ -549,16 +578,17 @@ static void SeedSlow(CSHA512& hasher, RNGState& rng) noexcept
}
/** Extract entropy from rng, strengthen it, and feed it into hasher. */
-static void SeedStrengthen(CSHA512& hasher, RNGState& rng, SteadyClock::duration dur) noexcept
+void SeedStrengthen(CSHA512& hasher, RNGState& rng, SteadyClock::duration dur) noexcept
{
// Generate 32 bytes of entropy from the RNG, and a copy of the entropy already in hasher.
+ // Never use the deterministic PRNG for this, as the result is only used internally.
unsigned char strengthen_seed[32];
- rng.MixExtract(strengthen_seed, sizeof(strengthen_seed), CSHA512(hasher), false);
+ rng.MixExtract(strengthen_seed, sizeof(strengthen_seed), CSHA512(hasher), false, /*always_use_real_rng=*/true);
// Strengthen the seed, and feed it into hasher.
Strengthen(strengthen_seed, dur, hasher);
}
-static void SeedPeriodic(CSHA512& hasher, RNGState& rng) noexcept
+void SeedPeriodic(CSHA512& hasher, RNGState& rng) noexcept
{
// Everything that the 'fast' seeder includes
SeedFast(hasher);
@@ -572,13 +602,13 @@ static void SeedPeriodic(CSHA512& hasher, RNGState& rng) noexcept
// Dynamic environment data (performance monitoring, ...)
auto old_size = hasher.Size();
RandAddDynamicEnv(hasher);
- LogPrint(BCLog::RAND, "Feeding %i bytes of dynamic environment data into RNG\n", hasher.Size() - old_size);
+ LogDebug(BCLog::RAND, "Feeding %i bytes of dynamic environment data into RNG\n", hasher.Size() - old_size);
// Strengthen for 10 ms
SeedStrengthen(hasher, rng, 10ms);
}
-static void SeedStartup(CSHA512& hasher, RNGState& rng) noexcept
+void SeedStartup(CSHA512& hasher, RNGState& rng) noexcept
{
// Gather 256 bits of hardware randomness, if available
SeedHardwareSlow(hasher);
@@ -592,7 +622,7 @@ static void SeedStartup(CSHA512& hasher, RNGState& rng) noexcept
// Static environment data
RandAddStaticEnv(hasher);
- LogPrint(BCLog::RAND, "Feeding %i bytes of environment data into RNG\n", hasher.Size() - old_size);
+ LogDebug(BCLog::RAND, "Feeding %i bytes of environment data into RNG\n", hasher.Size() - old_size);
// Strengthen for 100 ms
SeedStrengthen(hasher, rng, 100ms);
@@ -604,7 +634,7 @@ enum class RNGLevel {
PERIODIC, //!< Called by RandAddPeriodic()
};
-static void ProcRand(unsigned char* out, int num, RNGLevel level) noexcept
+void ProcRand(unsigned char* out, int num, RNGLevel level, bool always_use_real_rng) noexcept
{
// Make sure the RNG is initialized first (as all Seed* function possibly need hwrand to be available).
RNGState& rng = GetRNGState();
@@ -625,65 +655,61 @@ static void ProcRand(unsigned char* out, int num, RNGLevel level) noexcept
}
// Combine with and update state
- if (!rng.MixExtract(out, num, std::move(hasher), false)) {
+ if (!rng.MixExtract(out, num, std::move(hasher), false, always_use_real_rng)) {
// On the first invocation, also seed with SeedStartup().
CSHA512 startup_hasher;
SeedStartup(startup_hasher, rng);
- rng.MixExtract(out, num, std::move(startup_hasher), true);
+ rng.MixExtract(out, num, std::move(startup_hasher), true, always_use_real_rng);
}
}
-void GetRandBytes(Span<unsigned char> bytes) noexcept { ProcRand(bytes.data(), bytes.size(), RNGLevel::FAST); }
-void GetStrongRandBytes(Span<unsigned char> bytes) noexcept { ProcRand(bytes.data(), bytes.size(), RNGLevel::SLOW); }
-void RandAddPeriodic() noexcept { ProcRand(nullptr, 0, RNGLevel::PERIODIC); }
-void RandAddEvent(const uint32_t event_info) noexcept { GetRNGState().AddEvent(event_info); }
+} // namespace
-bool g_mock_deterministic_tests{false};
-uint64_t GetRandInternal(uint64_t nMax) noexcept
+/** Internal function to set g_determinstic_rng. Only accessed from tests. */
+void MakeRandDeterministicDANGEROUS(const uint256& seed) noexcept
{
- return FastRandomContext(g_mock_deterministic_tests).randrange(nMax);
+ GetRNGState().MakeDeterministic(seed);
}
-uint256 GetRandHash() noexcept
+void GetRandBytes(Span<unsigned char> bytes) noexcept
{
- uint256 hash;
- GetRandBytes(hash);
- return hash;
+ ProcRand(bytes.data(), bytes.size(), RNGLevel::FAST, /*always_use_real_rng=*/false);
}
-void FastRandomContext::RandomSeed()
+void GetStrongRandBytes(Span<unsigned char> bytes) noexcept
{
- uint256 seed = GetRandHash();
- rng.SetKey(MakeByteSpan(seed));
- requires_seed = false;
+ ProcRand(bytes.data(), bytes.size(), RNGLevel::SLOW, /*always_use_real_rng=*/true);
}
-uint256 FastRandomContext::rand256() noexcept
+void RandAddPeriodic() noexcept
{
- if (requires_seed) RandomSeed();
- uint256 ret;
- rng.Keystream(MakeWritableByteSpan(ret));
- return ret;
+ ProcRand(nullptr, 0, RNGLevel::PERIODIC, /*always_use_real_rng=*/false);
}
-template <typename B>
-std::vector<B> FastRandomContext::randbytes(size_t len)
+void RandAddEvent(const uint32_t event_info) noexcept { GetRNGState().AddEvent(event_info); }
+
+void FastRandomContext::RandomSeed() noexcept
{
- std::vector<B> ret(len);
- fillrand(MakeWritableByteSpan(ret));
- return ret;
+ uint256 seed = GetRandHash();
+ rng.SetKey(MakeByteSpan(seed));
+ requires_seed = false;
}
-template std::vector<unsigned char> FastRandomContext::randbytes(size_t);
-template std::vector<std::byte> FastRandomContext::randbytes(size_t);
-void FastRandomContext::fillrand(Span<std::byte> output)
+void FastRandomContext::fillrand(Span<std::byte> output) noexcept
{
if (requires_seed) RandomSeed();
rng.Keystream(output);
}
-FastRandomContext::FastRandomContext(const uint256& seed) noexcept : requires_seed(false), rng(MakeByteSpan(seed)), bitbuf_size(0) {}
+FastRandomContext::FastRandomContext(const uint256& seed) noexcept : requires_seed(false), rng(MakeByteSpan(seed)) {}
+
+void FastRandomContext::Reseed(const uint256& seed) noexcept
+{
+ FlushCache();
+ requires_seed = false;
+ rng = {MakeByteSpan(seed)};
+}
bool Random_SanityCheck()
{
@@ -726,41 +752,38 @@ bool Random_SanityCheck()
CSHA512 to_add;
to_add.Write((const unsigned char*)&start, sizeof(start));
to_add.Write((const unsigned char*)&stop, sizeof(stop));
- GetRNGState().MixExtract(nullptr, 0, std::move(to_add), false);
+ GetRNGState().MixExtract(nullptr, 0, std::move(to_add), false, /*always_use_real_rng=*/true);
return true;
}
static constexpr std::array<std::byte, ChaCha20::KEYLEN> ZERO_KEY{};
-FastRandomContext::FastRandomContext(bool fDeterministic) noexcept : requires_seed(!fDeterministic), rng(ZERO_KEY), bitbuf_size(0)
+FastRandomContext::FastRandomContext(bool fDeterministic) noexcept : requires_seed(!fDeterministic), rng(ZERO_KEY)
{
// Note that despite always initializing with ZERO_KEY, requires_seed is set to true if not
// fDeterministic. That means the rng will be reinitialized with a secure random key upon first
// use.
}
-FastRandomContext& FastRandomContext::operator=(FastRandomContext&& from) noexcept
-{
- requires_seed = from.requires_seed;
- rng = from.rng;
- bitbuf = from.bitbuf;
- bitbuf_size = from.bitbuf_size;
- from.requires_seed = true;
- from.bitbuf_size = 0;
- return *this;
-}
-
void RandomInit()
{
// Invoke RNG code to trigger initialization (if not already performed)
- ProcRand(nullptr, 0, RNGLevel::FAST);
+ ProcRand(nullptr, 0, RNGLevel::FAST, /*always_use_real_rng=*/true);
ReportHardwareRand();
}
-std::chrono::microseconds GetExponentialRand(std::chrono::microseconds now, std::chrono::seconds average_interval)
+double MakeExponentiallyDistributed(uint64_t uniform) noexcept
{
- double unscaled = -std::log1p(GetRand(uint64_t{1} << 48) * -0.0000000000000035527136788 /* -1/2^48 */);
- return now + std::chrono::duration_cast<std::chrono::microseconds>(unscaled * average_interval + 0.5us);
+ // To convert uniform into an exponentially-distributed double, we use two steps:
+ // - Convert uniform into a uniformly-distributed double in range [0, 1), use the expression
+ // ((uniform >> 11) * 0x1.0p-53), as described in https://prng.di.unimi.it/ under
+ // "Generating uniform doubles in the unit interval". Call this value x.
+ // - Given an x in uniformly distributed in [0, 1), we find an exponentially distributed value
+ // by applying the quantile function to it. For the exponential distribution with mean 1 this
+ // is F(x) = -log(1 - x).
+ //
+ // Combining the two, and using log1p(x) = log(1 + x), we obtain the following:
+ return -std::log1p((uniform >> 11) * -0x1.0p-53);
}
diff --git a/src/random.h b/src/random.h
index f7c20ee4b0..536e697cca 100644
--- a/src/random.h
+++ b/src/random.h
@@ -10,12 +10,15 @@
#include <crypto/common.h>
#include <span.h>
#include <uint256.h>
+#include <util/check.h>
#include <bit>
#include <cassert>
#include <chrono>
+#include <concepts>
#include <cstdint>
#include <limits>
+#include <type_traits>
#include <vector>
/**
@@ -25,8 +28,8 @@
* The following (classes of) functions interact with that state by mixing in new
* entropy, and optionally extracting random output from it:
*
- * - The GetRand*() class of functions, as well as construction of FastRandomContext objects,
- * perform 'fast' seeding, consisting of mixing in:
+ * - GetRandBytes, GetRandHash, GetRandDur, as well as construction of FastRandomContext
+ * objects, perform 'fast' seeding, consisting of mixing in:
* - A stack pointer (indirectly committing to calling thread and call stack)
* - A high-precision timestamp (rdtsc when available, c++ high_resolution_clock otherwise)
* - 64 bits from the hardware RNG (rdrand) when available.
@@ -35,7 +38,7 @@
* FastRandomContext on the other hand does not protect against this once created, but
* is even faster (and acceptable to use inside tight loops).
*
- * - The GetStrongRand*() class of function perform 'slow' seeding, including everything
+ * - The GetStrongRandBytes() function performs 'slow' seeding, including everything
* that fast seeding includes, but additionally:
* - OS entropy (/dev/urandom, getrandom(), ...). The application will terminate if
* this entropy source fails.
@@ -50,253 +53,416 @@
* - Strengthen the entropy for 10 ms using repeated SHA512.
* This is run once every minute.
*
- * On first use of the RNG (regardless of what function is called first), all entropy
- * sources used in the 'slow' seeder are included, but also:
- * - 256 bits from the hardware RNG (rdseed or rdrand) when available.
- * - Dynamic environment data (performance monitoring, ...)
- * - Static environment data
- * - Strengthen the entropy for 100 ms using repeated SHA512.
+ * - On first use of the RNG (regardless of what function is called first), all entropy
+ * sources used in the 'slow' seeder are included, but also:
+ * - 256 bits from the hardware RNG (rdseed or rdrand) when available.
+ * - Dynamic environment data (performance monitoring, ...)
+ * - Static environment data
+ * - Strengthen the entropy for 100 ms using repeated SHA512.
*
* When mixing in new entropy, H = SHA512(entropy || old_rng_state) is computed, and
* (up to) the first 32 bytes of H are produced as output, while the last 32 bytes
* become the new RNG state.
+ *
+ * During tests, the RNG can be put into a special deterministic mode, in which the output
+ * of all RNG functions, with the exception of GetStrongRandBytes(), is replaced with the
+ * output of a deterministic RNG. This deterministic RNG does not gather entropy, and is
+ * unaffected by RandAddPeriodic() or RandAddEvent(). It produces pseudorandom data that
+ * only depends on the seed it was initialized with, possibly until it is reinitialized.
*/
+
+/* ============================= INITIALIZATION AND ADDING ENTROPY ============================= */
+
/**
- * Generate random data via the internal PRNG.
+ * Initialize global RNG state and log any CPU features that are used.
*
- * These functions are designed to be fast (sub microsecond), but do not necessarily
- * meaningfully add entropy to the PRNG state.
+ * Calling this function is optional. RNG state will be initialized when first
+ * needed if it is not called.
+ */
+void RandomInit();
+
+/**
+ * Gather entropy from various expensive sources, and feed them to the PRNG state.
*
* Thread-safe.
*/
-void GetRandBytes(Span<unsigned char> bytes) noexcept;
-/** Generate a uniform random integer in the range [0..range). Precondition: range > 0 */
-uint64_t GetRandInternal(uint64_t nMax) noexcept;
-/** Generate a uniform random integer of type T in the range [0..nMax)
- * nMax defaults to std::numeric_limits<T>::max()
- * Precondition: nMax > 0, T is an integral type, no larger than uint64_t
- */
-template<typename T>
-T GetRand(T nMax=std::numeric_limits<T>::max()) noexcept {
- static_assert(std::is_integral<T>(), "T must be integral");
- static_assert(std::numeric_limits<T>::max() <= std::numeric_limits<uint64_t>::max(), "GetRand only supports up to uint64_t");
- return T(GetRandInternal(nMax));
-}
-/** Generate a uniform random duration in the range [0..max). Precondition: max.count() > 0 */
-template <typename D>
-D GetRandomDuration(typename std::common_type<D>::type max) noexcept
-// Having the compiler infer the template argument from the function argument
-// is dangerous, because the desired return value generally has a different
-// type than the function argument. So std::common_type is used to force the
-// call site to specify the type of the return value.
-{
- assert(max.count() > 0);
- return D{GetRand(max.count())};
-};
-constexpr auto GetRandMicros = GetRandomDuration<std::chrono::microseconds>;
-constexpr auto GetRandMillis = GetRandomDuration<std::chrono::milliseconds>;
+void RandAddPeriodic() noexcept;
/**
- * Return a timestamp in the future sampled from an exponential distribution
- * (https://en.wikipedia.org/wiki/Exponential_distribution). This distribution
- * is memoryless and should be used for repeated network events (e.g. sending a
- * certain type of message) to minimize leaking information to observers.
+ * Gathers entropy from the low bits of the time at which events occur. Should
+ * be called with a uint32_t describing the event at the time an event occurs.
*
- * The probability of an event occurring before time x is 1 - e^-(x/a) where a
- * is the average interval between events.
- * */
-std::chrono::microseconds GetExponentialRand(std::chrono::microseconds now, std::chrono::seconds average_interval);
+ * Thread-safe.
+ */
+void RandAddEvent(const uint32_t event_info) noexcept;
-uint256 GetRandHash() noexcept;
+
+/* =========================== BASE RANDOMNESS GENERATION FUNCTIONS ===========================
+ *
+ * All produced randomness is eventually generated by one of these functions.
+ */
/**
- * Gather entropy from various sources, feed it into the internal PRNG, and
- * generate random data using it.
+ * Generate random data via the internal PRNG.
*
- * This function will cause failure whenever the OS RNG fails.
+ * These functions are designed to be fast (sub microsecond), but do not necessarily
+ * meaningfully add entropy to the PRNG state.
+ *
+ * In test mode (see SeedRandomForTest in src/test/util/random.h), the normal PRNG state is
+ * bypassed, and a deterministic, seeded, PRNG is used instead.
*
* Thread-safe.
*/
-void GetStrongRandBytes(Span<unsigned char> bytes) noexcept;
+void GetRandBytes(Span<unsigned char> bytes) noexcept;
/**
- * Gather entropy from various expensive sources, and feed them to the PRNG state.
+ * Gather entropy from various sources, feed it into the internal PRNG, and
+ * generate random data using it.
+ *
+ * This function will cause failure whenever the OS RNG fails.
+ *
+ * The normal PRNG is never bypassed here, even in test mode.
*
* Thread-safe.
*/
-void RandAddPeriodic() noexcept;
+void GetStrongRandBytes(Span<unsigned char> bytes) noexcept;
-/**
- * Gathers entropy from the low bits of the time at which events occur. Should
- * be called with a uint32_t describing the event at the time an event occurs.
+
+/* ============================= RANDOM NUMBER GENERATION CLASSES =============================
*
- * Thread-safe.
+ * In this section, 3 classes are defined:
+ * - RandomMixin: a base class that adds functionality to all RNG classes.
+ * - FastRandomContext: a cryptographic RNG (seeded through GetRandBytes in its default
+ * constructor).
+ * - InsecureRandomContext: a non-cryptographic, very fast, RNG.
*/
-void RandAddEvent(const uint32_t event_info) noexcept;
-/**
- * Fast randomness source. This is seeded once with secure random data, but
- * is completely deterministic and does not gather more entropy after that.
+// Forward declaration of RandomMixin, used in RandomNumberGenerator concept.
+template<typename T>
+class RandomMixin;
+
+/** A concept for RandomMixin-based random number generators. */
+template<typename T>
+concept RandomNumberGenerator = requires(T& rng, Span<std::byte> s) {
+ // A random number generator must provide rand64().
+ { rng.rand64() } noexcept -> std::same_as<uint64_t>;
+ // A random number generator must derive from RandomMixin, which adds other rand* functions.
+ requires std::derived_from<std::remove_reference_t<T>, RandomMixin<std::remove_reference_t<T>>>;
+};
+
+/** A concept for C++ std::chrono durations. */
+template<typename T>
+concept StdChronoDuration = requires {
+ []<class Rep, class Period>(std::type_identity<std::chrono::duration<Rep, Period>>){}(
+ std::type_identity<T>());
+};
+
+/** Given a uniformly random uint64_t, return an exponentially distributed double with mean 1. */
+double MakeExponentiallyDistributed(uint64_t uniform) noexcept;
+
+/** Mixin class that provides helper randomness functions.
*
- * This class is not thread-safe.
+ * Intended to be used through CRTP: https://en.cppreference.com/w/cpp/language/crtp.
+ * An RNG class FunkyRNG would derive publicly from RandomMixin<FunkyRNG>. This permits
+ * RandomMixin from accessing the derived class's rand64() function, while also allowing
+ * the derived class to provide more.
+ *
+ * The derived class must satisfy the RandomNumberGenerator concept.
*/
-class FastRandomContext
+template<typename T>
+class RandomMixin
{
private:
- bool requires_seed;
- ChaCha20 rng;
-
- uint64_t bitbuf;
- int bitbuf_size;
+ uint64_t bitbuf{0};
+ int bitbuf_size{0};
- void RandomSeed();
+ /** Access the underlying generator.
+ *
+ * This also enforces the RandomNumberGenerator concept. We cannot declare that in the template
+ * (no template<RandomNumberGenerator T>) because the type isn't fully instantiated yet there.
+ */
+ RandomNumberGenerator auto& Impl() noexcept { return static_cast<T&>(*this); }
- void FillBitBuffer()
+protected:
+ constexpr void FlushCache() noexcept
{
- bitbuf = rand64();
- bitbuf_size = 64;
+ bitbuf = 0;
+ bitbuf_size = 0;
}
public:
- explicit FastRandomContext(bool fDeterministic = false) noexcept;
-
- /** Initialize with explicit seed (only for testing) */
- explicit FastRandomContext(const uint256& seed) noexcept;
+ constexpr RandomMixin() noexcept = default;
- // Do not permit copying a FastRandomContext (move it, or create a new one to get reseeded).
- FastRandomContext(const FastRandomContext&) = delete;
- FastRandomContext(FastRandomContext&&) = delete;
- FastRandomContext& operator=(const FastRandomContext&) = delete;
-
- /** Move a FastRandomContext. If the original one is used again, it will be reseeded. */
- FastRandomContext& operator=(FastRandomContext&& from) noexcept;
-
- /** Generate a random 64-bit integer. */
- uint64_t rand64() noexcept
- {
- if (requires_seed) RandomSeed();
- std::array<std::byte, 8> buf;
- rng.Keystream(buf);
- return ReadLE64(UCharCast(buf.data()));
- }
+ // Do not permit copying or moving an RNG.
+ RandomMixin(const RandomMixin&) = delete;
+ RandomMixin& operator=(const RandomMixin&) = delete;
+ RandomMixin(RandomMixin&&) = delete;
+ RandomMixin& operator=(RandomMixin&&) = delete;
/** Generate a random (bits)-bit integer. */
uint64_t randbits(int bits) noexcept
{
- if (bits == 0) {
- return 0;
- } else if (bits > 32) {
- return rand64() >> (64 - bits);
- } else {
- if (bitbuf_size < bits) FillBitBuffer();
- uint64_t ret = bitbuf & (~uint64_t{0} >> (64 - bits));
+ Assume(bits <= 64);
+ // Requests for the full 64 bits are passed through.
+ if (bits == 64) return Impl().rand64();
+ uint64_t ret;
+ if (bits <= bitbuf_size) {
+ // If there is enough entropy left in bitbuf, return its bottom bits bits.
+ ret = bitbuf;
bitbuf >>= bits;
bitbuf_size -= bits;
- return ret;
+ } else {
+ // If not, return all of bitbuf, supplemented with the (bits - bitbuf_size) bottom
+ // bits of a newly generated 64-bit number on top. The remainder of that generated
+ // number becomes the new bitbuf.
+ uint64_t gen = Impl().rand64();
+ ret = (gen << bitbuf_size) | bitbuf;
+ bitbuf = gen >> (bits - bitbuf_size);
+ bitbuf_size = 64 + bitbuf_size - bits;
}
+ // Return the bottom bits bits of ret.
+ return ret & ((uint64_t{1} << bits) - 1);
}
- /** Generate a random integer in the range [0..range).
- * Precondition: range > 0.
- */
- uint64_t randrange(uint64_t range) noexcept
+ /** Same as above, but with compile-time fixed bits count. */
+ template<int Bits>
+ uint64_t randbits() noexcept
{
- assert(range);
- --range;
- int bits = std::bit_width(range);
+ static_assert(Bits >= 0 && Bits <= 64);
+ if constexpr (Bits == 64) {
+ return Impl().rand64();
+ } else {
+ uint64_t ret;
+ if (Bits <= bitbuf_size) {
+ ret = bitbuf;
+ bitbuf >>= Bits;
+ bitbuf_size -= Bits;
+ } else {
+ uint64_t gen = Impl().rand64();
+ ret = (gen << bitbuf_size) | bitbuf;
+ bitbuf = gen >> (Bits - bitbuf_size);
+ bitbuf_size = 64 + bitbuf_size - Bits;
+ }
+ constexpr uint64_t MASK = (uint64_t{1} << Bits) - 1;
+ return ret & MASK;
+ }
+ }
+
+ /** Generate a random integer in the range [0..range), with range > 0. */
+ template<std::integral I>
+ I randrange(I range) noexcept
+ {
+ static_assert(std::numeric_limits<I>::max() <= std::numeric_limits<uint64_t>::max());
+ Assume(range > 0);
+ uint64_t maxval = range - 1U;
+ int bits = std::bit_width(maxval);
while (true) {
- uint64_t ret = randbits(bits);
- if (ret <= range) return ret;
+ uint64_t ret = Impl().randbits(bits);
+ if (ret <= maxval) return ret;
}
}
- /** Generate random bytes. */
- template <typename B = unsigned char>
- std::vector<B> randbytes(size_t len);
+ /** Fill a Span with random bytes. */
+ void fillrand(Span<std::byte> span) noexcept
+ {
+ while (span.size() >= 8) {
+ uint64_t gen = Impl().rand64();
+ WriteLE64(UCharCast(span.data()), gen);
+ span = span.subspan(8);
+ }
+ if (span.size() >= 4) {
+ uint32_t gen = Impl().rand32();
+ WriteLE32(UCharCast(span.data()), gen);
+ span = span.subspan(4);
+ }
+ while (span.size()) {
+ span[0] = std::byte(Impl().template randbits<8>());
+ span = span.subspan(1);
+ }
+ }
- /** Fill a byte Span with random bytes. */
- void fillrand(Span<std::byte> output);
+ /** Generate a random integer in its entire (non-negative) range. */
+ template<std::integral I>
+ I rand() noexcept
+ {
+ static_assert(std::numeric_limits<I>::max() <= std::numeric_limits<uint64_t>::max());
+ static constexpr auto BITS = std::bit_width(uint64_t(std::numeric_limits<I>::max()));
+ static_assert(std::numeric_limits<I>::max() == std::numeric_limits<uint64_t>::max() >> (64 - BITS));
+ return I(Impl().template randbits<BITS>());
+ }
+
+ /** Generate random bytes. */
+ template <BasicByte B = unsigned char>
+ std::vector<B> randbytes(size_t len) noexcept
+ {
+ std::vector<B> ret(len);
+ Impl().fillrand(MakeWritableByteSpan(ret));
+ return ret;
+ }
/** Generate a random 32-bit integer. */
- uint32_t rand32() noexcept { return randbits(32); }
+ uint32_t rand32() noexcept { return Impl().template randbits<32>(); }
/** generate a random uint256. */
- uint256 rand256() noexcept;
+ uint256 rand256() noexcept
+ {
+ uint256 ret;
+ Impl().fillrand(MakeWritableByteSpan(ret));
+ return ret;
+ }
/** Generate a random boolean. */
- bool randbool() noexcept { return randbits(1); }
+ bool randbool() noexcept { return Impl().template randbits<1>(); }
/** Return the time point advanced by a uniform random duration. */
template <typename Tp>
- Tp rand_uniform_delay(const Tp& time, typename Tp::duration range)
+ Tp rand_uniform_delay(const Tp& time, typename Tp::duration range) noexcept
{
- return time + rand_uniform_duration<Tp>(range);
+ return time + Impl().template rand_uniform_duration<Tp>(range);
}
/** Generate a uniform random duration in the range from 0 (inclusive) to range (exclusive). */
- template <typename Chrono>
+ template <typename Chrono> requires StdChronoDuration<typename Chrono::duration>
typename Chrono::duration rand_uniform_duration(typename Chrono::duration range) noexcept
{
using Dur = typename Chrono::duration;
- return range.count() > 0 ? /* interval [0..range) */ Dur{randrange(range.count())} :
- range.count() < 0 ? /* interval (range..0] */ -Dur{randrange(-range.count())} :
+ return range.count() > 0 ? /* interval [0..range) */ Dur{Impl().randrange(range.count())} :
+ range.count() < 0 ? /* interval (range..0] */ -Dur{Impl().randrange(-range.count())} :
/* interval [0..0] */ Dur{0};
};
+ /** Generate a uniform random duration in the range [0..max). Precondition: max.count() > 0 */
+ template <StdChronoDuration Dur>
+ Dur randrange(typename std::common_type_t<Dur> range) noexcept
+ // Having the compiler infer the template argument from the function argument
+ // is dangerous, because the desired return value generally has a different
+ // type than the function argument. So std::common_type is used to force the
+ // call site to specify the type of the return value.
+ {
+ return Dur{Impl().randrange(range.count())};
+ }
+
+ /**
+ * Return a duration sampled from an exponential distribution
+ * (https://en.wikipedia.org/wiki/Exponential_distribution). Successive events
+ * whose intervals are distributed according to this form a memoryless Poisson
+ * process. This should be used for repeated network events (e.g. sending a
+ * certain type of message) to minimize leaking information to observers.
+ *
+ * The probability of an event occurring before time x is 1 - e^-(x/a) where a
+ * is the average interval between events.
+ * */
+ std::chrono::microseconds rand_exp_duration(std::chrono::microseconds mean) noexcept
+ {
+ using namespace std::chrono_literals;
+ auto unscaled = MakeExponentiallyDistributed(Impl().rand64());
+ return std::chrono::duration_cast<std::chrono::microseconds>(unscaled * mean + 0.5us);
+ }
+
// Compatibility with the UniformRandomBitGenerator concept
typedef uint64_t result_type;
- static constexpr uint64_t min() { return 0; }
- static constexpr uint64_t max() { return std::numeric_limits<uint64_t>::max(); }
- inline uint64_t operator()() noexcept { return rand64(); }
+ static constexpr uint64_t min() noexcept { return 0; }
+ static constexpr uint64_t max() noexcept { return std::numeric_limits<uint64_t>::max(); }
+ inline uint64_t operator()() noexcept { return Impl().rand64(); }
};
-/** More efficient than using std::shuffle on a FastRandomContext.
- *
- * This is more efficient as std::shuffle will consume entropy in groups of
- * 64 bits at the time and throw away most.
+/**
+ * Fast randomness source. This is seeded once with secure random data, but
+ * is completely deterministic and does not gather more entropy after that.
*
- * This also works around a bug in libstdc++ std::shuffle that may cause
- * type::operator=(type&&) to be invoked on itself, which the library's
- * debug mode detects and panics on. This is a known issue, see
- * https://stackoverflow.com/questions/22915325/avoiding-self-assignment-in-stdshuffle
+ * This class is not thread-safe.
*/
-template <typename I, typename R>
-void Shuffle(I first, I last, R&& rng)
+class FastRandomContext : public RandomMixin<FastRandomContext>
{
- while (first != last) {
- size_t j = rng.randrange(last - first);
- if (j) {
- using std::swap;
- swap(*first, *(first + j));
- }
- ++first;
+private:
+ bool requires_seed;
+ ChaCha20 rng;
+
+ void RandomSeed() noexcept;
+
+public:
+ /** Construct a FastRandomContext with GetRandHash()-based entropy (or zero key if fDeterministic). */
+ explicit FastRandomContext(bool fDeterministic = false) noexcept;
+
+ /** Initialize with explicit seed (only for testing) */
+ explicit FastRandomContext(const uint256& seed) noexcept;
+
+ /** Reseed with explicit seed (only for testing). */
+ void Reseed(const uint256& seed) noexcept;
+
+ /** Generate a random 64-bit integer. */
+ uint64_t rand64() noexcept
+ {
+ if (requires_seed) RandomSeed();
+ std::array<std::byte, 8> buf;
+ rng.Keystream(buf);
+ return ReadLE64(UCharCast(buf.data()));
}
-}
-/* Number of random bytes returned by GetOSRand.
- * When changing this constant make sure to change all call sites, and make
- * sure that the underlying OS APIs for all platforms support the number.
- * (many cap out at 256 bytes).
- */
-static const int NUM_OS_RANDOM_BYTES = 32;
+ /** Fill a byte Span with random bytes. This overrides the RandomMixin version. */
+ void fillrand(Span<std::byte> output) noexcept;
+};
-/** Get 32 bytes of system entropy. Do not use this in application code: use
- * GetStrongRandBytes instead.
+/** xoroshiro128++ PRNG. Extremely fast, not appropriate for cryptographic purposes.
+ *
+ * Memory footprint is very small, period is 2^128 - 1.
+ * This class is not thread-safe.
+ *
+ * Reference implementation available at https://prng.di.unimi.it/xoroshiro128plusplus.c
+ * See https://prng.di.unimi.it/
*/
-void GetOSRand(unsigned char* ent32);
+class InsecureRandomContext : public RandomMixin<InsecureRandomContext>
+{
+ uint64_t m_s0;
+ uint64_t m_s1;
+
+ [[nodiscard]] constexpr static uint64_t SplitMix64(uint64_t& seedval) noexcept
+ {
+ uint64_t z = (seedval += 0x9e3779b97f4a7c15);
+ z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
+ z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
+ return z ^ (z >> 31);
+ }
+
+public:
+ constexpr explicit InsecureRandomContext(uint64_t seedval) noexcept
+ : m_s0(SplitMix64(seedval)), m_s1(SplitMix64(seedval)) {}
+
+ constexpr void Reseed(uint64_t seedval) noexcept
+ {
+ FlushCache();
+ m_s0 = SplitMix64(seedval);
+ m_s1 = SplitMix64(seedval);
+ }
+
+ constexpr uint64_t rand64() noexcept
+ {
+ uint64_t s0 = m_s0, s1 = m_s1;
+ const uint64_t result = std::rotl(s0 + s1, 17) + s0;
+ s1 ^= s0;
+ m_s0 = std::rotl(s0, 49) ^ s1 ^ (s1 << 21);
+ m_s1 = std::rotl(s1, 28);
+ return result;
+ }
+};
+
+
+/* ==================== CONVENIENCE FUNCTIONS FOR COMMONLY USED RANDOMNESS ==================== */
+
+/** Generate a random uint256. */
+inline uint256 GetRandHash() noexcept
+{
+ uint256 hash;
+ GetRandBytes(hash);
+ return hash;
+}
+
+/* ============================= MISCELLANEOUS TEST-ONLY FUNCTIONS ============================= */
/** Check that OS randomness is available and returning the requested number
* of bytes.
*/
bool Random_SanityCheck();
-/**
- * Initialize global RNG state and log any CPU features that are used.
- *
- * Calling this function is optional. RNG state will be initialized when first
- * needed if it is not called.
- */
-void RandomInit();
-
#endif // BITCOIN_RANDOM_H
diff --git a/src/randomenv.cpp b/src/randomenv.cpp
index 49033deef2..4754b597c5 100644
--- a/src/randomenv.cpp
+++ b/src/randomenv.cpp
@@ -58,7 +58,9 @@
#include <sys/auxv.h>
#endif
+#ifndef _MSC_VER
extern char** environ; // NOLINT(readability-redundant-declaration): Necessary on some platforms
+#endif
namespace {
@@ -69,10 +71,10 @@ void RandAddSeedPerfmon(CSHA512& hasher)
// This can take up to 2 seconds, so only do it every 10 minutes.
// Initialize last_perfmon to 0 seconds, we don't skip the first call.
- static std::atomic<std::chrono::seconds> last_perfmon{0s};
+ static std::atomic<SteadyClock::time_point> last_perfmon{SteadyClock::time_point{0s}};
auto last_time = last_perfmon.load();
- auto current_time = GetTime<std::chrono::seconds>();
- if (current_time < last_time + std::chrono::minutes{10}) return;
+ auto current_time = SteadyClock::now();
+ if (current_time < last_time + 10min) return;
last_perfmon = current_time;
std::vector<unsigned char> vData(250000, 0);
diff --git a/src/rest.cpp b/src/rest.cpp
index 4abbc4d2ca..4732922a15 100644
--- a/src/rest.cpp
+++ b/src/rest.cpp
@@ -217,9 +217,10 @@ static bool rest_headers(const std::any& context,
return RESTERR(req, HTTP_BAD_REQUEST, strprintf("Header count is invalid or out of acceptable range (1-%u): %s", MAX_REST_HEADERS_RESULTS, raw_count));
}
- uint256 hash;
- if (!ParseHashStr(hashStr, hash))
+ auto hash{uint256::FromHex(hashStr)};
+ if (!hash) {
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hashStr);
+ }
const CBlockIndex* tip = nullptr;
std::vector<const CBlockIndex*> headers;
@@ -231,7 +232,7 @@ static bool rest_headers(const std::any& context,
LOCK(cs_main);
CChain& active_chain = chainman.ActiveChain();
tip = active_chain.Tip();
- const CBlockIndex* pindex = chainman.m_blockman.LookupBlockIndex(hash);
+ const CBlockIndex* pindex{chainman.m_blockman.LookupBlockIndex(*hash)};
while (pindex != nullptr && active_chain.Contains(pindex)) {
headers.push_back(pindex);
if (headers.size() == *parsed_count) {
@@ -290,9 +291,10 @@ static bool rest_block(const std::any& context,
std::string hashStr;
const RESTResponseFormat rf = ParseDataFormat(hashStr, strURIPart);
- uint256 hash;
- if (!ParseHashStr(hashStr, hash))
+ auto hash{uint256::FromHex(hashStr)};
+ if (!hash) {
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hashStr);
+ }
FlatFilePos pos{};
const CBlockIndex* pblockindex = nullptr;
@@ -303,12 +305,15 @@ static bool rest_block(const std::any& context,
{
LOCK(cs_main);
tip = chainman.ActiveChain().Tip();
- pblockindex = chainman.m_blockman.LookupBlockIndex(hash);
+ pblockindex = chainman.m_blockman.LookupBlockIndex(*hash);
if (!pblockindex) {
return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not found");
}
- if (chainman.m_blockman.IsBlockPruned(*pblockindex)) {
- return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not available (pruned data)");
+ if (!(pblockindex->nStatus & BLOCK_HAVE_DATA)) {
+ if (chainman.m_blockman.IsBlockPruned(*pblockindex)) {
+ return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not available (pruned data)");
+ }
+ return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not available (not fully downloaded)");
}
pos = pblockindex->GetBlockPos();
}
@@ -390,8 +395,8 @@ static bool rest_filter_header(const std::any& context, HTTPRequest* req, const
return RESTERR(req, HTTP_BAD_REQUEST, strprintf("Header count is invalid or out of acceptable range (1-%u): %s", MAX_REST_HEADERS_RESULTS, raw_count));
}
- uint256 block_hash;
- if (!ParseHashStr(raw_blockhash, block_hash)) {
+ auto block_hash{uint256::FromHex(raw_blockhash)};
+ if (!block_hash) {
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + raw_blockhash);
}
@@ -413,7 +418,7 @@ static bool rest_filter_header(const std::any& context, HTTPRequest* req, const
ChainstateManager& chainman = *maybe_chainman;
LOCK(cs_main);
CChain& active_chain = chainman.ActiveChain();
- const CBlockIndex* pindex = chainman.m_blockman.LookupBlockIndex(block_hash);
+ const CBlockIndex* pindex{chainman.m_blockman.LookupBlockIndex(*block_hash)};
while (pindex != nullptr && active_chain.Contains(pindex)) {
headers.push_back(pindex);
if (headers.size() == *parsed_count)
@@ -494,8 +499,8 @@ static bool rest_block_filter(const std::any& context, HTTPRequest* req, const s
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid URI format. Expected /rest/blockfilter/<filtertype>/<blockhash>");
}
- uint256 block_hash;
- if (!ParseHashStr(uri_parts[1], block_hash)) {
+ auto block_hash{uint256::FromHex(uri_parts[1])};
+ if (!block_hash) {
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + uri_parts[1]);
}
@@ -516,7 +521,7 @@ static bool rest_block_filter(const std::any& context, HTTPRequest* req, const s
if (!maybe_chainman) return false;
ChainstateManager& chainman = *maybe_chainman;
LOCK(cs_main);
- block_index = chainman.m_blockman.LookupBlockIndex(block_hash);
+ block_index = chainman.m_blockman.LookupBlockIndex(*block_hash);
if (!block_index) {
return RESTERR(req, HTTP_NOT_FOUND, uri_parts[1] + " not found");
}
@@ -616,14 +621,14 @@ static bool rest_deploymentinfo(const std::any& context, HTTPRequest* req, const
jsonRequest.params = UniValue(UniValue::VARR);
if (!hash_str.empty()) {
- uint256 hash;
- if (!ParseHashStr(hash_str, hash)) {
+ auto hash{uint256::FromHex(hash_str)};
+ if (!hash) {
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hash_str);
}
const ChainstateManager* chainman = GetChainman(context, req);
if (!chainman) return false;
- if (!WITH_LOCK(::cs_main, return chainman->m_blockman.LookupBlockIndex(ParseHashV(hash_str, "blockhash")))) {
+ if (!WITH_LOCK(::cs_main, return chainman->m_blockman.LookupBlockIndex(*hash))) {
return RESTERR(req, HTTP_BAD_REQUEST, "Block not found");
}
@@ -704,9 +709,10 @@ static bool rest_tx(const std::any& context, HTTPRequest* req, const std::string
std::string hashStr;
const RESTResponseFormat rf = ParseDataFormat(hashStr, strURIPart);
- uint256 hash;
- if (!ParseHashStr(hashStr, hash))
+ auto hash{uint256::FromHex(hashStr)};
+ if (!hash) {
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hashStr);
+ }
if (g_txindex) {
g_txindex->BlockUntilSyncedToCurrentChain();
@@ -715,7 +721,7 @@ static bool rest_tx(const std::any& context, HTTPRequest* req, const std::string
const NodeContext* const node = GetNodeContext(context, req);
if (!node) return false;
uint256 hashBlock = uint256();
- const CTransactionRef tx = GetTransaction(/*block_index=*/nullptr, node->mempool.get(), hash, hashBlock, node->chainman->m_blockman);
+ const CTransactionRef tx{GetTransaction(/*block_index=*/nullptr, node->mempool.get(), *hash, hashBlock, node->chainman->m_blockman)};
if (!tx) {
return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not found");
}
@@ -788,14 +794,18 @@ static bool rest_getutxos(const std::any& context, HTTPRequest* req, const std::
for (size_t i = (fCheckMemPool) ? 1 : 0; i < uriParts.size(); i++)
{
- int32_t nOutput;
- std::string strTxid = uriParts[i].substr(0, uriParts[i].find('-'));
- std::string strOutput = uriParts[i].substr(uriParts[i].find('-')+1);
+ const auto txid_out{util::Split<std::string_view>(uriParts[i], '-')};
+ if (txid_out.size() != 2) {
+ return RESTERR(req, HTTP_BAD_REQUEST, "Parse error");
+ }
+ auto txid{Txid::FromHex(txid_out.at(0))};
+ auto output{ToIntegral<uint32_t>(txid_out.at(1))};
- if (!ParseInt32(strOutput, &nOutput) || !IsHex(strTxid))
+ if (!txid || !output) {
return RESTERR(req, HTTP_BAD_REQUEST, "Parse error");
+ }
- vOutPoints.emplace_back(TxidFromString(strTxid), (uint32_t)nOutput);
+ vOutPoints.emplace_back(*txid, *output);
}
if (vOutPoints.size() > 0)
diff --git a/src/reverse_iterator.h b/src/reverse_iterator.h
deleted file mode 100644
index 4db001c04b..0000000000
--- a/src/reverse_iterator.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Taken from https://gist.github.com/arvidsson/7231973
-
-#ifndef BITCOIN_REVERSE_ITERATOR_H
-#define BITCOIN_REVERSE_ITERATOR_H
-
-/**
- * Template used for reverse iteration in range-based for loops.
- *
- * std::vector<int> v = {1, 2, 3, 4, 5};
- * for (auto x : reverse_iterate(v))
- * std::cout << x << " ";
- */
-
-template <typename T>
-class reverse_range
-{
- T &m_x;
-
-public:
- explicit reverse_range(T &x) : m_x(x) {}
-
- auto begin() const -> decltype(this->m_x.rbegin())
- {
- return m_x.rbegin();
- }
-
- auto end() const -> decltype(this->m_x.rend())
- {
- return m_x.rend();
- }
-};
-
-template <typename T>
-reverse_range<T> reverse_iterate(T &x)
-{
- return reverse_range<T>(x);
-}
-
-#endif // BITCOIN_REVERSE_ITERATOR_H
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
index d0065cb1a6..c4fc06b34e 100644
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -8,6 +8,7 @@
#include <blockfilter.h>
#include <chain.h>
#include <chainparams.h>
+#include <chainparamsbase.h>
#include <clientversion.h>
#include <coins.h>
#include <common/args.h>
@@ -21,6 +22,7 @@
#include <hash.h>
#include <index/blockfilterindex.h>
#include <index/coinstatsindex.h>
+#include <interfaces/mining.h>
#include <kernel/coinstats.h>
#include <logging/timer.h>
#include <net.h>
@@ -55,26 +57,32 @@
#include <condition_variable>
#include <memory>
#include <mutex>
+#include <optional>
using kernel::CCoinsStats;
using kernel::CoinStatsHashType;
+using interfaces::Mining;
using node::BlockManager;
using node::NodeContext;
using node::SnapshotMetadata;
-using util::Join;
using util::MakeUnorderedList;
-using util::ToString;
-struct CUpdatedBlock
-{
- uint256 hash;
- int height;
-};
+std::tuple<std::unique_ptr<CCoinsViewCursor>, CCoinsStats, const CBlockIndex*>
+PrepareUTXOSnapshot(
+ Chainstate& chainstate,
+ const std::function<void()>& interruption_point = {})
+ EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
-static GlobalMutex cs_blockchange;
-static std::condition_variable cond_blockchange;
-static CUpdatedBlock latestblock GUARDED_BY(cs_blockchange);
+UniValue WriteUTXOSnapshot(
+ Chainstate& chainstate,
+ CCoinsViewCursor* pcursor,
+ CCoinsStats* maybe_stats,
+ const CBlockIndex* tip,
+ AutoFile& afile,
+ const fs::path& path,
+ const fs::path& temppath,
+ const std::function<void()>& interruption_point = {});
/* Calculate the difficulty for a given block index.
*/
@@ -185,8 +193,10 @@ UniValue blockToJSON(BlockManager& blockman, const CBlock& block, const CBlockIn
case TxVerbosity::SHOW_DETAILS_AND_PREVOUT:
CBlockUndo blockUndo;
const bool is_not_pruned{WITH_LOCK(::cs_main, return !blockman.IsBlockPruned(blockindex))};
- const bool have_undo{is_not_pruned && blockman.UndoReadFromDisk(blockUndo, blockindex)};
-
+ bool have_undo{is_not_pruned && WITH_LOCK(::cs_main, return blockindex.nStatus & BLOCK_HAVE_UNDO)};
+ if (have_undo && !blockman.UndoReadFromDisk(blockUndo, blockindex)) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Undo data expected but can't be read. This could be due to disk corruption or a conflict with a pruning event.");
+ }
for (size_t i = 0; i < block.vtx.size(); ++i) {
const CTransactionRef& tx = block.vtx.at(i);
// coinbase transaction (i.e. i == 0) doesn't have undo data
@@ -244,21 +254,12 @@ static RPCHelpMan getbestblockhash()
};
}
-void RPCNotifyBlockChange(const CBlockIndex* pindex)
-{
- if(pindex) {
- LOCK(cs_blockchange);
- latestblock.hash = pindex->GetBlockHash();
- latestblock.height = pindex->nHeight;
- }
- cond_blockchange.notify_all();
-}
-
static RPCHelpMan waitfornewblock()
{
return RPCHelpMan{"waitfornewblock",
- "\nWaits for a specific new block and returns useful info about it.\n"
- "\nReturns the current block on timeout or exit.\n",
+ "\nWaits for any new block and returns useful info about it.\n"
+ "\nReturns the current block on timeout or exit.\n"
+ "\nMake sure to use no RPC timeout (bitcoin-cli -rpcclienttimeout=0)",
{
{"timeout", RPCArg::Type::NUM, RPCArg::Default{0}, "Time in milliseconds to wait for a response. 0 indicates no timeout."},
},
@@ -277,17 +278,16 @@ static RPCHelpMan waitfornewblock()
int timeout = 0;
if (!request.params[0].isNull())
timeout = request.params[0].getInt<int>();
+ if (timeout < 0) throw JSONRPCError(RPC_MISC_ERROR, "Negative timeout");
- CUpdatedBlock block;
- {
- WAIT_LOCK(cs_blockchange, lock);
- block = latestblock;
- if(timeout)
- cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&block]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.height != block.height || latestblock.hash != block.hash || !IsRPCRunning(); });
- else
- cond_blockchange.wait(lock, [&block]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.height != block.height || latestblock.hash != block.hash || !IsRPCRunning(); });
- block = latestblock;
+ NodeContext& node = EnsureAnyNodeContext(request.context);
+ Mining& miner = EnsureMining(node);
+
+ auto block{CHECK_NONFATAL(miner.getTip()).value()};
+ if (IsRPCRunning()) {
+ block = timeout ? miner.waitTipChanged(block.hash, std::chrono::milliseconds(timeout)) : miner.waitTipChanged(block.hash);
}
+
UniValue ret(UniValue::VOBJ);
ret.pushKV("hash", block.hash.GetHex());
ret.pushKV("height", block.height);
@@ -300,7 +300,8 @@ static RPCHelpMan waitforblock()
{
return RPCHelpMan{"waitforblock",
"\nWaits for a specific new block and returns useful info about it.\n"
- "\nReturns the current block on timeout or exit.\n",
+ "\nReturns the current block on timeout or exit.\n"
+ "\nMake sure to use no RPC timeout (bitcoin-cli -rpcclienttimeout=0)",
{
{"blockhash", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "Block hash to wait for."},
{"timeout", RPCArg::Type::NUM, RPCArg::Default{0}, "Time in milliseconds to wait for a response. 0 indicates no timeout."},
@@ -323,15 +324,22 @@ static RPCHelpMan waitforblock()
if (!request.params[1].isNull())
timeout = request.params[1].getInt<int>();
+ if (timeout < 0) throw JSONRPCError(RPC_MISC_ERROR, "Negative timeout");
- CUpdatedBlock block;
- {
- WAIT_LOCK(cs_blockchange, lock);
- if(timeout)
- cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&hash]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.hash == hash || !IsRPCRunning();});
- else
- cond_blockchange.wait(lock, [&hash]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.hash == hash || !IsRPCRunning(); });
- block = latestblock;
+ NodeContext& node = EnsureAnyNodeContext(request.context);
+ Mining& miner = EnsureMining(node);
+
+ auto block{CHECK_NONFATAL(miner.getTip()).value()};
+ const auto deadline{std::chrono::steady_clock::now() + 1ms * timeout};
+ while (IsRPCRunning() && block.hash != hash) {
+ if (timeout) {
+ auto now{std::chrono::steady_clock::now()};
+ if (now >= deadline) break;
+ const MillisecondsDouble remaining{deadline - now};
+ block = miner.waitTipChanged(block.hash, remaining);
+ } else {
+ block = miner.waitTipChanged(block.hash);
+ }
}
UniValue ret(UniValue::VOBJ);
@@ -347,7 +355,8 @@ static RPCHelpMan waitforblockheight()
return RPCHelpMan{"waitforblockheight",
"\nWaits for (at least) block height and returns the height and hash\n"
"of the current tip.\n"
- "\nReturns the current block on timeout or exit.\n",
+ "\nReturns the current block on timeout or exit.\n"
+ "\nMake sure to use no RPC timeout (bitcoin-cli -rpcclienttimeout=0)",
{
{"height", RPCArg::Type::NUM, RPCArg::Optional::NO, "Block height to wait for."},
{"timeout", RPCArg::Type::NUM, RPCArg::Default{0}, "Time in milliseconds to wait for a response. 0 indicates no timeout."},
@@ -370,16 +379,25 @@ static RPCHelpMan waitforblockheight()
if (!request.params[1].isNull())
timeout = request.params[1].getInt<int>();
+ if (timeout < 0) throw JSONRPCError(RPC_MISC_ERROR, "Negative timeout");
- CUpdatedBlock block;
- {
- WAIT_LOCK(cs_blockchange, lock);
- if(timeout)
- cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&height]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.height >= height || !IsRPCRunning();});
- else
- cond_blockchange.wait(lock, [&height]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.height >= height || !IsRPCRunning(); });
- block = latestblock;
+ NodeContext& node = EnsureAnyNodeContext(request.context);
+ Mining& miner = EnsureMining(node);
+
+ auto block{CHECK_NONFATAL(miner.getTip()).value()};
+ const auto deadline{std::chrono::steady_clock::now() + 1ms * timeout};
+
+ while (IsRPCRunning() && block.height < height) {
+ if (timeout) {
+ auto now{std::chrono::steady_clock::now()};
+ if (now >= deadline) break;
+ const MillisecondsDouble remaining{deadline - now};
+ block = miner.waitTipChanged(block.hash, remaining);
+ } else {
+ block = miner.waitTipChanged(block.hash);
+ }
}
+
UniValue ret(UniValue::VOBJ);
ret.pushKV("hash", block.hash.GetHex());
ret.pushKV("height", block.height);
@@ -433,6 +451,7 @@ static RPCHelpMan getblockfrompeer()
"getblockfrompeer",
"Attempt to fetch block from a given peer.\n\n"
"We must have the header for this block, e.g. using submitheader.\n"
+ "The block will not have any undo data which can limit the usage of the block data in a context where the undo data is needed.\n"
"Subsequent calls for the same block may cause the response from the previous peer to be ignored.\n"
"Peers generally ignore requests for a stale block that they never fully verified, or one that is more than a month old.\n"
"When a peer does not respond with a block, we will disconnect.\n"
@@ -580,20 +599,32 @@ static RPCHelpMan getblockheader()
};
}
+void CheckBlockDataAvailability(BlockManager& blockman, const CBlockIndex& blockindex, bool check_for_undo)
+{
+ AssertLockHeld(cs_main);
+ uint32_t flag = check_for_undo ? BLOCK_HAVE_UNDO : BLOCK_HAVE_DATA;
+ if (!(blockindex.nStatus & flag)) {
+ if (blockman.IsBlockPruned(blockindex)) {
+ throw JSONRPCError(RPC_MISC_ERROR, strprintf("%s not available (pruned data)", check_for_undo ? "Undo data" : "Block"));
+ }
+ if (check_for_undo) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Undo data not available");
+ }
+ throw JSONRPCError(RPC_MISC_ERROR, "Block not available (not fully downloaded)");
+ }
+}
+
static CBlock GetBlockChecked(BlockManager& blockman, const CBlockIndex& blockindex)
{
CBlock block;
{
LOCK(cs_main);
- if (blockman.IsBlockPruned(blockindex)) {
- throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
- }
+ CheckBlockDataAvailability(blockman, blockindex, /*check_for_undo=*/false);
}
if (!blockman.ReadBlockFromDisk(block, blockindex)) {
- // Block not found on disk. This could be because we have the block
- // header in our index but not yet have the block or did not accept the
- // block. Or if the block was pruned right after we released the lock above.
+ // Block not found on disk. This shouldn't normally happen unless the block was
+ // pruned right after we released the lock above.
throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
}
@@ -606,16 +637,13 @@ static std::vector<uint8_t> GetRawBlockChecked(BlockManager& blockman, const CBl
FlatFilePos pos{};
{
LOCK(cs_main);
- if (blockman.IsBlockPruned(blockindex)) {
- throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
- }
+ CheckBlockDataAvailability(blockman, blockindex, /*check_for_undo=*/false);
pos = blockindex.GetBlockPos();
}
if (!blockman.ReadRawBlockFromDisk(data, pos)) {
- // Block not found on disk. This could be because we have the block
- // header in our index but not yet have the block or did not accept the
- // block. Or if the block was pruned right after we released the lock above.
+ // Block not found on disk. This shouldn't normally happen unless the block was
+ // pruned right after we released the lock above.
throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
}
@@ -631,9 +659,7 @@ static CBlockUndo GetUndoChecked(BlockManager& blockman, const CBlockIndex& bloc
{
LOCK(cs_main);
- if (blockman.IsBlockPruned(blockindex)) {
- throw JSONRPCError(RPC_MISC_ERROR, "Undo data not available (pruned data)");
- }
+ CheckBlockDataAvailability(blockman, blockindex, /*check_for_undo=*/true);
}
if (!blockman.UndoReadFromDisk(blockUndo, blockindex)) {
@@ -656,9 +682,9 @@ const RPCResult getblock_vin{
{RPCResult::Type::STR_AMOUNT, "value", "The value in " + CURRENCY_UNIT},
{RPCResult::Type::OBJ, "scriptPubKey", "",
{
- {RPCResult::Type::STR, "asm", "Disassembly of the public key script"},
+ {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
{RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
- {RPCResult::Type::STR_HEX, "hex", "The raw public key script bytes, hex-encoded"},
+ {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
{RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
{RPCResult::Type::STR, "type", "The type (one of: " + GetAllOutputTypes() + ")"},
}},
@@ -786,6 +812,32 @@ static RPCHelpMan getblock()
};
}
+//! Return height of highest block that has been pruned, or std::nullopt if no blocks have been pruned
+std::optional<int> GetPruneHeight(const BlockManager& blockman, const CChain& chain) {
+ AssertLockHeld(::cs_main);
+
+ // Search for the last block missing block data or undo data. Don't let the
+ // search consider the genesis block, because the genesis block does not
+ // have undo data, but should not be considered pruned.
+ const CBlockIndex* first_block{chain[1]};
+ const CBlockIndex* chain_tip{chain.Tip()};
+
+ // If there are no blocks after the genesis block, or no blocks at all, nothing is pruned.
+ if (!first_block || !chain_tip) return std::nullopt;
+
+ // If the chain tip is pruned, everything is pruned.
+ if (!((chain_tip->nStatus & BLOCK_HAVE_MASK) == BLOCK_HAVE_MASK)) return chain_tip->nHeight;
+
+ const auto& first_unpruned{*CHECK_NONFATAL(blockman.GetFirstBlock(*chain_tip, /*status_mask=*/BLOCK_HAVE_MASK, first_block))};
+ if (&first_unpruned == first_block) {
+ // All blocks between first_block and chain_tip have data, so nothing is pruned.
+ return std::nullopt;
+ }
+
+ // Block before the first unpruned block is the last pruned block.
+ return CHECK_NONFATAL(first_unpruned.pprev)->nHeight;
+}
+
static RPCHelpMan pruneblockchain()
{
return RPCHelpMan{"pruneblockchain", "",
@@ -833,13 +885,12 @@ static RPCHelpMan pruneblockchain()
} else if (height > chainHeight) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Blockchain is shorter than the attempted prune height.");
} else if (height > chainHeight - MIN_BLOCKS_TO_KEEP) {
- LogPrint(BCLog::RPC, "Attempt to prune blocks close to the tip. Retaining the minimum number of blocks.\n");
+ LogDebug(BCLog::RPC, "Attempt to prune blocks close to the tip. Retaining the minimum number of blocks.\n");
height = chainHeight - MIN_BLOCKS_TO_KEEP;
}
PruneBlockFilesManual(active_chainstate, height);
- const CBlockIndex& block{*CHECK_NONFATAL(active_chain.Tip())};
- return block.nStatus & BLOCK_HAVE_DATA ? active_chainstate.m_blockman.GetFirstStoredBlock(block)->nHeight - 1 : block.nHeight;
+ return GetPruneHeight(chainman.m_blockman, active_chain).value_or(-1);
},
};
}
@@ -1058,9 +1109,9 @@ static RPCHelpMan gettxout()
{RPCResult::Type::NUM, "confirmations", "The number of confirmations"},
{RPCResult::Type::STR_AMOUNT, "value", "The transaction value in " + CURRENCY_UNIT},
{RPCResult::Type::OBJ, "scriptPubKey", "", {
- {RPCResult::Type::STR, "asm", "Disassembly of the public key script"},
+ {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
{RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
- {RPCResult::Type::STR_HEX, "hex", "The raw public key script bytes, hex-encoded"},
+ {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
{RPCResult::Type::STR, "type", "The type, eg pubkeyhash"},
{RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
}},
@@ -1249,7 +1300,7 @@ RPCHelpMan getblockchaininfo()
RPCResult{
RPCResult::Type::OBJ, "", "",
{
- {RPCResult::Type::STR, "chain", "current network name (main, test, signet, regtest)"},
+ {RPCResult::Type::STR, "chain", "current network name (" LIST_CHAIN_NAMES ")"},
{RPCResult::Type::NUM, "blocks", "the height of the most-work fully-validated chain. The genesis block has height 0"},
{RPCResult::Type::NUM, "headers", "the current number of headers we have validated"},
{RPCResult::Type::STR, "bestblockhash", "the hash of the currently best block"},
@@ -1299,8 +1350,8 @@ RPCHelpMan getblockchaininfo()
obj.pushKV("size_on_disk", chainman.m_blockman.CalculateCurrentUsage());
obj.pushKV("pruned", chainman.m_blockman.IsPruneMode());
if (chainman.m_blockman.IsPruneMode()) {
- bool has_tip_data = tip.nStatus & BLOCK_HAVE_DATA;
- obj.pushKV("pruneheight", has_tip_data ? chainman.m_blockman.GetFirstStoredBlock(tip)->nHeight : tip.nHeight + 1);
+ const auto prune_height{GetPruneHeight(chainman.m_blockman, active_chainstate.m_chain)};
+ obj.pushKV("pruneheight", prune_height ? prune_height.value() + 1 : 0);
const bool automatic_pruning{chainman.m_blockman.GetPruneTarget() != BlockManager::PRUNE_TARGET_MANUAL};
obj.pushKV("automatic_pruning", automatic_pruning);
@@ -1552,6 +1603,27 @@ static RPCHelpMan preciousblock()
};
}
+void InvalidateBlock(ChainstateManager& chainman, const uint256 block_hash) {
+ BlockValidationState state;
+ CBlockIndex* pblockindex;
+ {
+ LOCK(chainman.GetMutex());
+ pblockindex = chainman.m_blockman.LookupBlockIndex(block_hash);
+ if (!pblockindex) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
+ }
+ }
+ chainman.ActiveChainstate().InvalidateBlock(state, pblockindex);
+
+ if (state.IsValid()) {
+ chainman.ActiveChainstate().ActivateBestChain(state);
+ }
+
+ if (!state.IsValid()) {
+ throw JSONRPCError(RPC_DATABASE_ERROR, state.ToString());
+ }
+}
+
static RPCHelpMan invalidateblock()
{
return RPCHelpMan{"invalidateblock",
@@ -1566,31 +1638,33 @@ static RPCHelpMan invalidateblock()
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
+ ChainstateManager& chainman = EnsureAnyChainman(request.context);
uint256 hash(ParseHashV(request.params[0], "blockhash"));
- BlockValidationState state;
- ChainstateManager& chainman = EnsureAnyChainman(request.context);
- CBlockIndex* pblockindex;
+ InvalidateBlock(chainman, hash);
+
+ return UniValue::VNULL;
+},
+ };
+}
+
+void ReconsiderBlock(ChainstateManager& chainman, uint256 block_hash) {
{
- LOCK(cs_main);
- pblockindex = chainman.m_blockman.LookupBlockIndex(hash);
+ LOCK(chainman.GetMutex());
+ CBlockIndex* pblockindex = chainman.m_blockman.LookupBlockIndex(block_hash);
if (!pblockindex) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
}
- }
- chainman.ActiveChainstate().InvalidateBlock(state, pblockindex);
- if (state.IsValid()) {
- chainman.ActiveChainstate().ActivateBestChain(state);
+ chainman.ActiveChainstate().ResetBlockFailureFlags(pblockindex);
}
+ BlockValidationState state;
+ chainman.ActiveChainstate().ActivateBestChain(state);
+
if (!state.IsValid()) {
throw JSONRPCError(RPC_DATABASE_ERROR, state.ToString());
}
-
- return UniValue::VNULL;
-},
- };
}
static RPCHelpMan reconsiderblock()
@@ -1611,22 +1685,7 @@ static RPCHelpMan reconsiderblock()
ChainstateManager& chainman = EnsureAnyChainman(request.context);
uint256 hash(ParseHashV(request.params[0], "blockhash"));
- {
- LOCK(cs_main);
- CBlockIndex* pblockindex = chainman.m_blockman.LookupBlockIndex(hash);
- if (!pblockindex) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
- }
-
- chainman.ActiveChainstate().ResetBlockFailureFlags(pblockindex);
- }
-
- BlockValidationState state;
- chainman.ActiveChainstate().ActivateBestChain(state);
-
- if (!state.IsValid()) {
- throw JSONRPCError(RPC_DATABASE_ERROR, state.ToString());
- }
+ ReconsiderBlock(chainman, hash);
return UniValue::VNULL;
},
@@ -1698,24 +1757,22 @@ static RPCHelpMan getchaintxstats()
const CBlockIndex& past_block{*CHECK_NONFATAL(pindex->GetAncestor(pindex->nHeight - blockcount))};
const int64_t nTimeDiff{pindex->GetMedianTimePast() - past_block.GetMedianTimePast()};
- const auto window_tx_count{
- (pindex->nChainTx != 0 && past_block.nChainTx != 0) ? std::optional{pindex->nChainTx - past_block.nChainTx} : std::nullopt,
- };
UniValue ret(UniValue::VOBJ);
ret.pushKV("time", (int64_t)pindex->nTime);
- if (pindex->nChainTx) {
- ret.pushKV("txcount", pindex->nChainTx);
+ if (pindex->m_chain_tx_count) {
+ ret.pushKV("txcount", pindex->m_chain_tx_count);
}
ret.pushKV("window_final_block_hash", pindex->GetBlockHash().GetHex());
ret.pushKV("window_final_block_height", pindex->nHeight);
ret.pushKV("window_block_count", blockcount);
if (blockcount > 0) {
ret.pushKV("window_interval", nTimeDiff);
- if (window_tx_count) {
- ret.pushKV("window_tx_count", *window_tx_count);
+ if (pindex->m_chain_tx_count != 0 && past_block.m_chain_tx_count != 0) {
+ const auto window_tx_count = pindex->m_chain_tx_count - past_block.m_chain_tx_count;
+ ret.pushKV("window_tx_count", window_tx_count);
if (nTimeDiff > 0) {
- ret.pushKV("txrate", double(*window_tx_count) / nTimeDiff);
+ ret.pushKV("txrate", double(window_tx_count) / nTimeDiff);
}
}
}
@@ -2138,14 +2195,14 @@ static const auto scan_result_status_some = RPCResult{
static RPCHelpMan scantxoutset()
{
- // scriptPubKey corresponding to mainnet address 12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S
+ // raw() descriptor corresponding to mainnet address 12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S
const std::string EXAMPLE_DESCRIPTOR_RAW = "raw(76a91411b366edfc0a8b66feebae5c2e25a7b6a5d1cf3188ac)#fm24fxxy";
return RPCHelpMan{"scantxoutset",
"\nScans the unspent transaction output set for entries that match certain output descriptors.\n"
"Examples of output descriptors are:\n"
- " addr(<address>) Outputs whose scriptPubKey corresponds to the specified address (does not include P2PK)\n"
- " raw(<hex script>) Outputs whose scriptPubKey equals the specified hex scripts\n"
+ " addr(<address>) Outputs whose output script corresponds to the specified address (does not include P2PK)\n"
+ " raw(<hex script>) Outputs whose output script equals the specified hex-encoded bytes\n"
" combo(<pubkey>) P2PK, P2PKH, P2WPKH, and P2SH-P2WPKH outputs for the given pubkey\n"
" pkh(<pubkey>) P2PKH outputs for the given pubkey\n"
" sh(multi(<n>,<pubkey>,<pubkey>,...)) P2SH-multisig outputs for the given threshold and pubkeys\n"
@@ -2166,7 +2223,7 @@ static RPCHelpMan scantxoutset()
RPCResult{"when action=='start'; only returns after scan completes", RPCResult::Type::OBJ, "", "", {
{RPCResult::Type::BOOL, "success", "Whether the scan was completed"},
{RPCResult::Type::NUM, "txouts", "The number of unspent transaction outputs scanned"},
- {RPCResult::Type::NUM, "height", "The current block height (index)"},
+ {RPCResult::Type::NUM, "height", "The block height at which the scan was done"},
{RPCResult::Type::STR_HEX, "bestblock", "The hash of the block at the tip of the chain"},
{RPCResult::Type::ARR, "unspents", "",
{
@@ -2174,11 +2231,13 @@ static RPCHelpMan scantxoutset()
{
{RPCResult::Type::STR_HEX, "txid", "The transaction id"},
{RPCResult::Type::NUM, "vout", "The vout value"},
- {RPCResult::Type::STR_HEX, "scriptPubKey", "The script key"},
- {RPCResult::Type::STR, "desc", "A specialized descriptor for the matched scriptPubKey"},
+ {RPCResult::Type::STR_HEX, "scriptPubKey", "The output script"},
+ {RPCResult::Type::STR, "desc", "A specialized descriptor for the matched output script"},
{RPCResult::Type::STR_AMOUNT, "amount", "The total amount in " + CURRENCY_UNIT + " of the unspent output"},
{RPCResult::Type::BOOL, "coinbase", "Whether this is a coinbase output"},
{RPCResult::Type::NUM, "height", "Height of the unspent transaction output"},
+ {RPCResult::Type::STR_HEX, "blockhash", "Blockhash of the unspent transaction output"},
+ {RPCResult::Type::NUM, "confirmations", "Number of confirmations of the unspent transaction output when the scan was done"},
}},
}},
{RPCResult::Type::STR_AMOUNT, "total_amount", "The total amount of all found unspent outputs in " + CURRENCY_UNIT},
@@ -2268,17 +2327,20 @@ static RPCHelpMan scantxoutset()
const COutPoint& outpoint = it.first;
const Coin& coin = it.second;
const CTxOut& txo = coin.out;
+ const CBlockIndex& coinb_block{*CHECK_NONFATAL(tip->GetAncestor(coin.nHeight))};
input_txos.push_back(txo);
total_in += txo.nValue;
UniValue unspent(UniValue::VOBJ);
unspent.pushKV("txid", outpoint.hash.GetHex());
- unspent.pushKV("vout", (int32_t)outpoint.n);
+ unspent.pushKV("vout", outpoint.n);
unspent.pushKV("scriptPubKey", HexStr(txo.scriptPubKey));
unspent.pushKV("desc", descriptors[txo.scriptPubKey]);
unspent.pushKV("amount", ValueFromAmount(txo.nValue));
unspent.pushKV("coinbase", coin.IsCoinBase());
- unspent.pushKV("height", (int32_t)coin.nHeight);
+ unspent.pushKV("height", coin.nHeight);
+ unspent.pushKV("blockhash", coinb_block.GetBlockHash().GetHex());
+ unspent.pushKV("confirmations", tip->nHeight - coin.nHeight + 1);
unspents.push_back(std::move(unspent));
}
@@ -2613,6 +2675,42 @@ static RPCHelpMan getblockfilter()
}
/**
+ * RAII class that disables the network in its constructor and enables it in its
+ * destructor.
+ */
+class NetworkDisable
+{
+ CConnman& m_connman;
+public:
+ NetworkDisable(CConnman& connman) : m_connman(connman) {
+ m_connman.SetNetworkActive(false);
+ if (m_connman.GetNetworkActive()) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Network activity could not be suspended.");
+ }
+ };
+ ~NetworkDisable() {
+ m_connman.SetNetworkActive(true);
+ };
+};
+
+/**
+ * RAII class that temporarily rolls back the local chain in it's constructor
+ * and rolls it forward again in it's destructor.
+ */
+class TemporaryRollback
+{
+ ChainstateManager& m_chainman;
+ const CBlockIndex& m_invalidate_index;
+public:
+ TemporaryRollback(ChainstateManager& chainman, const CBlockIndex& index) : m_chainman(chainman), m_invalidate_index(index) {
+ InvalidateBlock(m_chainman, m_invalidate_index.GetBlockHash());
+ };
+ ~TemporaryRollback() {
+ ReconsiderBlock(m_chainman, m_invalidate_index.GetBlockHash());
+ };
+};
+
+/**
* Serialize the UTXO set to a file for loading elsewhere.
*
* @see SnapshotMetadata
@@ -2621,9 +2719,20 @@ static RPCHelpMan dumptxoutset()
{
return RPCHelpMan{
"dumptxoutset",
- "Write the serialized UTXO set to a file.",
+ "Write the serialized UTXO set to a file. This can be used in loadtxoutset afterwards if this snapshot height is supported in the chainparams as well.\n\n"
+ "Unless the the \"latest\" type is requested, the node will roll back to the requested height and network activity will be suspended during this process. "
+ "Because of this it is discouraged to interact with the node in any other way during the execution of this call to avoid inconsistent results and race conditions, particularly RPCs that interact with blockstorage.\n\n"
+ "This call may take several minutes. Make sure to use no RPC timeout (bitcoin-cli -rpcclienttimeout=0)",
{
{"path", RPCArg::Type::STR, RPCArg::Optional::NO, "Path to the output file. If relative, will be prefixed by datadir."},
+ {"type", RPCArg::Type::STR, RPCArg::Default(""), "The type of snapshot to create. Can be \"latest\" to create a snapshot of the current UTXO set or \"rollback\" to temporarily roll back the state of the node to a historical block before creating the snapshot of a historical UTXO set. This parameter can be omitted if a separate \"rollback\" named parameter is specified indicating the height or hash of a specific historical block. If \"rollback\" is specified and separate \"rollback\" named parameter is not specified, this will roll back to the latest valid snapshot block that can currently be loaded with loadtxoutset."},
+ {"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
+ {
+ {"rollback", RPCArg::Type::NUM, RPCArg::Optional::OMITTED,
+ "Height or hash of the block to roll back to before creating the snapshot. Note: The further this number is from the tip, the longer this process will take. Consider setting a higher -rpcclienttimeout value in this case.",
+ RPCArgOptions{.skip_type_check = true, .type_str = {"", "string or numeric"}}},
+ },
+ },
},
RPCResult{
RPCResult::Type::OBJ, "", "",
@@ -2637,10 +2746,33 @@ static RPCHelpMan dumptxoutset()
}
},
RPCExamples{
- HelpExampleCli("dumptxoutset", "utxo.dat")
+ HelpExampleCli("-rpcclienttimeout=0 dumptxoutset", "utxo.dat latest") +
+ HelpExampleCli("-rpcclienttimeout=0 dumptxoutset", "utxo.dat rollback") +
+ HelpExampleCli("-rpcclienttimeout=0 -named dumptxoutset", R"(utxo.dat rollback=853456)")
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
+ NodeContext& node = EnsureAnyNodeContext(request.context);
+ const CBlockIndex* tip{WITH_LOCK(::cs_main, return node.chainman->ActiveChain().Tip())};
+ const CBlockIndex* target_index{nullptr};
+ const std::string snapshot_type{self.Arg<std::string>("type")};
+ const UniValue options{request.params[2].isNull() ? UniValue::VOBJ : request.params[2]};
+ if (options.exists("rollback")) {
+ if (!snapshot_type.empty() && snapshot_type != "rollback") {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid snapshot type \"%s\" specified with rollback option", snapshot_type));
+ }
+ target_index = ParseHashOrHeight(options["rollback"], *node.chainman);
+ } else if (snapshot_type == "rollback") {
+ auto snapshot_heights = node.chainman->GetParams().GetAvailableSnapshotHeights();
+ CHECK_NONFATAL(snapshot_heights.size() > 0);
+ auto max_height = std::max_element(snapshot_heights.begin(), snapshot_heights.end());
+ target_index = ParseHashOrHeight(*max_height, *node.chainman);
+ } else if (snapshot_type == "latest") {
+ target_index = tip;
+ } else {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid snapshot type \"%s\" specified. Please specify \"rollback\" or \"latest\"", snapshot_type));
+ }
+
const ArgsManager& args{EnsureAnyArgsman(request.context)};
const fs::path path = fsbridge::AbsPathJoin(args.GetDataDirNet(), fs::u8path(request.params[0].get_str()));
// Write to a temporary path and then move into `path` on completion
@@ -2662,9 +2794,68 @@ static RPCHelpMan dumptxoutset()
"Couldn't open file " + temppath.utf8string() + " for writing.");
}
- NodeContext& node = EnsureAnyNodeContext(request.context);
- UniValue result = CreateUTXOSnapshot(
- node, node.chainman->ActiveChainstate(), afile, path, temppath);
+ CConnman& connman = EnsureConnman(node);
+ const CBlockIndex* invalidate_index{nullptr};
+ std::optional<NetworkDisable> disable_network;
+ std::optional<TemporaryRollback> temporary_rollback;
+
+ // If the user wants to dump the txoutset of the current tip, we don't have
+ // to roll back at all
+ if (target_index != tip) {
+ // If the node is running in pruned mode we ensure all necessary block
+ // data is available before starting to roll back.
+ if (node.chainman->m_blockman.IsPruneMode()) {
+ LOCK(node.chainman->GetMutex());
+ const CBlockIndex* current_tip{node.chainman->ActiveChain().Tip()};
+ const CBlockIndex* first_block{node.chainman->m_blockman.GetFirstBlock(*current_tip, /*status_mask=*/BLOCK_HAVE_MASK)};
+ if (first_block->nHeight > target_index->nHeight) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Could not roll back to requested height since necessary block data is already pruned.");
+ }
+ }
+
+ // Suspend network activity for the duration of the process when we are
+ // rolling back the chain to get a utxo set from a past height. We do
+ // this so we don't punish peers that send us that send us data that
+ // seems wrong in this temporary state. For example a normal new block
+ // would be classified as a block connecting an invalid block.
+ // Skip if the network is already disabled because this
+ // automatically re-enables the network activity at the end of the
+ // process which may not be what the user wants.
+ if (connman.GetNetworkActive()) {
+ disable_network.emplace(connman);
+ }
+
+ invalidate_index = WITH_LOCK(::cs_main, return node.chainman->ActiveChain().Next(target_index));
+ temporary_rollback.emplace(*node.chainman, *invalidate_index);
+ }
+
+ Chainstate* chainstate;
+ std::unique_ptr<CCoinsViewCursor> cursor;
+ CCoinsStats stats;
+ {
+ // Lock the chainstate before calling PrepareUtxoSnapshot, to be able
+ // to get a UTXO database cursor while the chain is pointing at the
+ // target block. After that, release the lock while calling
+ // WriteUTXOSnapshot. The cursor will remain valid and be used by
+ // WriteUTXOSnapshot to write a consistent snapshot even if the
+ // chainstate changes.
+ LOCK(node.chainman->GetMutex());
+ chainstate = &node.chainman->ActiveChainstate();
+ // In case there is any issue with a block being read from disk we need
+ // to stop here, otherwise the dump could still be created for the wrong
+ // height.
+ // The new tip could also not be the target block if we have a stale
+ // sister block of invalidate_index. This block (or a descendant) would
+ // be activated as the new tip and we would not get to new_tip_index.
+ if (target_index != chainstate->m_chain.Tip()) {
+ LogWarning("dumptxoutset failed to roll back to requested height, reverting to tip.\n");
+ throw JSONRPCError(RPC_MISC_ERROR, "Could not roll back to requested height.");
+ } else {
+ std::tie(cursor, stats, tip) = PrepareUTXOSnapshot(*chainstate, node.rpc_interruption_point);
+ }
+ }
+
+ UniValue result = WriteUTXOSnapshot(*chainstate, cursor.get(), &stats, tip, afile, path, temppath, node.rpc_interruption_point);
fs::rename(temppath, path);
result.pushKV("path", path.utf8string());
@@ -2673,12 +2864,10 @@ static RPCHelpMan dumptxoutset()
};
}
-UniValue CreateUTXOSnapshot(
- NodeContext& node,
+std::tuple<std::unique_ptr<CCoinsViewCursor>, CCoinsStats, const CBlockIndex*>
+PrepareUTXOSnapshot(
Chainstate& chainstate,
- AutoFile& afile,
- const fs::path& path,
- const fs::path& temppath)
+ const std::function<void()>& interruption_point)
{
std::unique_ptr<CCoinsViewCursor> pcursor;
std::optional<CCoinsStats> maybe_stats;
@@ -2688,7 +2877,7 @@ UniValue CreateUTXOSnapshot(
// We need to lock cs_main to ensure that the coinsdb isn't written to
// between (i) flushing coins cache to disk (coinsdb), (ii) getting stats
// based upon the coinsdb, and (iii) constructing a cursor to the
- // coinsdb for use below this block.
+ // coinsdb for use in WriteUTXOSnapshot.
//
// Cursors returned by leveldb iterate over snapshots, so the contents
// of the pcursor will not be affected by simultaneous writes during
@@ -2697,11 +2886,11 @@ UniValue CreateUTXOSnapshot(
// See discussion here:
// https://github.com/bitcoin/bitcoin/pull/15606#discussion_r274479369
//
- LOCK(::cs_main);
+ AssertLockHeld(::cs_main);
chainstate.ForceFlushStateToDisk();
- maybe_stats = GetUTXOStats(&chainstate.CoinsDB(), chainstate.m_blockman, CoinStatsHashType::HASH_SERIALIZED, node.rpc_interruption_point);
+ maybe_stats = GetUTXOStats(&chainstate.CoinsDB(), chainstate.m_blockman, CoinStatsHashType::HASH_SERIALIZED, interruption_point);
if (!maybe_stats) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to read UTXO set");
}
@@ -2710,11 +2899,24 @@ UniValue CreateUTXOSnapshot(
tip = CHECK_NONFATAL(chainstate.m_blockman.LookupBlockIndex(maybe_stats->hashBlock));
}
+ return {std::move(pcursor), *CHECK_NONFATAL(maybe_stats), tip};
+}
+
+UniValue WriteUTXOSnapshot(
+ Chainstate& chainstate,
+ CCoinsViewCursor* pcursor,
+ CCoinsStats* maybe_stats,
+ const CBlockIndex* tip,
+ AutoFile& afile,
+ const fs::path& path,
+ const fs::path& temppath,
+ const std::function<void()>& interruption_point)
+{
LOG_TIME_SECONDS(strprintf("writing UTXO snapshot at height %s (%s) to file %s (via %s)",
tip->nHeight, tip->GetBlockHash().ToString(),
fs::PathToString(path), fs::PathToString(temppath)));
- SnapshotMetadata metadata{chainstate.m_chainman.GetParams().MessageStart(), tip->GetBlockHash(), tip->nHeight, maybe_stats->coins_count};
+ SnapshotMetadata metadata{chainstate.m_chainman.GetParams().MessageStart(), tip->GetBlockHash(), maybe_stats->coins_count};
afile << metadata;
@@ -2745,7 +2947,7 @@ UniValue CreateUTXOSnapshot(
pcursor->GetKey(key);
last_hash = key.hash;
while (pcursor->Valid()) {
- if (iter % 5000 == 0) node.rpc_interruption_point();
+ if (iter % 5000 == 0) interruption_point();
++iter;
if (pcursor->GetKey(key) && pcursor->GetValue(coin)) {
if (key.hash != last_hash) {
@@ -2772,10 +2974,21 @@ UniValue CreateUTXOSnapshot(
result.pushKV("base_height", tip->nHeight);
result.pushKV("path", path.utf8string());
result.pushKV("txoutset_hash", maybe_stats->hashSerialized.ToString());
- result.pushKV("nchaintx", tip->nChainTx);
+ result.pushKV("nchaintx", tip->m_chain_tx_count);
return result;
}
+UniValue CreateUTXOSnapshot(
+ node::NodeContext& node,
+ Chainstate& chainstate,
+ AutoFile& afile,
+ const fs::path& path,
+ const fs::path& tmppath)
+{
+ auto [cursor, stats, tip]{WITH_LOCK(::cs_main, return PrepareUTXOSnapshot(chainstate, node.rpc_interruption_point))};
+ return WriteUTXOSnapshot(chainstate, cursor.get(), &stats, tip, afile, path, tmppath, node.rpc_interruption_point);
+}
+
static RPCHelpMan loadtxoutset()
{
return RPCHelpMan{
@@ -2810,13 +3023,13 @@ static RPCHelpMan loadtxoutset()
}
},
RPCExamples{
- HelpExampleCli("loadtxoutset", "utxo.dat")
+ HelpExampleCli("-rpcclienttimeout=0 loadtxoutset", "utxo.dat")
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
NodeContext& node = EnsureAnyNodeContext(request.context);
ChainstateManager& chainman = EnsureChainman(node);
- fs::path path{AbsPathForConfigVal(EnsureArgsman(node), fs::u8path(request.params[0].get_str()))};
+ const fs::path path{AbsPathForConfigVal(EnsureArgsman(node), fs::u8path(self.Arg<std::string>("path")))};
FILE* file{fsbridge::fopen(path, "rb")};
AutoFile afile{file};
@@ -2833,34 +3046,24 @@ static RPCHelpMan loadtxoutset()
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("Unable to parse metadata: %s", e.what()));
}
- uint256 base_blockhash = metadata.m_base_blockhash;
- int base_blockheight = metadata.m_base_blockheight;
- if (!chainman.GetParams().AssumeutxoForBlockhash(base_blockhash).has_value()) {
- auto available_heights = chainman.GetParams().GetAvailableSnapshotHeights();
- std::string heights_formatted = Join(available_heights, ", ", [&](const auto& i) { return ToString(i); });
- throw JSONRPCError(RPC_INTERNAL_ERROR, strprintf("Unable to load UTXO snapshot, "
- "assumeutxo block hash in snapshot metadata not recognized (hash: %s, height: %s). The following snapshot heights are available: %s.",
- base_blockhash.ToString(),
- base_blockheight,
- heights_formatted));
+ auto activation_result{chainman.ActivateSnapshot(afile, metadata, false)};
+ if (!activation_result) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, strprintf("Unable to load UTXO snapshot: %s. (%s)", util::ErrorString(activation_result).original, path.utf8string()));
}
- CBlockIndex* snapshot_start_block = WITH_LOCK(::cs_main,
- return chainman.m_blockman.LookupBlockIndex(base_blockhash));
- if (!snapshot_start_block) {
- throw JSONRPCError(
- RPC_INTERNAL_ERROR,
- 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));
- }
+ // Because we can't provide historical blocks during tip or background sync.
+ // Update local services to reflect we are a limited peer until we are fully sync.
+ node.connman->RemoveLocalServices(NODE_NETWORK);
+ // Setting the limited state is usually redundant because the node can always
+ // provide the last 288 blocks, but it doesn't hurt to set it.
+ node.connman->AddLocalServices(NODE_NETWORK_LIMITED);
+
+ CBlockIndex& snapshot_index{*CHECK_NONFATAL(*activation_result)};
UniValue result(UniValue::VOBJ);
result.pushKV("coins_loaded", metadata.m_coins_count);
- result.pushKV("tip_hash", snapshot_start_block->GetBlockHash().ToString());
- result.pushKV("base_height", snapshot_start_block->nHeight);
+ result.pushKV("tip_hash", snapshot_index.GetBlockHash().ToString());
+ result.pushKV("base_height", snapshot_index.nHeight);
result.pushKV("path", fs::PathToString(path));
return result;
},
diff --git a/src/rpc/blockchain.h b/src/rpc/blockchain.h
index c2021c3608..89b9921d55 100644
--- a/src/rpc/blockchain.h
+++ b/src/rpc/blockchain.h
@@ -21,6 +21,7 @@ class CBlockIndex;
class Chainstate;
class UniValue;
namespace node {
+class BlockManager;
struct NodeContext;
} // namespace node
@@ -34,9 +35,6 @@ static constexpr int NUM_GETBLOCKSTATS_PERCENTILES = 5;
*/
double GetDifficulty(const CBlockIndex& blockindex);
-/** Callback for when block tip changed. */
-void RPCNotifyBlockChange(const CBlockIndex*);
-
/** Block description to JSON */
UniValue blockToJSON(node::BlockManager& blockman, const CBlock& block, const CBlockIndex& tip, const CBlockIndex& blockindex, TxVerbosity verbosity) LOCKS_EXCLUDED(cs_main);
@@ -47,7 +45,7 @@ UniValue blockheaderToJSON(const CBlockIndex& tip, const CBlockIndex& blockindex
void CalculatePercentilesByWeight(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES], std::vector<std::pair<CAmount, int64_t>>& scores, int64_t total_weight);
/**
- * Helper to create UTXO snapshots given a chainstate and a file handle.
+ * Test-only helper to create UTXO snapshots given a chainstate and a file handle.
* @return a UniValue map containing metadata about the snapshot.
*/
UniValue CreateUTXOSnapshot(
@@ -57,4 +55,8 @@ UniValue CreateUTXOSnapshot(
const fs::path& path,
const fs::path& tmppath);
+//! Return height of highest block that has been pruned, or std::nullopt if no blocks have been pruned
+std::optional<int> GetPruneHeight(const node::BlockManager& blockman, const CChain& chain) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
+void CheckBlockDataAvailability(node::BlockManager& blockman, const CBlockIndex& blockindex, bool check_for_undo) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
+
#endif // BITCOIN_RPC_BLOCKCHAIN_H
diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp
index 7dfe69a6c5..0112a261ce 100644
--- a/src/rpc/client.cpp
+++ b/src/rpc/client.cpp
@@ -146,6 +146,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "fundrawtransaction", 1, "conf_target"},
{ "fundrawtransaction", 1, "replaceable"},
{ "fundrawtransaction", 1, "solving_data"},
+ { "fundrawtransaction", 1, "max_tx_weight"},
{ "fundrawtransaction", 2, "iswitness" },
{ "walletcreatefundedpsbt", 0, "inputs" },
{ "walletcreatefundedpsbt", 1, "outputs" },
@@ -164,6 +165,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "walletcreatefundedpsbt", 3, "conf_target"},
{ "walletcreatefundedpsbt", 3, "replaceable"},
{ "walletcreatefundedpsbt", 3, "solving_data"},
+ { "walletcreatefundedpsbt", 3, "max_tx_weight"},
{ "walletcreatefundedpsbt", 4, "bip32derivs" },
{ "walletprocesspsbt", 1, "sign" },
{ "walletprocesspsbt", 3, "bip32derivs" },
@@ -185,6 +187,8 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "gettxoutproof", 0, "txids" },
{ "gettxoutsetinfo", 1, "hash_or_height" },
{ "gettxoutsetinfo", 2, "use_index"},
+ { "dumptxoutset", 2, "options" },
+ { "dumptxoutset", 2, "rollback" },
{ "lockunspent", 0, "unlock" },
{ "lockunspent", 1, "transactions" },
{ "lockunspent", 2, "persistent" },
@@ -208,6 +212,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "send", 4, "conf_target"},
{ "send", 4, "replaceable"},
{ "send", 4, "solving_data"},
+ { "send", 4, "max_tx_weight"},
{ "sendall", 0, "recipients" },
{ "sendall", 1, "conf_target" },
{ "sendall", 3, "fee_rate"},
diff --git a/src/rpc/fees.cpp b/src/rpc/fees.cpp
index aefe78162b..10caa9ed2e 100644
--- a/src/rpc/fees.cpp
+++ b/src/rpc/fees.cpp
@@ -23,7 +23,7 @@
#include <string>
using common::FeeModeFromString;
-using common::FeeModes;
+using common::FeeModesDetail;
using common::InvalidEstimateModeErrorMessage;
using node::NodeContext;
@@ -36,13 +36,8 @@ static RPCHelpMan estimatesmartfee()
"in BIP 141 (witness data is discounted).\n",
{
{"conf_target", RPCArg::Type::NUM, RPCArg::Optional::NO, "Confirmation target in blocks (1 - 1008)"},
- {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"conservative"}, "The fee estimate mode.\n"
- "Whether to return a more conservative estimate which also satisfies\n"
- "a longer history. A conservative estimate potentially returns a\n"
- "higher feerate and is more likely to be sufficient for the desired\n"
- "target, but is not as responsive to short term drops in the\n"
- "prevailing fee market. Must be one of (case insensitive):\n"
- "\"" + FeeModes("\"\n\"") + "\""},
+ {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"economical"}, "The fee estimate mode.\n"
+ + FeeModesDetail(std::string("default mode will be used"))},
},
RPCResult{
RPCResult::Type::OBJ, "", "",
@@ -71,13 +66,13 @@ static RPCHelpMan estimatesmartfee()
CHECK_NONFATAL(mempool.m_opts.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;
+ bool conservative = false;
if (!request.params[1].isNull()) {
FeeEstimateMode fee_mode;
if (!FeeModeFromString(request.params[1].get_str(), fee_mode)) {
throw JSONRPCError(RPC_INVALID_PARAMETER, InvalidEstimateModeErrorMessage());
}
- if (fee_mode == FeeEstimateMode::ECONOMICAL) conservative = false;
+ if (fee_mode == FeeEstimateMode::CONSERVATIVE) conservative = true;
}
UniValue result(UniValue::VOBJ);
diff --git a/src/rpc/mempool.cpp b/src/rpc/mempool.cpp
index fd11f6cfeb..d61898260b 100644
--- a/src/rpc/mempool.cpp
+++ b/src/rpc/mempool.cpp
@@ -5,7 +5,7 @@
#include <rpc/blockchain.h>
-#include <kernel/mempool_persist.h>
+#include <node/mempool_persist.h>
#include <chainparams.h>
#include <core_io.h>
@@ -27,7 +27,7 @@
#include <utility>
-using kernel::DumpMempool;
+using node::DumpMempool;
using node::DEFAULT_MAX_BURN_AMOUNT;
using node::DEFAULT_MAX_RAW_TX_FEE_RATE;
@@ -43,7 +43,7 @@ static RPCHelpMan sendrawtransaction()
"\nThe transaction will be sent unconditionally to all peers, so using sendrawtransaction\n"
"for manual rebroadcast may degrade privacy by leaking the transaction's origin, as\n"
"nodes will normally not rebroadcast non-wallet transactions already in their mempool.\n"
- "\nA specific exception, RPC_TRANSACTION_ALREADY_IN_CHAIN, may throw if the transaction cannot be added to the mempool.\n"
+ "\nA specific exception, RPC_TRANSACTION_ALREADY_IN_UTXO_SET, may throw if the transaction cannot be added to the mempool.\n"
"\nRelated RPCs: createrawtransaction, signrawtransactionwithkey\n",
{
{"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of the raw transaction"},
@@ -759,13 +759,13 @@ static RPCHelpMan importmempool()
const UniValue& use_current_time{request.params[1]["use_current_time"]};
const UniValue& apply_fee_delta{request.params[1]["apply_fee_delta_priority"]};
const UniValue& apply_unbroadcast{request.params[1]["apply_unbroadcast_set"]};
- kernel::ImportMempoolOptions opts{
+ node::ImportMempoolOptions opts{
.use_current_time = use_current_time.isNull() ? true : use_current_time.get_bool(),
.apply_fee_delta_priority = apply_fee_delta.isNull() ? false : apply_fee_delta.get_bool(),
.apply_unbroadcast_set = apply_unbroadcast.isNull() ? false : apply_unbroadcast.get_bool(),
};
- if (!kernel::LoadMempool(mempool, load_path, chainstate, std::move(opts))) {
+ if (!node::LoadMempool(mempool, load_path, chainstate, std::move(opts))) {
throw JSONRPCError(RPC_MISC_ERROR, "Unable to import mempool file, see debug.log for details.");
}
diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp
index 7e420dcd9b..6270496b1b 100644
--- a/src/rpc/mining.cpp
+++ b/src/rpc/mining.cpp
@@ -7,6 +7,7 @@
#include <chain.h>
#include <chainparams.h>
+#include <chainparamsbase.h>
#include <common/system.h>
#include <consensus/amount.h>
#include <consensus/consensus.h>
@@ -44,9 +45,9 @@
#include <memory>
#include <stdint.h>
-using node::BlockAssembler;
-using node::CBlockTemplate;
+using interfaces::BlockTemplate;
using interfaces::Mining;
+using node::BlockAssembler;
using node::NodeContext;
using node::RegenerateCommitments;
using node::UpdateTime;
@@ -129,7 +130,7 @@ static RPCHelpMan getnetworkhashps()
};
}
-static bool GenerateBlock(ChainstateManager& chainman, Mining& miner, CBlock& block, uint64_t& max_tries, std::shared_ptr<const CBlock>& block_out, bool process_new_block)
+static bool GenerateBlock(ChainstateManager& chainman, Mining& miner, CBlock&& block, uint64_t& max_tries, std::shared_ptr<const CBlock>& block_out, bool process_new_block)
{
block_out.reset();
block.hashMerkleRoot = BlockMerkleRoot(block);
@@ -145,7 +146,7 @@ static bool GenerateBlock(ChainstateManager& chainman, Mining& miner, CBlock& bl
return true;
}
- block_out = std::make_shared<const CBlock>(block);
+ block_out = std::make_shared<const CBlock>(std::move(block));
if (!process_new_block) return true;
@@ -160,12 +161,11 @@ static UniValue generateBlocks(ChainstateManager& chainman, Mining& miner, const
{
UniValue blockHashes(UniValue::VARR);
while (nGenerate > 0 && !chainman.m_interrupt) {
- std::unique_ptr<CBlockTemplate> pblocktemplate(miner.createNewBlock(coinbase_script));
- if (!pblocktemplate.get())
- throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
+ std::unique_ptr<BlockTemplate> block_template(miner.createNewBlock(coinbase_script));
+ CHECK_NONFATAL(block_template);
std::shared_ptr<const CBlock> block_out;
- if (!GenerateBlock(chainman, miner, pblocktemplate->block, nMaxTries, block_out, /*process_new_block=*/true)) {
+ if (!GenerateBlock(chainman, miner, block_template->getBlock(), nMaxTries, block_out, /*process_new_block=*/true)) {
break;
}
@@ -180,35 +180,36 @@ static UniValue generateBlocks(ChainstateManager& chainman, Mining& miner, const
static bool getScriptFromDescriptor(const std::string& descriptor, CScript& script, std::string& error)
{
FlatSigningProvider key_provider;
- const auto desc = Parse(descriptor, key_provider, error, /* require_checksum = */ false);
- if (desc) {
- if (desc->IsRange()) {
- throw JSONRPCError(RPC_INVALID_PARAMETER, "Ranged descriptor not accepted. Maybe pass through deriveaddresses first?");
- }
-
- FlatSigningProvider provider;
- std::vector<CScript> scripts;
- if (!desc->Expand(0, key_provider, scripts, provider)) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot derive script without private keys");
- }
+ const auto descs = Parse(descriptor, key_provider, error, /* require_checksum = */ false);
+ if (descs.empty()) return false;
+ if (descs.size() > 1) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Multipath descriptor not accepted");
+ }
+ const auto& desc = descs.at(0);
+ if (desc->IsRange()) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Ranged descriptor not accepted. Maybe pass through deriveaddresses first?");
+ }
- // Combo descriptors can have 2 or 4 scripts, so we can't just check scripts.size() == 1
- CHECK_NONFATAL(scripts.size() > 0 && scripts.size() <= 4);
+ FlatSigningProvider provider;
+ std::vector<CScript> scripts;
+ if (!desc->Expand(0, key_provider, scripts, provider)) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot derive script without private keys");
+ }
- if (scripts.size() == 1) {
- script = scripts.at(0);
- } else if (scripts.size() == 4) {
- // For uncompressed keys, take the 3rd script, since it is p2wpkh
- script = scripts.at(2);
- } else {
- // Else take the 2nd script, since it is p2pkh
- script = scripts.at(1);
- }
+ // Combo descriptors can have 2 or 4 scripts, so we can't just check scripts.size() == 1
+ CHECK_NONFATAL(scripts.size() > 0 && scripts.size() <= 4);
- return true;
+ if (scripts.size() == 1) {
+ script = scripts.at(0);
+ } else if (scripts.size() == 4) {
+ // For uncompressed keys, take the 3rd script, since it is p2wpkh
+ script = scripts.at(2);
} else {
- return false;
+ // Else take the 2nd script, since it is p2pkh
+ script = scripts.at(1);
}
+
+ return true;
}
static RPCHelpMan generatetodescriptor()
@@ -345,13 +346,11 @@ static RPCHelpMan generateblock()
std::vector<CTransactionRef> txs;
const auto raw_txs_or_txids = request.params[1].get_array();
for (size_t i = 0; i < raw_txs_or_txids.size(); i++) {
- const auto str(raw_txs_or_txids[i].get_str());
+ const auto& str{raw_txs_or_txids[i].get_str()};
- uint256 hash;
CMutableTransaction mtx;
- if (ParseHashStr(str, hash)) {
-
- const auto tx = mempool.get(hash);
+ if (auto hash{uint256::FromHex(str)}) {
+ const auto tx{mempool.get(*hash)};
if (!tx) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Transaction %s not in mempool.", str));
}
@@ -371,11 +370,10 @@ static RPCHelpMan generateblock()
ChainstateManager& chainman = EnsureChainman(node);
{
- std::unique_ptr<CBlockTemplate> blocktemplate{miner.createNewBlock(coinbase_script, /*use_mempool=*/false)};
- if (!blocktemplate) {
- throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
- }
- block = blocktemplate->block;
+ std::unique_ptr<BlockTemplate> block_template{miner.createNewBlock(coinbase_script, {.use_mempool = false})};
+ CHECK_NONFATAL(block_template);
+
+ block = block_template->getBlock();
}
CHECK_NONFATAL(block.vtx.size() == 1);
@@ -394,7 +392,7 @@ static RPCHelpMan generateblock()
std::shared_ptr<const CBlock> block_out;
uint64_t max_tries{DEFAULT_MAX_TRIES};
- if (!GenerateBlock(chainman, miner, block, max_tries, block_out, process_new_block) || !block_out) {
+ if (!GenerateBlock(chainman, miner, std::move(block), max_tries, block_out, process_new_block) || !block_out) {
throw JSONRPCError(RPC_MISC_ERROR, "Failed to make block.");
}
@@ -424,7 +422,7 @@ static RPCHelpMan getmininginfo()
{RPCResult::Type::NUM, "difficulty", "The current difficulty"},
{RPCResult::Type::NUM, "networkhashps", "The network hashes per second"},
{RPCResult::Type::NUM, "pooledtx", "The size of the mempool"},
- {RPCResult::Type::STR, "chain", "current network name (main, test, signet, regtest)"},
+ {RPCResult::Type::STR, "chain", "current network name (" LIST_CHAIN_NAMES ")"},
(IsDeprecatedRPCEnabled("warnings") ?
RPCResult{RPCResult::Type::STR, "warnings", "any network and blockchain warnings (DEPRECATED)"} :
RPCResult{RPCResult::Type::ARR, "warnings", "any network and blockchain warnings (run with `-deprecatedrpc=warnings` to return the latest warning as a single string)",
@@ -663,7 +661,7 @@ static RPCHelpMan getblocktemplate()
ChainstateManager& chainman = EnsureChainman(node);
Mining& miner = EnsureMining(node);
LOCK(cs_main);
- uint256 tip{CHECK_NONFATAL(miner.getTipHash()).value()};
+ uint256 tip{CHECK_NONFATAL(miner.getTip()).value().hash};
std::string strMode = "template";
UniValue lpval = NullUniValue;
@@ -740,7 +738,6 @@ static RPCHelpMan getblocktemplate()
{
// Wait to respond until either the best block changes, OR a minute has passed and there are more transactions
uint256 hashWatchedChain;
- std::chrono::steady_clock::time_point checktxtime;
unsigned int nTransactionsUpdatedLastLP;
if (lpval.isStr())
@@ -761,26 +758,19 @@ static RPCHelpMan getblocktemplate()
// Release lock while waiting
LEAVE_CRITICAL_SECTION(cs_main);
{
- checktxtime = std::chrono::steady_clock::now() + std::chrono::minutes(1);
-
- WAIT_LOCK(g_best_block_mutex, lock);
- while (g_best_block == hashWatchedChain && IsRPCRunning())
- {
- if (g_best_block_cv.wait_until(lock, checktxtime) == std::cv_status::timeout)
- {
- // Timeout: Check transactions for update
- // without holding the mempool lock to avoid deadlocks
- if (miner.getTransactionsUpdated() != nTransactionsUpdatedLastLP)
- break;
- checktxtime += std::chrono::seconds(10);
- }
+ MillisecondsDouble checktxtime{std::chrono::minutes(1)};
+ while (tip == hashWatchedChain && IsRPCRunning()) {
+ tip = miner.waitTipChanged(hashWatchedChain, checktxtime).hash;
+ // Timeout: Check transactions for update
+ // without holding the mempool lock to avoid deadlocks
+ if (miner.getTransactionsUpdated() != nTransactionsUpdatedLastLP)
+ break;
+ checktxtime = std::chrono::seconds(10);
}
}
ENTER_CRITICAL_SECTION(cs_main);
- std::optional<uint256> maybe_tip{miner.getTipHash()};
- CHECK_NONFATAL(maybe_tip);
- tip = maybe_tip.value();
+ tip = CHECK_NONFATAL(miner.getTip()).value().hash;
if (!IsRPCRunning())
throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Shutting down");
@@ -802,7 +792,7 @@ static RPCHelpMan getblocktemplate()
// Update block
static CBlockIndex* pindexPrev;
static int64_t time_start;
- static std::unique_ptr<CBlockTemplate> pblocktemplate;
+ static std::unique_ptr<BlockTemplate> block_template;
if (!pindexPrev || pindexPrev->GetBlockHash() != tip ||
(miner.getTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - time_start > 5))
{
@@ -816,20 +806,19 @@ static RPCHelpMan getblocktemplate()
// Create new block
CScript scriptDummy = CScript() << OP_TRUE;
- pblocktemplate = miner.createNewBlock(scriptDummy);
- if (!pblocktemplate) {
- throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");
- }
+ block_template = miner.createNewBlock(scriptDummy);
+ CHECK_NONFATAL(block_template);
+
// Need to update only after we know createNewBlock succeeded
pindexPrev = pindexPrevNew;
}
CHECK_NONFATAL(pindexPrev);
- CBlock* pblock = &pblocktemplate->block; // pointer for convenience
+ CBlock block{block_template->getBlock()};
// Update nTime
- UpdateTime(pblock, consensusParams, pindexPrev);
- pblock->nNonce = 0;
+ UpdateTime(&block, consensusParams, pindexPrev);
+ block.nNonce = 0;
// NOTE: If at some point we support pre-segwit miners post-segwit-activation, this needs to take segwit support into consideration
const bool fPreSegWit = !DeploymentActiveAfter(pindexPrev, chainman, Consensus::DEPLOYMENT_SEGWIT);
@@ -838,8 +827,11 @@ static RPCHelpMan getblocktemplate()
UniValue transactions(UniValue::VARR);
std::map<uint256, int64_t> setTxIndex;
+ std::vector<CAmount> tx_fees{block_template->getTxFees()};
+ std::vector<CAmount> tx_sigops{block_template->getTxSigops()};
+
int i = 0;
- for (const auto& it : pblock->vtx) {
+ for (const auto& it : block.vtx) {
const CTransaction& tx = *it;
uint256 txHash = tx.GetHash();
setTxIndex[txHash] = i++;
@@ -862,8 +854,8 @@ static RPCHelpMan getblocktemplate()
entry.pushKV("depends", std::move(deps));
int index_in_template = i - 1;
- entry.pushKV("fee", pblocktemplate->vTxFees[index_in_template]);
- int64_t nTxSigOps = pblocktemplate->vTxSigOpsCost[index_in_template];
+ entry.pushKV("fee", tx_fees.at(index_in_template));
+ int64_t nTxSigOps{tx_sigops.at(index_in_template)};
if (fPreSegWit) {
CHECK_NONFATAL(nTxSigOps % WITNESS_SCALE_FACTOR == 0);
nTxSigOps /= WITNESS_SCALE_FACTOR;
@@ -876,7 +868,7 @@ static RPCHelpMan getblocktemplate()
UniValue aux(UniValue::VOBJ);
- arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
+ arith_uint256 hashTarget = arith_uint256().SetCompact(block.nBits);
UniValue aMutable(UniValue::VARR);
aMutable.push_back("time");
@@ -906,7 +898,7 @@ static RPCHelpMan getblocktemplate()
break;
case ThresholdState::LOCKED_IN:
// Ensure bit is set in block version
- pblock->nVersion |= chainman.m_versionbitscache.Mask(consensusParams, pos);
+ block.nVersion |= chainman.m_versionbitscache.Mask(consensusParams, pos);
[[fallthrough]];
case ThresholdState::STARTED:
{
@@ -915,7 +907,7 @@ static RPCHelpMan getblocktemplate()
if (setClientRules.find(vbinfo.name) == setClientRules.end()) {
if (!vbinfo.gbt_force) {
// If the client doesn't support this, don't indicate it in the [default] version
- pblock->nVersion &= ~chainman.m_versionbitscache.Mask(consensusParams, pos);
+ block.nVersion &= ~chainman.m_versionbitscache.Mask(consensusParams, pos);
}
}
break;
@@ -935,15 +927,15 @@ static RPCHelpMan getblocktemplate()
}
}
}
- result.pushKV("version", pblock->nVersion);
+ result.pushKV("version", block.nVersion);
result.pushKV("rules", std::move(aRules));
result.pushKV("vbavailable", std::move(vbavailable));
result.pushKV("vbrequired", int(0));
- result.pushKV("previousblockhash", pblock->hashPrevBlock.GetHex());
+ result.pushKV("previousblockhash", block.hashPrevBlock.GetHex());
result.pushKV("transactions", std::move(transactions));
result.pushKV("coinbaseaux", std::move(aux));
- result.pushKV("coinbasevalue", (int64_t)pblock->vtx[0]->vout[0].nValue);
+ result.pushKV("coinbasevalue", (int64_t)block.vtx[0]->vout[0].nValue);
result.pushKV("longpollid", tip.GetHex() + ToString(nTransactionsUpdatedLast));
result.pushKV("target", hashTarget.GetHex());
result.pushKV("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1);
@@ -962,16 +954,16 @@ static RPCHelpMan getblocktemplate()
if (!fPreSegWit) {
result.pushKV("weightlimit", (int64_t)MAX_BLOCK_WEIGHT);
}
- result.pushKV("curtime", pblock->GetBlockTime());
- result.pushKV("bits", strprintf("%08x", pblock->nBits));
+ result.pushKV("curtime", block.GetBlockTime());
+ result.pushKV("bits", strprintf("%08x", block.nBits));
result.pushKV("height", (int64_t)(pindexPrev->nHeight+1));
if (consensusParams.signet_blocks) {
result.pushKV("signet_challenge", HexStr(consensusParams.signet_challenge));
}
- if (!pblocktemplate->vchCoinbaseCommitment.empty()) {
- result.pushKV("default_witness_commitment", HexStr(pblocktemplate->vchCoinbaseCommitment));
+ if (!block_template->getCoinbaseCommitment().empty()) {
+ result.pushKV("default_witness_commitment", HexStr(block_template->getCoinbaseCommitment()));
}
return result;
@@ -1098,7 +1090,7 @@ static RPCHelpMan submitheader()
}
BlockValidationState state;
- chainman.ProcessNewBlockHeaders({h}, /*min_pow_checked=*/true, state);
+ chainman.ProcessNewBlockHeaders({{h}}, /*min_pow_checked=*/true, state);
if (state.IsValid()) return UniValue::VNULL;
if (state.IsError()) {
throw JSONRPCError(RPC_VERIFY_ERROR, state.ToString());
diff --git a/src/rpc/node.cpp b/src/rpc/node.cpp
index 65b0a93cdd..af2e1d0eaa 100644
--- a/src/rpc/node.cpp
+++ b/src/rpc/node.cpp
@@ -221,7 +221,6 @@ static RPCHelpMan logging()
"The valid logging categories are: " + LogInstance().LogCategoriesString() + "\n"
"In addition, the following are available as category names with special meanings:\n"
" - \"all\", \"1\" : represent all logging categories.\n"
- " - \"none\", \"0\" : even if other logging categories are specified, ignore all of them.\n"
,
{
{"include", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The categories to add to debug logging",
@@ -245,15 +244,15 @@ static RPCHelpMan logging()
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
- uint32_t original_log_categories = LogInstance().GetCategoryMask();
+ BCLog::CategoryMask original_log_categories = LogInstance().GetCategoryMask();
if (request.params[0].isArray()) {
EnableOrDisableLogCategories(request.params[0], true);
}
if (request.params[1].isArray()) {
EnableOrDisableLogCategories(request.params[1], false);
}
- uint32_t updated_log_categories = LogInstance().GetCategoryMask();
- uint32_t changed_log_categories = original_log_categories ^ updated_log_categories;
+ BCLog::CategoryMask updated_log_categories = LogInstance().GetCategoryMask();
+ BCLog::CategoryMask changed_log_categories = original_log_categories ^ updated_log_categories;
// Update libevent logging if BCLog::LIBEVENT has changed.
if (changed_log_categories & BCLog::LIBEVENT) {
diff --git a/src/rpc/output_script.cpp b/src/rpc/output_script.cpp
index 65a9be2762..49f3a81243 100644
--- a/src/rpc/output_script.cpp
+++ b/src/rpc/output_script.cpp
@@ -38,7 +38,7 @@ static RPCHelpMan validateaddress()
{
{RPCResult::Type::BOOL, "isvalid", "If the address is valid or not"},
{RPCResult::Type::STR, "address", /*optional=*/true, "The bitcoin address validated"},
- {RPCResult::Type::STR_HEX, "scriptPubKey", /*optional=*/true, "The hex-encoded scriptPubKey generated by the address"},
+ {RPCResult::Type::STR_HEX, "scriptPubKey", /*optional=*/true, "The hex-encoded output script generated by the address"},
{RPCResult::Type::BOOL, "isscript", /*optional=*/true, "If the key is a script"},
{RPCResult::Type::BOOL, "iswitness", /*optional=*/true, "If the address is a witness address"},
{RPCResult::Type::NUM, "witness_version", /*optional=*/true, "The version number of the witness program"},
@@ -175,7 +175,11 @@ static RPCHelpMan getdescriptorinfo()
RPCResult{
RPCResult::Type::OBJ, "", "",
{
- {RPCResult::Type::STR, "descriptor", "The descriptor in canonical form, without private keys"},
+ {RPCResult::Type::STR, "descriptor", "The descriptor in canonical form, without private keys. For a multipath descriptor, only the first will be returned."},
+ {RPCResult::Type::ARR, "multipath_expansion", /*optional=*/true, "All descriptors produced by expanding multipath derivation elements. Only if the provided descriptor specifies multipath derivation elements.",
+ {
+ {RPCResult::Type::STR, "", ""},
+ }},
{RPCResult::Type::STR, "checksum", "The checksum for the input descriptor"},
{RPCResult::Type::BOOL, "isrange", "Whether the descriptor is ranged"},
{RPCResult::Type::BOOL, "issolvable", "Whether the descriptor is solvable"},
@@ -191,22 +195,65 @@ static RPCHelpMan getdescriptorinfo()
{
FlatSigningProvider provider;
std::string error;
- auto desc = Parse(request.params[0].get_str(), provider, error);
- if (!desc) {
+ auto descs = Parse(request.params[0].get_str(), provider, error);
+ if (descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
UniValue result(UniValue::VOBJ);
- result.pushKV("descriptor", desc->ToString());
+ result.pushKV("descriptor", descs.at(0)->ToString());
+
+ if (descs.size() > 1) {
+ UniValue multipath_descs(UniValue::VARR);
+ for (const auto& d : descs) {
+ multipath_descs.push_back(d->ToString());
+ }
+ result.pushKV("multipath_expansion", multipath_descs);
+ }
+
result.pushKV("checksum", GetDescriptorChecksum(request.params[0].get_str()));
- result.pushKV("isrange", desc->IsRange());
- result.pushKV("issolvable", desc->IsSolvable());
+ result.pushKV("isrange", descs.at(0)->IsRange());
+ result.pushKV("issolvable", descs.at(0)->IsSolvable());
result.pushKV("hasprivatekeys", provider.keys.size() > 0);
return result;
},
};
}
+static UniValue DeriveAddresses(const Descriptor* desc, int64_t range_begin, int64_t range_end, FlatSigningProvider& key_provider)
+{
+ UniValue addresses(UniValue::VARR);
+
+ for (int64_t i = range_begin; i <= range_end; ++i) {
+ FlatSigningProvider provider;
+ std::vector<CScript> scripts;
+ if (!desc->Expand(i, key_provider, scripts, provider)) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot derive script without private keys");
+ }
+
+ for (const CScript& script : scripts) {
+ CTxDestination dest;
+ if (!ExtractDestination(script, dest)) {
+ // ExtractDestination no longer returns true for P2PK since it doesn't have a corresponding address
+ // However combo will output P2PK and should just ignore that script
+ if (scripts.size() > 1 && std::get_if<PubKeyDestination>(&dest)) {
+ continue;
+ }
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Descriptor does not have a corresponding address");
+ }
+
+ addresses.push_back(EncodeDestination(dest));
+ }
+ }
+
+ // This should not be possible, but an assert seems overkill:
+ if (addresses.empty()) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Unexpected empty result");
+ }
+
+ return addresses;
+}
+
static RPCHelpMan deriveaddresses()
{
const std::string EXAMPLE_DESCRIPTOR = "wpkh([d34db33f/84h/0h/0h]xpub6DJ2dNUysrn5Vt36jH2KLBT2i1auw1tTSSomg8PhqNiUtx8QX2SvC9nrHu81fT41fvDUnhMjEzQgXnQjKEu3oaqMSzhSrHMxyyoEAmUHQbY/0/*)#cjjspncu";
@@ -217,7 +264,7 @@ static RPCHelpMan deriveaddresses()
" pkh(<pubkey>) P2PKH outputs for the given pubkey\n"
" wpkh(<pubkey>) Native segwit P2PKH outputs for the given pubkey\n"
" sh(multi(<n>,<pubkey>,<pubkey>,...)) P2SH-multisig outputs for the given threshold and pubkeys\n"
- " raw(<hex script>) Outputs whose scriptPubKey equals the specified hex scripts\n"
+ " raw(<hex script>) Outputs whose output script equals the specified hex-encoded bytes\n"
" tr(<pubkey>,multi_a(<n>,<pubkey>,<pubkey>,...)) P2TR-multisig outputs for the given threshold and pubkeys\n"
"\nIn the above, <pubkey> either refers to a fixed public key in hexadecimal notation, or to an xpub/xprv optionally followed by one\n"
"or more path elements separated by \"/\", where \"h\" represents a hardened child key.\n"
@@ -226,11 +273,24 @@ static RPCHelpMan deriveaddresses()
{"descriptor", RPCArg::Type::STR, RPCArg::Optional::NO, "The descriptor."},
{"range", RPCArg::Type::RANGE, RPCArg::Optional::OMITTED, "If a ranged descriptor is used, this specifies the end or the range (in [begin,end] notation) to derive."},
},
- RPCResult{
- RPCResult::Type::ARR, "", "",
- {
- {RPCResult::Type::STR, "address", "the derived addresses"},
- }
+ {
+ RPCResult{"for single derivation descriptors",
+ RPCResult::Type::ARR, "", "",
+ {
+ {RPCResult::Type::STR, "address", "the derived addresses"},
+ }
+ },
+ RPCResult{"for multipath descriptors",
+ RPCResult::Type::ARR, "", "The derived addresses for each of the multipath expansions of the descriptor, in multipath specifier order",
+ {
+ {
+ RPCResult::Type::ARR, "", "The derived addresses for a multipath descriptor expansion",
+ {
+ {RPCResult::Type::STR, "address", "the derived address"},
+ },
+ },
+ },
+ },
},
RPCExamples{
"First three native segwit receive addresses\n" +
@@ -250,11 +310,11 @@ static RPCHelpMan deriveaddresses()
FlatSigningProvider key_provider;
std::string error;
- auto desc = Parse(desc_str, key_provider, error, /* require_checksum = */ true);
- if (!desc) {
+ auto descs = Parse(desc_str, key_provider, error, /* require_checksum = */ true);
+ if (descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
-
+ auto& desc = descs.at(0);
if (!desc->IsRange() && request.params.size() > 1) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor");
}
@@ -263,36 +323,18 @@ static RPCHelpMan deriveaddresses()
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range must be specified for a ranged descriptor");
}
- UniValue addresses(UniValue::VARR);
-
- for (int64_t i = range_begin; i <= range_end; ++i) {
- FlatSigningProvider provider;
- std::vector<CScript> scripts;
- if (!desc->Expand(i, key_provider, scripts, provider)) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot derive script without private keys");
- }
+ UniValue addresses = DeriveAddresses(desc.get(), range_begin, range_end, key_provider);
- for (const CScript& script : scripts) {
- CTxDestination dest;
- if (!ExtractDestination(script, dest)) {
- // ExtractDestination no longer returns true for P2PK since it doesn't have a corresponding address
- // However combo will output P2PK and should just ignore that script
- if (scripts.size() > 1 && std::get_if<PubKeyDestination>(&dest)) {
- continue;
- }
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Descriptor does not have a corresponding address");
- }
-
- addresses.push_back(EncodeDestination(dest));
- }
+ if (descs.size() == 1) {
+ return addresses;
}
- // This should not be possible, but an assert seems overkill:
- if (addresses.empty()) {
- throw JSONRPCError(RPC_MISC_ERROR, "Unexpected empty result");
+ UniValue ret(UniValue::VARR);
+ ret.push_back(addresses);
+ for (size_t i = 1; i < descs.size(); ++i) {
+ ret.push_back(DeriveAddresses(descs.at(i).get(), range_begin, range_end, key_provider));
}
-
- return addresses;
+ return ret;
},
};
}
diff --git a/src/rpc/protocol.h b/src/rpc/protocol.h
index 83a9010681..0574335c96 100644
--- a/src/rpc/protocol.h
+++ b/src/rpc/protocol.h
@@ -46,14 +46,13 @@ enum RPCErrorCode
RPC_DESERIALIZATION_ERROR = -22, //!< Error parsing or validating structure in raw format
RPC_VERIFY_ERROR = -25, //!< General error during transaction or block submission
RPC_VERIFY_REJECTED = -26, //!< Transaction or block was rejected by network rules
- RPC_VERIFY_ALREADY_IN_CHAIN = -27, //!< Transaction already in chain
+ RPC_VERIFY_ALREADY_IN_UTXO_SET = -27, //!< Transaction already in utxo set
RPC_IN_WARMUP = -28, //!< Client still warming up
RPC_METHOD_DEPRECATED = -32, //!< RPC method is deprecated
//! Aliases for backward compatibility
RPC_TRANSACTION_ERROR = RPC_VERIFY_ERROR,
RPC_TRANSACTION_REJECTED = RPC_VERIFY_REJECTED,
- RPC_TRANSACTION_ALREADY_IN_CHAIN= RPC_VERIFY_ALREADY_IN_CHAIN,
//! P2P client errors
RPC_CLIENT_NOT_CONNECTED = -9, //!< Bitcoin is not connected
diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp
index 75b538061d..bb072370ce 100644
--- a/src/rpc/rawtransaction.cpp
+++ b/src/rpc/rawtransaction.cpp
@@ -85,9 +85,9 @@ static void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue&
static std::vector<RPCResult> ScriptPubKeyDoc() {
return
{
- {RPCResult::Type::STR, "asm", "Disassembly of the public key script"},
+ {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
{RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
- {RPCResult::Type::STR_HEX, "hex", "The raw public key script bytes, hex-encoded"},
+ {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
{RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
{RPCResult::Type::STR, "type", "The type (one of: " + GetAllOutputTypes() + ")"},
};
@@ -405,11 +405,16 @@ static RPCHelpMan getrawtransaction()
CBlockUndo blockUndo;
CBlock block;
- if (tx->IsCoinBase() || !blockindex || WITH_LOCK(::cs_main, return chainman.m_blockman.IsBlockPruned(*blockindex)) ||
- !(chainman.m_blockman.UndoReadFromDisk(blockUndo, *blockindex) && chainman.m_blockman.ReadBlockFromDisk(block, *blockindex))) {
+ if (tx->IsCoinBase() || !blockindex || WITH_LOCK(::cs_main, return !(blockindex->nStatus & BLOCK_HAVE_MASK))) {
TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate());
return result;
}
+ if (!chainman.m_blockman.UndoReadFromDisk(blockUndo, *blockindex)) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Undo data expected but can't be read. This could be due to disk corruption or a conflict with a pruning event.");
+ }
+ if (!chainman.m_blockman.ReadBlockFromDisk(block, *blockindex)) {
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Block data expected but can't be read. This could be due to disk corruption or a conflict with a pruning event.");
+ }
CTxUndo* undoTX {nullptr};
auto it = std::find_if(block.vtx.begin(), block.vtx.end(), [tx](CTransactionRef t){ return *t == *tx; });
@@ -506,18 +511,18 @@ static RPCHelpMan decodescript()
RPCResult{
RPCResult::Type::OBJ, "", "",
{
- {RPCResult::Type::STR, "asm", "Script public key"},
+ {RPCResult::Type::STR, "asm", "Disassembly of the script"},
{RPCResult::Type::STR, "desc", "Inferred descriptor for the script"},
{RPCResult::Type::STR, "type", "The output type (e.g. " + GetAllOutputTypes() + ")"},
{RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
{RPCResult::Type::STR, "p2sh", /*optional=*/true,
"address of P2SH script wrapping this redeem script (not returned for types that should not be wrapped)"},
{RPCResult::Type::OBJ, "segwit", /*optional=*/true,
- "Result of a witness script public key wrapping this redeem script (not returned for types that should not be wrapped)",
+ "Result of a witness output script wrapping this redeem script (not returned for types that should not be wrapped)",
{
- {RPCResult::Type::STR, "asm", "String representation of the script public key"},
- {RPCResult::Type::STR_HEX, "hex", "Hex string of the script public key"},
- {RPCResult::Type::STR, "type", "The type of the script public key (e.g. witness_v0_keyhash or witness_v0_scripthash)"},
+ {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
+ {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
+ {RPCResult::Type::STR, "type", "The type of the output script (e.g. witness_v0_keyhash or witness_v0_scripthash)"},
{RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
{RPCResult::Type::STR, "desc", "Inferred descriptor for the script"},
{RPCResult::Type::STR, "p2sh-segwit", "address of the P2SH script wrapping this witness redeem script"},
@@ -557,6 +562,7 @@ static RPCHelpMan decodescript()
case TxoutType::SCRIPTHASH:
case TxoutType::WITNESS_UNKNOWN:
case TxoutType::WITNESS_V1_TAPROOT:
+ case TxoutType::ANCHOR:
// Should not be wrapped
return false;
} // no default case, so the compiler can warn about missing cases
@@ -599,6 +605,7 @@ static RPCHelpMan decodescript()
case TxoutType::WITNESS_V0_KEYHASH:
case TxoutType::WITNESS_V0_SCRIPTHASH:
case TxoutType::WITNESS_V1_TAPROOT:
+ case TxoutType::ANCHOR:
// Should not be wrapped
return false;
} // no default case, so the compiler can warn about missing cases
@@ -735,7 +742,7 @@ static RPCHelpMan signrawtransactionwithkey()
{
{"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
{"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
- {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "script key"},
+ {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "output script"},
{"redeemScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2SH) redeem script"},
{"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2WSH or P2SH-P2WSH) witness script"},
{"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "(required for Segwit inputs) the amount spent"},
@@ -833,9 +840,9 @@ const RPCResult decodepsbt_inputs{
{RPCResult::Type::NUM, "amount", "The value in " + CURRENCY_UNIT},
{RPCResult::Type::OBJ, "scriptPubKey", "",
{
- {RPCResult::Type::STR, "asm", "Disassembly of the public key script"},
+ {RPCResult::Type::STR, "asm", "Disassembly of the output script"},
{RPCResult::Type::STR, "desc", "Inferred descriptor for the output"},
- {RPCResult::Type::STR_HEX, "hex", "The raw public key script bytes, hex-encoded"},
+ {RPCResult::Type::STR_HEX, "hex", "The raw output script bytes, hex-encoded"},
{RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
{RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"},
}},
@@ -1790,8 +1797,8 @@ static RPCHelpMan joinpsbts()
std::iota(output_indices.begin(), output_indices.end(), 0);
// Shuffle input and output indices lists
- Shuffle(input_indices.begin(), input_indices.end(), FastRandomContext());
- Shuffle(output_indices.begin(), output_indices.end(), FastRandomContext());
+ std::shuffle(input_indices.begin(), input_indices.end(), FastRandomContext());
+ std::shuffle(output_indices.begin(), output_indices.end(), FastRandomContext());
PartiallySignedTransaction shuffled_psbt;
shuffled_psbt.tx = CMutableTransaction();
@@ -1838,8 +1845,8 @@ static RPCHelpMan analyzepsbt()
{
{RPCResult::Type::STR_HEX, "keyid", "Public key ID, hash160 of the public key, of a public key whose signature is missing"},
}},
- {RPCResult::Type::STR_HEX, "redeemscript", /*optional=*/true, "Hash160 of the redeemScript that is missing"},
- {RPCResult::Type::STR_HEX, "witnessscript", /*optional=*/true, "SHA256 of the witnessScript that is missing"},
+ {RPCResult::Type::STR_HEX, "redeemscript", /*optional=*/true, "Hash160 of the redeem script that is missing"},
+ {RPCResult::Type::STR_HEX, "witnessscript", /*optional=*/true, "SHA256 of the witness script that is missing"},
}},
{RPCResult::Type::STR, "next", /*optional=*/true, "Role of the next person that this input needs to go to"},
}},
diff --git a/src/rpc/request.cpp b/src/rpc/request.cpp
index 083d1be44f..afd98f8875 100644
--- a/src/rpc/request.cpp
+++ b/src/rpc/request.cpp
@@ -226,10 +226,10 @@ void JSONRPCRequest::parse(const UniValue& valRequest)
throw JSONRPCError(RPC_INVALID_REQUEST, "Method must be a string");
strMethod = valMethod.get_str();
if (fLogIPs)
- LogPrint(BCLog::RPC, "ThreadRPCServer method=%s user=%s peeraddr=%s\n", SanitizeString(strMethod),
+ LogDebug(BCLog::RPC, "ThreadRPCServer method=%s user=%s peeraddr=%s\n", SanitizeString(strMethod),
this->authUser, this->peerAddr);
else
- LogPrint(BCLog::RPC, "ThreadRPCServer method=%s user=%s\n", SanitizeString(strMethod), this->authUser);
+ LogDebug(BCLog::RPC, "ThreadRPCServer method=%s user=%s\n", SanitizeString(strMethod), this->authUser);
// Parse params
const UniValue& valParams{request.find_value("params")};
diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
index 19063fa5be..086f609ac3 100644
--- a/src/rpc/server.cpp
+++ b/src/rpc/server.cpp
@@ -11,6 +11,7 @@
#include <common/system.h>
#include <logging.h>
#include <node/context.h>
+#include <node/kernel_notifications.h>
#include <rpc/server_util.h>
#include <rpc/util.h>
#include <sync.h>
@@ -18,8 +19,7 @@
#include <util/strencodings.h>
#include <util/string.h>
#include <util/time.h>
-
-#include <boost/signals2/signal.hpp>
+#include <validation.h>
#include <cassert>
#include <chrono>
@@ -69,22 +69,6 @@ struct RPCCommandExecution
}
};
-static struct CRPCSignals
-{
- boost::signals2::signal<void ()> Started;
- boost::signals2::signal<void ()> Stopped;
-} g_rpcSignals;
-
-void RPCServer::OnStarted(std::function<void ()> slot)
-{
- g_rpcSignals.Started.connect(slot);
-}
-
-void RPCServer::OnStopped(std::function<void ()> slot)
-{
- g_rpcSignals.Stopped.connect(slot);
-}
-
std::string CRPCTable::help(const std::string& strCommand, const JSONRPCRequest& helpreq) const
{
std::string strRet;
@@ -295,9 +279,8 @@ bool CRPCTable::removeCommand(const std::string& name, const CRPCCommand* pcmd)
void StartRPC()
{
- LogPrint(BCLog::RPC, "Starting RPC\n");
+ LogDebug(BCLog::RPC, "Starting RPC\n");
g_rpc_running = true;
- g_rpcSignals.Started();
}
void InterruptRPC()
@@ -305,22 +288,25 @@ void InterruptRPC()
static std::once_flag g_rpc_interrupt_flag;
// This function could be called twice if the GUI has been started with -server=1.
std::call_once(g_rpc_interrupt_flag, []() {
- LogPrint(BCLog::RPC, "Interrupting RPC\n");
+ LogDebug(BCLog::RPC, "Interrupting RPC\n");
// Interrupt e.g. running longpolls
g_rpc_running = false;
});
}
-void StopRPC()
+void StopRPC(const std::any& context)
{
static std::once_flag g_rpc_stop_flag;
// This function could be called twice if the GUI has been started with -server=1.
assert(!g_rpc_running);
- std::call_once(g_rpc_stop_flag, []() {
- LogPrint(BCLog::RPC, "Stopping RPC\n");
+ std::call_once(g_rpc_stop_flag, [&]() {
+ LogDebug(BCLog::RPC, "Stopping RPC\n");
WITH_LOCK(g_deadline_timers_mutex, deadlineTimers.clear());
DeleteAuthCookie();
- g_rpcSignals.Stopped();
+ node::NodeContext& node = EnsureAnyNodeContext(context);
+ // The notifications interface doesn't exist between initialization step 4a and 7.
+ if (node.notifications) node.notifications->m_tip_block_cv.notify_all();
+ LogDebug(BCLog::RPC, "RPC stopped.\n");
});
}
@@ -583,7 +569,7 @@ void RPCRunLater(const std::string& name, std::function<void()> func, int64_t nS
throw JSONRPCError(RPC_INTERNAL_ERROR, "No timer handler registered for RPC");
LOCK(g_deadline_timers_mutex);
deadlineTimers.erase(name);
- LogPrint(BCLog::RPC, "queue run of timer %s in %i seconds (using %s)\n", name, nSeconds, timerInterface->Name());
+ LogDebug(BCLog::RPC, "queue run of timer %s in %i seconds (using %s)\n", name, nSeconds, timerInterface->Name());
deadlineTimers.emplace(name, std::unique_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000)));
}
diff --git a/src/rpc/server.h b/src/rpc/server.h
index 5735aff821..a8896d4247 100644
--- a/src/rpc/server.h
+++ b/src/rpc/server.h
@@ -9,6 +9,7 @@
#include <rpc/request.h>
#include <rpc/util.h>
+#include <any>
#include <functional>
#include <map>
#include <stdint.h>
@@ -18,12 +19,6 @@
class CRPCCommand;
-namespace RPCServer
-{
- void OnStarted(std::function<void ()> slot);
- void OnStopped(std::function<void ()> slot);
-}
-
/** Query whether RPC is running */
bool IsRPCRunning();
@@ -48,7 +43,7 @@ bool RPCIsInWarmup(std::string *outStatus);
class RPCTimerBase
{
public:
- virtual ~RPCTimerBase() {}
+ virtual ~RPCTimerBase() = default;
};
/**
@@ -57,7 +52,7 @@ public:
class RPCTimerInterface
{
public:
- virtual ~RPCTimerInterface() {}
+ virtual ~RPCTimerInterface() = default;
/** Implementation name */
virtual const char *Name() = 0;
/** Factory function for timers.
@@ -178,7 +173,7 @@ extern CRPCTable tableRPC;
void StartRPC();
void InterruptRPC();
-void StopRPC();
+void StopRPC(const std::any& context);
UniValue JSONRPCExec(const JSONRPCRequest& jreq, bool catch_errors);
#endif // BITCOIN_RPC_SERVER_H
diff --git a/src/rpc/txoutproof.cpp b/src/rpc/txoutproof.cpp
index 7958deb677..40294fda06 100644
--- a/src/rpc/txoutproof.cpp
+++ b/src/rpc/txoutproof.cpp
@@ -10,6 +10,7 @@
#include <merkleblock.h>
#include <node/blockstorage.h>
#include <primitives/transaction.h>
+#include <rpc/blockchain.h>
#include <rpc/server.h>
#include <rpc/server_util.h>
#include <rpc/util.h>
@@ -96,6 +97,10 @@ static RPCHelpMan gettxoutproof()
}
}
+ {
+ LOCK(cs_main);
+ CheckBlockDataAvailability(chainman.m_blockman, *pblockindex, /*check_for_undo=*/false);
+ }
CBlock block;
if (!chainman.m_blockman.ReadBlockFromDisk(block, *pblockindex)) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp
index 4df4466c49..678bac7a18 100644
--- a/src/rpc/util.cpp
+++ b/src/rpc/util.cpp
@@ -19,6 +19,7 @@
#include <script/signingprovider.h>
#include <script/solver.h>
#include <tinyformat.h>
+#include <uint256.h>
#include <univalue.h>
#include <util/check.h>
#include <util/result.h>
@@ -102,11 +103,11 @@ CFeeRate ParseFeeRate(const UniValue& json)
uint256 ParseHashV(const UniValue& v, std::string_view name)
{
const std::string& strHex(v.get_str());
- if (64 != strHex.length())
- throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be of length %d (not %d, for '%s')", name, 64, strHex.length(), strHex));
- if (!IsHex(strHex)) // Note: IsHex("") is false
- throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be hexadecimal string (not '%s')", name, strHex));
- return uint256S(strHex);
+ if (auto rv{uint256::FromHex(strHex)}) return *rv;
+ if (auto expected_len{uint256::size() * 2}; strHex.length() != expected_len) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be of length %d (not %d, for '%s')", name, expected_len, strHex.length(), strHex));
+ }
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be hexadecimal string (not '%s')", name, strHex));
}
uint256 ParseHashO(const UniValue& o, std::string_view strKey)
{
@@ -332,6 +333,14 @@ public:
return obj;
}
+ UniValue operator()(const PayToAnchor& anchor) const
+ {
+ UniValue obj(UniValue::VOBJ);
+ obj.pushKV("isscript", true);
+ obj.pushKV("iswitness", true);
+ return obj;
+ }
+
UniValue operator()(const WitnessUnknown& id) const
{
UniValue obj(UniValue::VOBJ);
@@ -391,8 +400,8 @@ RPCErrorCode RPCErrorFromTransactionError(TransactionError terr)
switch (terr) {
case TransactionError::MEMPOOL_REJECTED:
return RPC_TRANSACTION_REJECTED;
- case TransactionError::ALREADY_IN_CHAIN:
- return RPC_TRANSACTION_ALREADY_IN_CHAIN;
+ case TransactionError::ALREADY_IN_UTXO_SET:
+ return RPC_VERIFY_ALREADY_IN_UTXO_SET;
default: break;
}
return RPC_TRANSACTION_ERROR;
@@ -1337,24 +1346,26 @@ std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, Fl
}
std::string error;
- auto desc = Parse(desc_str, provider, error);
- if (!desc) {
+ auto descs = Parse(desc_str, provider, error);
+ if (descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
- if (!desc->IsRange()) {
+ if (!descs.at(0)->IsRange()) {
range.first = 0;
range.second = 0;
}
std::vector<CScript> ret;
for (int i = range.first; i <= range.second; ++i) {
- std::vector<CScript> scripts;
- if (!desc->Expand(i, provider, scripts, provider)) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys: '%s'", desc_str));
- }
- if (expand_priv) {
- desc->ExpandPrivate(/*pos=*/i, provider, /*out=*/provider);
+ for (const auto& desc : descs) {
+ std::vector<CScript> scripts;
+ if (!desc->Expand(i, provider, scripts, provider)) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys: '%s'", desc_str));
+ }
+ if (expand_priv) {
+ desc->ExpandPrivate(/*pos=*/i, provider, /*out=*/provider);
+ }
+ std::move(scripts.begin(), scripts.end(), std::back_inserter(ret));
}
- std::move(scripts.begin(), scripts.end(), std::back_inserter(ret));
}
return ret;
}
diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp
index 0987db194c..5026470edc 100644
--- a/src/script/descriptor.cpp
+++ b/src/script/descriptor.cpp
@@ -21,6 +21,7 @@
#include <util/strencodings.h>
#include <util/vector.h>
+#include <algorithm>
#include <memory>
#include <numeric>
#include <optional>
@@ -116,13 +117,13 @@ std::string DescriptorChecksum(const Span<const char>& span)
* As a result, within-group-of-32 errors count as 1 symbol, as do cross-group errors that don't affect
* the position within the groups.
*/
- static std::string INPUT_CHARSET =
+ static const std::string INPUT_CHARSET =
"0123456789()[],'/*abcdefgh@:$%{}"
"IJKLMNOPQRSTUVWXYZ&+-.;<=>?!^_|~"
"ijklmnopqrstuvwxyzABCDEFGH`#\"\\ ";
/** The character set for the checksum itself (same as bech32). */
- static std::string CHECKSUM_CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
+ static const std::string CHECKSUM_CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
uint64_t c = 1;
int cls = 0;
@@ -219,6 +220,9 @@ public:
virtual std::optional<CPubKey> GetRootPubKey() const = 0;
/** Return the extended public key for this PubkeyProvider, if it has one. */
virtual std::optional<CExtPubKey> GetRootExtPubKey() const = 0;
+
+ /** Make a deep copy of this PubkeyProvider */
+ virtual std::unique_ptr<PubkeyProvider> Clone() const = 0;
};
class OriginPubkeyProvider final : public PubkeyProvider
@@ -280,6 +284,10 @@ public:
{
return m_provider->GetRootExtPubKey();
}
+ std::unique_ptr<PubkeyProvider> Clone() const override
+ {
+ return std::make_unique<OriginPubkeyProvider>(m_expr_index, m_origin, m_provider->Clone(), m_apostrophe);
+ }
};
/** An object representing a parsed constant public key in a descriptor. */
@@ -333,6 +341,10 @@ public:
{
return std::nullopt;
}
+ std::unique_ptr<PubkeyProvider> Clone() const override
+ {
+ return std::make_unique<ConstPubkeyProvider>(m_expr_index, m_pubkey, m_xonly);
+ }
};
enum class DeriveType {
@@ -556,6 +568,10 @@ public:
{
return m_root_extkey;
}
+ std::unique_ptr<PubkeyProvider> Clone() const override
+ {
+ return std::make_unique<BIP32PubkeyProvider>(m_expr_index, m_root_extkey, m_path, m_derive, m_apostrophe);
+ }
};
/** Base class for all Descriptor implementations. */
@@ -771,6 +787,8 @@ public:
arg->GetPubKeys(pubkeys, ext_pubs);
}
}
+
+ virtual std::unique_ptr<DescriptorImpl> Clone() const = 0;
};
/** A parsed addr(A) descriptor. */
@@ -792,6 +810,10 @@ public:
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
std::optional<int64_t> ScriptSize() const override { return GetScriptForDestination(m_destination).size(); }
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<AddressDescriptor>(m_destination);
+ }
};
/** A parsed raw(H) descriptor. */
@@ -815,6 +837,11 @@ public:
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
std::optional<int64_t> ScriptSize() const override { return m_script.size(); }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<RawDescriptor>(m_script);
+ }
};
/** A parsed pk(P) descriptor. */
@@ -850,6 +877,11 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return 1; }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<PKDescriptor>(m_pubkey_args.at(0)->Clone(), m_xonly);
+ }
};
/** A parsed pkh(P) descriptor. */
@@ -879,6 +911,11 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return 2; }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<PKHDescriptor>(m_pubkey_args.at(0)->Clone());
+ }
};
/** A parsed wpkh(P) descriptor. */
@@ -908,6 +945,11 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return 2; }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<WPKHDescriptor>(m_pubkey_args.at(0)->Clone());
+ }
};
/** A parsed combo(P) descriptor. */
@@ -932,6 +974,10 @@ protected:
public:
ComboDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "combo") {}
bool IsSingleType() const final { return false; }
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<ComboDescriptor>(m_pubkey_args.at(0)->Clone());
+ }
};
/** A parsed multi(...) or sortedmulti(...) descriptor */
@@ -970,6 +1016,14 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return 1 + m_threshold; }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ std::vector<std::unique_ptr<PubkeyProvider>> providers;
+ providers.reserve(m_pubkey_args.size());
+ std::transform(m_pubkey_args.begin(), m_pubkey_args.end(), providers.begin(), [](const std::unique_ptr<PubkeyProvider>& p) { return p->Clone(); });
+ return std::make_unique<MultisigDescriptor>(m_threshold, std::move(providers), m_sorted);
+ }
};
/** A parsed (sorted)multi_a(...) descriptor. Always uses x-only pubkeys. */
@@ -1006,6 +1060,16 @@ public:
}
std::optional<int64_t> MaxSatisfactionElems() const override { return m_pubkey_args.size(); }
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ std::vector<std::unique_ptr<PubkeyProvider>> providers;
+ providers.reserve(m_pubkey_args.size());
+ for (const auto& arg : m_pubkey_args) {
+ providers.push_back(arg->Clone());
+ }
+ return std::make_unique<MultiADescriptor>(m_threshold, std::move(providers), m_sorted);
+ }
};
/** A parsed sh(...) descriptor. */
@@ -1051,6 +1115,11 @@ public:
if (const auto sub_elems = m_subdescriptor_args[0]->MaxSatisfactionElems()) return 1 + *sub_elems;
return {};
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<SHDescriptor>(m_subdescriptor_args.at(0)->Clone());
+ }
};
/** A parsed wsh(...) descriptor. */
@@ -1087,6 +1156,11 @@ public:
if (const auto sub_elems = m_subdescriptor_args[0]->MaxSatisfactionElems()) return 1 + *sub_elems;
return {};
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<WSHDescriptor>(m_subdescriptor_args.at(0)->Clone());
+ }
};
/** A parsed tr(...) descriptor. */
@@ -1152,6 +1226,14 @@ public:
// FIXME: See above, we assume keypath spend.
return 1;
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ std::vector<std::unique_ptr<DescriptorImpl>> subdescs;
+ subdescs.reserve(m_subdescriptor_args.size());
+ std::transform(m_subdescriptor_args.begin(), m_subdescriptor_args.end(), subdescs.begin(), [](const std::unique_ptr<DescriptorImpl>& d) { return d->Clone(); });
+ return std::make_unique<TRDescriptor>(m_pubkey_args.at(0)->Clone(), std::move(subdescs), m_depths);
+ }
};
/* We instantiate Miniscript here with a simple integer as key type.
@@ -1270,6 +1352,16 @@ public:
std::optional<int64_t> MaxSatisfactionElems() const override {
return m_node->GetStackSize();
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ std::vector<std::unique_ptr<PubkeyProvider>> providers;
+ providers.reserve(m_pubkey_args.size());
+ for (const auto& arg : m_pubkey_args) {
+ providers.push_back(arg->Clone());
+ }
+ return std::make_unique<MiniscriptDescriptor>(std::move(providers), miniscript::MakeNodeRef<uint32_t>(*m_node));
+ }
};
/** A parsed rawtr(...) descriptor. */
@@ -1300,6 +1392,11 @@ public:
// See above, we assume keypath spend.
return 1;
}
+
+ std::unique_ptr<DescriptorImpl> Clone() const override
+ {
+ return std::make_unique<RawTRDescriptor>(m_pubkey_args.at(0)->Clone());
+ }
};
////////////////////////////////////////////////////////////////////////////
@@ -1314,50 +1411,110 @@ enum class ParseScriptContext {
P2TR, //!< Inside tr() (either internal key, or BIP342 script leaf)
};
+std::optional<uint32_t> ParseKeyPathNum(Span<const char> elem, bool& apostrophe, std::string& error)
+{
+ bool hardened = false;
+ if (elem.size() > 0) {
+ const char last = elem[elem.size() - 1];
+ if (last == '\'' || last == 'h') {
+ elem = elem.first(elem.size() - 1);
+ hardened = true;
+ apostrophe = last == '\'';
+ }
+ }
+ uint32_t p;
+ if (!ParseUInt32(std::string(elem.begin(), elem.end()), &p)) {
+ error = strprintf("Key path value '%s' is not a valid uint32", std::string(elem.begin(), elem.end()));
+ return std::nullopt;
+ } else if (p > 0x7FFFFFFFUL) {
+ error = strprintf("Key path value %u is out of range", p);
+ return std::nullopt;
+ }
+
+ return std::make_optional<uint32_t>(p | (((uint32_t)hardened) << 31));
+}
+
/**
- * Parse a key path, being passed a split list of elements (the first element is ignored).
+ * Parse a key path, being passed a split list of elements (the first element is ignored because it is always the key).
*
* @param[in] split BIP32 path string, using either ' or h for hardened derivation
- * @param[out] out the key path
+ * @param[out] out Vector of parsed key paths
* @param[out] apostrophe only updated if hardened derivation is found
* @param[out] error parsing error message
+ * @param[in] allow_multipath Allows the parsed path to use the multipath specifier
* @returns false if parsing failed
**/
-[[nodiscard]] bool ParseKeyPath(const std::vector<Span<const char>>& split, KeyPath& out, bool& apostrophe, std::string& error)
+[[nodiscard]] bool ParseKeyPath(const std::vector<Span<const char>>& split, std::vector<KeyPath>& out, bool& apostrophe, std::string& error, bool allow_multipath)
{
+ KeyPath path;
+ std::optional<size_t> multipath_segment_index;
+ std::vector<uint32_t> multipath_values;
+ std::unordered_set<uint32_t> seen_multipath;
+
for (size_t i = 1; i < split.size(); ++i) {
- Span<const char> elem = split[i];
- bool hardened = false;
- if (elem.size() > 0) {
- const char last = elem[elem.size() - 1];
- if (last == '\'' || last == 'h') {
- elem = elem.first(elem.size() - 1);
- hardened = true;
- apostrophe = last == '\'';
+ const Span<const char>& elem = split[i];
+
+ // Check if element contain multipath specifier
+ if (!elem.empty() && elem.front() == '<' && elem.back() == '>') {
+ if (!allow_multipath) {
+ error = strprintf("Key path value '%s' specifies multipath in a section where multipath is not allowed", std::string(elem.begin(), elem.end()));
+ return false;
+ }
+ if (multipath_segment_index) {
+ error = "Multiple multipath key path specifiers found";
+ return false;
+ }
+
+ // Parse each possible value
+ std::vector<Span<const char>> nums = Split(Span(elem.begin()+1, elem.end()-1), ";");
+ if (nums.size() < 2) {
+ error = "Multipath key path specifiers must have at least two items";
+ return false;
}
+
+ for (const auto& num : nums) {
+ const auto& op_num = ParseKeyPathNum(num, apostrophe, error);
+ if (!op_num) return false;
+ auto [_, inserted] = seen_multipath.insert(*op_num);
+ if (!inserted) {
+ error = strprintf("Duplicated key path value %u in multipath specifier", *op_num);
+ return false;
+ }
+ multipath_values.emplace_back(*op_num);
+ }
+
+ path.emplace_back(); // Placeholder for multipath segment
+ multipath_segment_index = path.size()-1;
+ } else {
+ const auto& op_num = ParseKeyPathNum(elem, apostrophe, error);
+ if (!op_num) return false;
+ path.emplace_back(*op_num);
}
- uint32_t p;
- if (!ParseUInt32(std::string(elem.begin(), elem.end()), &p)) {
- error = strprintf("Key path value '%s' is not a valid uint32", std::string(elem.begin(), elem.end()));
- return false;
- } else if (p > 0x7FFFFFFFUL) {
- error = strprintf("Key path value %u is out of range", p);
- return false;
+ }
+
+ if (!multipath_segment_index) {
+ out.emplace_back(std::move(path));
+ } else {
+ // Replace the multipath placeholder with each value while generating paths
+ for (size_t i = 0; i < multipath_values.size(); i++) {
+ KeyPath branch_path = path;
+ branch_path[*multipath_segment_index] = multipath_values[i];
+ out.emplace_back(std::move(branch_path));
}
- out.push_back(p | (((uint32_t)hardened) << 31));
}
return true;
}
/** Parse a public key that excludes origin information. */
-std::unique_ptr<PubkeyProvider> ParsePubkeyInner(uint32_t key_exp_index, const Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, bool& apostrophe, std::string& error)
+std::vector<std::unique_ptr<PubkeyProvider>> ParsePubkeyInner(uint32_t key_exp_index, const Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, bool& apostrophe, std::string& error)
{
+ std::vector<std::unique_ptr<PubkeyProvider>> ret;
bool permit_uncompressed = ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH;
auto split = Split(sp, '/');
std::string str(split[0].begin(), split[0].end());
if (str.size() == 0) {
error = "No key provided";
- return nullptr;
+ return {};
}
if (split.size() == 1) {
if (IsHex(str)) {
@@ -1365,35 +1522,38 @@ std::unique_ptr<PubkeyProvider> ParsePubkeyInner(uint32_t key_exp_index, const S
CPubKey pubkey(data);
if (pubkey.IsValid() && !pubkey.IsValidNonHybrid()) {
error = "Hybrid public keys are not allowed";
- return nullptr;
+ return {};
}
if (pubkey.IsFullyValid()) {
if (permit_uncompressed || pubkey.IsCompressed()) {
- return std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, false);
+ ret.emplace_back(std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, false));
+ return ret;
} else {
error = "Uncompressed keys are not allowed";
- return nullptr;
+ return {};
}
} else if (data.size() == 32 && ctx == ParseScriptContext::P2TR) {
unsigned char fullkey[33] = {0x02};
std::copy(data.begin(), data.end(), fullkey + 1);
pubkey.Set(std::begin(fullkey), std::end(fullkey));
if (pubkey.IsFullyValid()) {
- return std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, true);
+ ret.emplace_back(std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, true));
+ return ret;
}
}
error = strprintf("Pubkey '%s' is invalid", str);
- return nullptr;
+ return {};
}
CKey key = DecodeSecret(str);
if (key.IsValid()) {
if (permit_uncompressed || key.IsCompressed()) {
CPubKey pubkey = key.GetPubKey();
out.keys.emplace(pubkey.GetID(), key);
- return std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, ctx == ParseScriptContext::P2TR);
+ ret.emplace_back(std::make_unique<ConstPubkeyProvider>(key_exp_index, pubkey, ctx == ParseScriptContext::P2TR));
+ return ret;
} else {
error = "Uncompressed keys are not allowed";
- return nullptr;
+ return {};
}
}
}
@@ -1401,33 +1561,37 @@ std::unique_ptr<PubkeyProvider> ParsePubkeyInner(uint32_t key_exp_index, const S
CExtPubKey extpubkey = DecodeExtPubKey(str);
if (!extkey.key.IsValid() && !extpubkey.pubkey.IsValid()) {
error = strprintf("key '%s' is not valid", str);
- return nullptr;
+ return {};
}
- KeyPath path;
+ std::vector<KeyPath> paths;
DeriveType type = DeriveType::NO;
- if (split.back() == Span{"*"}.first(1)) {
+ if (std::ranges::equal(split.back(), Span{"*"}.first(1))) {
split.pop_back();
type = DeriveType::UNHARDENED;
- } else if (split.back() == Span{"*'"}.first(2) || split.back() == Span{"*h"}.first(2)) {
- apostrophe = split.back() == Span{"*'"}.first(2);
+ } else if (std::ranges::equal(split.back(), Span{"*'"}.first(2)) || std::ranges::equal(split.back(), Span{"*h"}.first(2))) {
+ apostrophe = std::ranges::equal(split.back(), Span{"*'"}.first(2));
split.pop_back();
type = DeriveType::HARDENED;
}
- if (!ParseKeyPath(split, path, apostrophe, error)) return nullptr;
+ if (!ParseKeyPath(split, paths, apostrophe, error, /*allow_multipath=*/true)) return {};
if (extkey.key.IsValid()) {
extpubkey = extkey.Neuter();
out.keys.emplace(extpubkey.pubkey.GetID(), extkey.key);
}
- return std::make_unique<BIP32PubkeyProvider>(key_exp_index, extpubkey, std::move(path), type, apostrophe);
+ for (auto& path : paths) {
+ ret.emplace_back(std::make_unique<BIP32PubkeyProvider>(key_exp_index, extpubkey, std::move(path), type, apostrophe));
+ }
+ return ret;
}
/** Parse a public key including origin information (if enabled). */
-std::unique_ptr<PubkeyProvider> ParsePubkey(uint32_t key_exp_index, const Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
+std::vector<std::unique_ptr<PubkeyProvider>> ParsePubkey(uint32_t key_exp_index, const Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
{
+ std::vector<std::unique_ptr<PubkeyProvider>> ret;
auto origin_split = Split(sp, ']');
if (origin_split.size() > 2) {
error = "Multiple ']' characters found for a single pubkey";
- return nullptr;
+ return {};
}
// This is set if either the origin or path suffix contains a hardened derivation.
bool apostrophe = false;
@@ -1437,27 +1601,33 @@ std::unique_ptr<PubkeyProvider> ParsePubkey(uint32_t key_exp_index, const Span<c
if (origin_split[0].empty() || origin_split[0][0] != '[') {
error = strprintf("Key origin start '[ character expected but not found, got '%c' instead",
origin_split[0].empty() ? /** empty, implies split char */ ']' : origin_split[0][0]);
- return nullptr;
+ return {};
}
auto slash_split = Split(origin_split[0].subspan(1), '/');
if (slash_split[0].size() != 8) {
error = strprintf("Fingerprint is not 4 bytes (%u characters instead of 8 characters)", slash_split[0].size());
- return nullptr;
+ return {};
}
std::string fpr_hex = std::string(slash_split[0].begin(), slash_split[0].end());
if (!IsHex(fpr_hex)) {
error = strprintf("Fingerprint '%s' is not hex", fpr_hex);
- return nullptr;
+ return {};
}
auto fpr_bytes = ParseHex(fpr_hex);
KeyOriginInfo info;
static_assert(sizeof(info.fingerprint) == 4, "Fingerprint must be 4 bytes");
assert(fpr_bytes.size() == 4);
std::copy(fpr_bytes.begin(), fpr_bytes.end(), info.fingerprint);
- if (!ParseKeyPath(slash_split, info.path, apostrophe, error)) return nullptr;
- auto provider = ParsePubkeyInner(key_exp_index, origin_split[1], ctx, out, apostrophe, error);
- if (!provider) return nullptr;
- return std::make_unique<OriginPubkeyProvider>(key_exp_index, std::move(info), std::move(provider), apostrophe);
+ std::vector<KeyPath> path;
+ if (!ParseKeyPath(slash_split, path, apostrophe, error, /*allow_multipath=*/false)) return {};
+ info.path = path.at(0);
+ auto providers = ParsePubkeyInner(key_exp_index, origin_split[1], ctx, out, apostrophe, error);
+ if (providers.empty()) return {};
+ ret.reserve(providers.size());
+ for (auto& prov : providers) {
+ ret.emplace_back(std::make_unique<OriginPubkeyProvider>(key_exp_index, info, std::move(prov), apostrophe));
+ }
+ return ret;
}
std::unique_ptr<PubkeyProvider> InferPubkey(const CPubKey& pubkey, ParseScriptContext ctx, const SigningProvider& provider)
@@ -1499,8 +1669,8 @@ struct KeyParser {
FlatSigningProvider* m_out;
//! Must not be nullptr if parsing from Script.
const SigningProvider* m_in;
- //! List of keys contained in the Miniscript.
- mutable std::vector<std::unique_ptr<PubkeyProvider>> m_keys;
+ //! List of multipath expanded keys contained in the Miniscript.
+ mutable std::vector<std::vector<std::unique_ptr<PubkeyProvider>>> m_keys;
//! Used to detect key parsing errors within a Miniscript.
mutable std::string m_key_parsing_error;
//! The script context we're operating within (Tapscript or P2WSH).
@@ -1513,7 +1683,7 @@ struct KeyParser {
: m_out(out), m_in(in), m_script_ctx(ctx), m_offset(offset) {}
bool KeyCompare(const Key& a, const Key& b) const {
- return *m_keys.at(a) < *m_keys.at(b);
+ return *m_keys.at(a).at(0) < *m_keys.at(b).at(0);
}
ParseScriptContext ParseContext() const {
@@ -1529,14 +1699,14 @@ struct KeyParser {
assert(m_out);
Key key = m_keys.size();
auto pk = ParsePubkey(m_offset + key, {&*begin, &*end}, ParseContext(), *m_out, m_key_parsing_error);
- if (!pk) return {};
- m_keys.push_back(std::move(pk));
+ if (pk.empty()) return {};
+ m_keys.emplace_back(std::move(pk));
return key;
}
std::optional<std::string> ToString(const Key& key) const
{
- return m_keys.at(key)->ToString();
+ return m_keys.at(key).at(0)->ToString();
}
template<typename I> std::optional<Key> FromPKBytes(I begin, I end) const
@@ -1547,13 +1717,15 @@ struct KeyParser {
XOnlyPubKey pubkey;
std::copy(begin, end, pubkey.begin());
if (auto pubkey_provider = InferPubkey(pubkey.GetEvenCorrespondingCPubKey(), ParseContext(), *m_in)) {
- m_keys.push_back(std::move(pubkey_provider));
+ m_keys.emplace_back();
+ m_keys.back().push_back(std::move(pubkey_provider));
return key;
}
} else if (!miniscript::IsTapscript(m_script_ctx)) {
CPubKey pubkey(begin, end);
if (auto pubkey_provider = InferPubkey(pubkey, ParseContext(), *m_in)) {
- m_keys.push_back(std::move(pubkey_provider));
+ m_keys.emplace_back();
+ m_keys.back().push_back(std::move(pubkey_provider));
return key;
}
}
@@ -1571,7 +1743,8 @@ struct KeyParser {
if (m_in->GetPubKey(keyid, pubkey)) {
if (auto pubkey_provider = InferPubkey(pubkey, ParseContext(), *m_in)) {
Key key = m_keys.size();
- m_keys.push_back(std::move(pubkey_provider));
+ m_keys.emplace_back();
+ m_keys.back().push_back(std::move(pubkey_provider));
return key;
}
}
@@ -1585,44 +1758,54 @@ struct KeyParser {
/** Parse a script in a particular context. */
// NOLINTNEXTLINE(misc-no-recursion)
-std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
+std::vector<std::unique_ptr<DescriptorImpl>> ParseScript(uint32_t& key_exp_index, Span<const char>& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
{
using namespace script;
+ std::vector<std::unique_ptr<DescriptorImpl>> ret;
auto expr = Expr(sp);
if (Func("pk", expr)) {
- auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
- if (!pubkey) {
+ auto pubkeys = ParsePubkey(key_exp_index, expr, ctx, out, error);
+ if (pubkeys.empty()) {
error = strprintf("pk(): %s", error);
- return nullptr;
+ return {};
}
++key_exp_index;
- return std::make_unique<PKDescriptor>(std::move(pubkey), ctx == ParseScriptContext::P2TR);
+ for (auto& pubkey : pubkeys) {
+ ret.emplace_back(std::make_unique<PKDescriptor>(std::move(pubkey), ctx == ParseScriptContext::P2TR));
+ }
+ return ret;
}
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH || ctx == ParseScriptContext::P2WSH) && Func("pkh", expr)) {
- auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
- if (!pubkey) {
+ auto pubkeys = ParsePubkey(key_exp_index, expr, ctx, out, error);
+ if (pubkeys.empty()) {
error = strprintf("pkh(): %s", error);
- return nullptr;
+ return {};
}
++key_exp_index;
- return std::make_unique<PKHDescriptor>(std::move(pubkey));
+ for (auto& pubkey : pubkeys) {
+ ret.emplace_back(std::make_unique<PKHDescriptor>(std::move(pubkey)));
+ }
+ return ret;
} else if (ctx != ParseScriptContext::P2TR && Func("pkh", expr)) {
// Under Taproot, always the Miniscript parser deal with it.
error = "Can only have pkh at top level, in sh(), wsh(), or in tr()";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("combo", expr)) {
- auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
- if (!pubkey) {
+ auto pubkeys = ParsePubkey(key_exp_index, expr, ctx, out, error);
+ if (pubkeys.empty()) {
error = strprintf("combo(): %s", error);
- return nullptr;
+ return {};
}
++key_exp_index;
- return std::make_unique<ComboDescriptor>(std::move(pubkey));
+ for (auto& pubkey : pubkeys) {
+ ret.emplace_back(std::make_unique<ComboDescriptor>(std::move(pubkey)));
+ }
+ return ret;
} else if (Func("combo", expr)) {
error = "Can only have combo() at top level";
- return nullptr;
+ return {};
}
const bool multi = Func("multi", expr);
const bool sortedmulti = !multi && Func("sortedmulti", expr);
@@ -1632,118 +1815,157 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
(ctx == ParseScriptContext::P2TR && (multi_a || sortedmulti_a))) {
auto threshold = Expr(expr);
uint32_t thres;
- std::vector<std::unique_ptr<PubkeyProvider>> providers;
+ std::vector<std::vector<std::unique_ptr<PubkeyProvider>>> providers; // List of multipath expanded pubkeys
if (!ParseUInt32(std::string(threshold.begin(), threshold.end()), &thres)) {
error = strprintf("Multi threshold '%s' is not valid", std::string(threshold.begin(), threshold.end()));
- return nullptr;
+ return {};
}
size_t script_size = 0;
+ size_t max_providers_len = 0;
while (expr.size()) {
if (!Const(",", expr)) {
error = strprintf("Multi: expected ',', got '%c'", expr[0]);
- return nullptr;
+ return {};
}
auto arg = Expr(expr);
- auto pk = ParsePubkey(key_exp_index, arg, ctx, out, error);
- if (!pk) {
+ auto pks = ParsePubkey(key_exp_index, arg, ctx, out, error);
+ if (pks.empty()) {
error = strprintf("Multi: %s", error);
- return nullptr;
+ return {};
}
- script_size += pk->GetSize() + 1;
- providers.emplace_back(std::move(pk));
+ script_size += pks.at(0)->GetSize() + 1;
+ max_providers_len = std::max(max_providers_len, pks.size());
+ providers.emplace_back(std::move(pks));
key_exp_index++;
}
if ((multi || sortedmulti) && (providers.empty() || providers.size() > MAX_PUBKEYS_PER_MULTISIG)) {
error = strprintf("Cannot have %u keys in multisig; must have between 1 and %d keys, inclusive", providers.size(), MAX_PUBKEYS_PER_MULTISIG);
- return nullptr;
+ return {};
} else if ((multi_a || sortedmulti_a) && (providers.empty() || providers.size() > MAX_PUBKEYS_PER_MULTI_A)) {
error = strprintf("Cannot have %u keys in multi_a; must have between 1 and %d keys, inclusive", providers.size(), MAX_PUBKEYS_PER_MULTI_A);
- return nullptr;
+ return {};
} else if (thres < 1) {
error = strprintf("Multisig threshold cannot be %d, must be at least 1", thres);
- return nullptr;
+ return {};
} else if (thres > providers.size()) {
error = strprintf("Multisig threshold cannot be larger than the number of keys; threshold is %d but only %u keys specified", thres, providers.size());
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP) {
if (providers.size() > 3) {
error = strprintf("Cannot have %u pubkeys in bare multisig; only at most 3 pubkeys", providers.size());
- return nullptr;
+ return {};
}
}
if (ctx == ParseScriptContext::P2SH) {
// This limits the maximum number of compressed pubkeys to 15.
if (script_size + 3 > MAX_SCRIPT_ELEMENT_SIZE) {
error = strprintf("P2SH script is too large, %d bytes is larger than %d bytes", script_size + 3, MAX_SCRIPT_ELEMENT_SIZE);
- return nullptr;
+ return {};
}
}
- if (multi || sortedmulti) {
- return std::make_unique<MultisigDescriptor>(thres, std::move(providers), sortedmulti);
- } else {
- return std::make_unique<MultiADescriptor>(thres, std::move(providers), sortedmulti_a);
+
+ // Make sure all vecs are of the same length, or exactly length 1
+ // For length 1 vectors, clone key providers until vector is the same length
+ for (auto& vec : providers) {
+ if (vec.size() == 1) {
+ for (size_t i = 1; i < max_providers_len; ++i) {
+ vec.emplace_back(vec.at(0)->Clone());
+ }
+ } else if (vec.size() != max_providers_len) {
+ error = strprintf("multi(): Multipath derivation paths have mismatched lengths");
+ return {};
+ }
}
+
+ // Build the final descriptors vector
+ for (size_t i = 0; i < max_providers_len; ++i) {
+ // Build final pubkeys vectors by retrieving the i'th subscript for each vector in subscripts
+ std::vector<std::unique_ptr<PubkeyProvider>> pubs;
+ pubs.reserve(providers.size());
+ for (auto& pub : providers) {
+ pubs.emplace_back(std::move(pub.at(i)));
+ }
+ if (multi || sortedmulti) {
+ ret.emplace_back(std::make_unique<MultisigDescriptor>(thres, std::move(pubs), sortedmulti));
+ } else {
+ ret.emplace_back(std::make_unique<MultiADescriptor>(thres, std::move(pubs), sortedmulti_a));
+ }
+ }
+ return ret;
} else if (multi || sortedmulti) {
error = "Can only have multi/sortedmulti at top level, in sh(), or in wsh()";
- return nullptr;
+ return {};
} else if (multi_a || sortedmulti_a) {
error = "Can only have multi_a/sortedmulti_a inside tr()";
- return nullptr;
+ return {};
}
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH) && Func("wpkh", expr)) {
- auto pubkey = ParsePubkey(key_exp_index, expr, ParseScriptContext::P2WPKH, out, error);
- if (!pubkey) {
+ auto pubkeys = ParsePubkey(key_exp_index, expr, ParseScriptContext::P2WPKH, out, error);
+ if (pubkeys.empty()) {
error = strprintf("wpkh(): %s", error);
- return nullptr;
+ return {};
}
key_exp_index++;
- return std::make_unique<WPKHDescriptor>(std::move(pubkey));
+ for (auto& pubkey : pubkeys) {
+ ret.emplace_back(std::make_unique<WPKHDescriptor>(std::move(pubkey)));
+ }
+ return ret;
} else if (Func("wpkh", expr)) {
error = "Can only have wpkh() at top level or inside sh()";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("sh", expr)) {
- auto desc = ParseScript(key_exp_index, expr, ParseScriptContext::P2SH, out, error);
- if (!desc || expr.size()) return nullptr;
- return std::make_unique<SHDescriptor>(std::move(desc));
+ auto descs = ParseScript(key_exp_index, expr, ParseScriptContext::P2SH, out, error);
+ if (descs.empty() || expr.size()) return {};
+ std::vector<std::unique_ptr<DescriptorImpl>> ret;
+ ret.reserve(descs.size());
+ for (auto& desc : descs) {
+ ret.push_back(std::make_unique<SHDescriptor>(std::move(desc)));
+ }
+ return ret;
} else if (Func("sh", expr)) {
error = "Can only have sh() at top level";
- return nullptr;
+ return {};
}
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH) && Func("wsh", expr)) {
- auto desc = ParseScript(key_exp_index, expr, ParseScriptContext::P2WSH, out, error);
- if (!desc || expr.size()) return nullptr;
- return std::make_unique<WSHDescriptor>(std::move(desc));
+ auto descs = ParseScript(key_exp_index, expr, ParseScriptContext::P2WSH, out, error);
+ if (descs.empty() || expr.size()) return {};
+ for (auto& desc : descs) {
+ ret.emplace_back(std::make_unique<WSHDescriptor>(std::move(desc)));
+ }
+ return ret;
} else if (Func("wsh", expr)) {
error = "Can only have wsh() at top level or inside sh()";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("addr", expr)) {
CTxDestination dest = DecodeDestination(std::string(expr.begin(), expr.end()));
if (!IsValidDestination(dest)) {
error = "Address is not valid";
- return nullptr;
+ return {};
}
- return std::make_unique<AddressDescriptor>(std::move(dest));
+ ret.emplace_back(std::make_unique<AddressDescriptor>(std::move(dest)));
+ return ret;
} else if (Func("addr", expr)) {
error = "Can only have addr() at top level";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("tr", expr)) {
auto arg = Expr(expr);
- auto internal_key = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
- if (!internal_key) {
+ auto internal_keys = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
+ if (internal_keys.empty()) {
error = strprintf("tr(): %s", error);
- return nullptr;
+ return {};
}
+ size_t max_providers_len = internal_keys.size();
++key_exp_index;
- std::vector<std::unique_ptr<DescriptorImpl>> subscripts; //!< list of script subexpressions
+ std::vector<std::vector<std::unique_ptr<DescriptorImpl>>> subscripts; //!< list of multipath expanded script subexpressions
std::vector<int> depths; //!< depth in the tree of each subexpression (same length subscripts)
if (expr.size()) {
if (!Const(",", expr)) {
error = strprintf("tr: expected ',', got '%c'", expr[0]);
- return nullptr;
+ return {};
}
/** The path from the top of the tree to what we're currently processing.
* branches[i] == false: left branch in the i'th step from the top; true: right branch.
@@ -1757,19 +1979,20 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
branches.push_back(false); // new left branch
if (branches.size() > TAPROOT_CONTROL_MAX_NODE_COUNT) {
error = strprintf("tr() supports at most %i nesting levels", TAPROOT_CONTROL_MAX_NODE_COUNT);
- return nullptr;
+ return {};
}
}
// Process the actual script expression.
auto sarg = Expr(expr);
subscripts.emplace_back(ParseScript(key_exp_index, sarg, ParseScriptContext::P2TR, out, error));
- if (!subscripts.back()) return nullptr;
+ if (subscripts.back().empty()) return {};
+ max_providers_len = std::max(max_providers_len, subscripts.back().size());
depths.push_back(branches.size());
// Process closing braces; one is expected for every right branch we were in.
while (branches.size() && branches.back()) {
if (!Const("}", expr)) {
error = strprintf("tr(): expected '}' after script expression");
- return nullptr;
+ return {};
}
branches.pop_back(); // move up one level after encountering '}'
}
@@ -1777,7 +2000,7 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
if (branches.size() && !branches.back()) {
if (!Const(",", expr)) {
error = strprintf("tr(): expected ',' after script expression");
- return nullptr;
+ return {};
}
branches.back() = true; // And now we're in a right branch.
}
@@ -1785,40 +2008,82 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
// After we've explored a whole tree, we must be at the end of the expression.
if (expr.size()) {
error = strprintf("tr(): expected ')' after script expression");
- return nullptr;
+ return {};
}
}
assert(TaprootBuilder::ValidDepths(depths));
- return std::make_unique<TRDescriptor>(std::move(internal_key), std::move(subscripts), std::move(depths));
+
+ // Make sure all vecs are of the same length, or exactly length 1
+ // For length 1 vectors, clone subdescs until vector is the same length
+ for (auto& vec : subscripts) {
+ if (vec.size() == 1) {
+ for (size_t i = 1; i < max_providers_len; ++i) {
+ vec.emplace_back(vec.at(0)->Clone());
+ }
+ } else if (vec.size() != max_providers_len) {
+ error = strprintf("tr(): Multipath subscripts have mismatched lengths");
+ return {};
+ }
+ }
+
+ if (internal_keys.size() > 1 && internal_keys.size() != max_providers_len) {
+ error = strprintf("tr(): Multipath internal key mismatches multipath subscripts lengths");
+ return {};
+ }
+
+ while (internal_keys.size() < max_providers_len) {
+ internal_keys.emplace_back(internal_keys.at(0)->Clone());
+ }
+
+ // Build the final descriptors vector
+ for (size_t i = 0; i < max_providers_len; ++i) {
+ // Build final subscripts vectors by retrieving the i'th subscript for each vector in subscripts
+ std::vector<std::unique_ptr<DescriptorImpl>> this_subs;
+ this_subs.reserve(subscripts.size());
+ for (auto& subs : subscripts) {
+ this_subs.emplace_back(std::move(subs.at(i)));
+ }
+ ret.emplace_back(std::make_unique<TRDescriptor>(std::move(internal_keys.at(i)), std::move(this_subs), depths));
+ }
+ return ret;
+
+
} else if (Func("tr", expr)) {
error = "Can only have tr at top level";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("rawtr", expr)) {
auto arg = Expr(expr);
if (expr.size()) {
error = strprintf("rawtr(): only one key expected.");
- return nullptr;
+ return {};
+ }
+ auto output_keys = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
+ if (output_keys.empty()) {
+ error = strprintf("rawtr(): %s", error);
+ return {};
}
- auto output_key = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
- if (!output_key) return nullptr;
++key_exp_index;
- return std::make_unique<RawTRDescriptor>(std::move(output_key));
+ for (auto& pubkey : output_keys) {
+ ret.emplace_back(std::make_unique<RawTRDescriptor>(std::move(pubkey)));
+ }
+ return ret;
} else if (Func("rawtr", expr)) {
error = "Can only have rawtr at top level";
- return nullptr;
+ return {};
}
if (ctx == ParseScriptContext::TOP && Func("raw", expr)) {
std::string str(expr.begin(), expr.end());
if (!IsHex(str)) {
error = "Raw script is not hex";
- return nullptr;
+ return {};
}
auto bytes = ParseHex(str);
- return std::make_unique<RawDescriptor>(CScript(bytes.begin(), bytes.end()));
+ ret.emplace_back(std::make_unique<RawDescriptor>(CScript(bytes.begin(), bytes.end())));
+ return ret;
} else if (Func("raw", expr)) {
error = "Can only have raw() at top level";
- return nullptr;
+ return {};
}
// Process miniscript expressions.
{
@@ -1827,12 +2092,12 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
auto node = miniscript::FromString(std::string(expr.begin(), expr.end()), parser);
if (parser.m_key_parsing_error != "") {
error = std::move(parser.m_key_parsing_error);
- return nullptr;
+ return {};
}
if (node) {
if (ctx != ParseScriptContext::P2WSH && ctx != ParseScriptContext::P2TR) {
error = "Miniscript expressions can only be used in wsh or tr.";
- return nullptr;
+ return {};
}
if (!node->IsSane() || node->IsNotSatisfiable()) {
// Try to find the first insane sub for better error reporting.
@@ -1857,24 +2122,52 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
} else {
error += " is not satisfiable";
}
- return nullptr;
+ return {};
}
// A signature check is required for a miniscript to be sane. Therefore no sane miniscript
// may have an empty list of public keys.
CHECK_NONFATAL(!parser.m_keys.empty());
key_exp_index += parser.m_keys.size();
- return std::make_unique<MiniscriptDescriptor>(std::move(parser.m_keys), std::move(node));
+ // Make sure all vecs are of the same length, or exactly length 1
+ // For length 1 vectors, clone subdescs until vector is the same length
+ size_t num_multipath = std::max_element(parser.m_keys.begin(), parser.m_keys.end(),
+ [](const std::vector<std::unique_ptr<PubkeyProvider>>& a, const std::vector<std::unique_ptr<PubkeyProvider>>& b) {
+ return a.size() < b.size();
+ })->size();
+
+ for (auto& vec : parser.m_keys) {
+ if (vec.size() == 1) {
+ for (size_t i = 1; i < num_multipath; ++i) {
+ vec.emplace_back(vec.at(0)->Clone());
+ }
+ } else if (vec.size() != num_multipath) {
+ error = strprintf("Miniscript: Multipath derivation paths have mismatched lengths");
+ return {};
+ }
+ }
+
+ // Build the final descriptors vector
+ for (size_t i = 0; i < num_multipath; ++i) {
+ // Build final pubkeys vectors by retrieving the i'th subscript for each vector in subscripts
+ std::vector<std::unique_ptr<PubkeyProvider>> pubs;
+ pubs.reserve(parser.m_keys.size());
+ for (auto& pub : parser.m_keys) {
+ pubs.emplace_back(std::move(pub.at(i)));
+ }
+ ret.emplace_back(std::make_unique<MiniscriptDescriptor>(std::move(pubs), node));
+ }
+ return ret;
}
}
if (ctx == ParseScriptContext::P2SH) {
error = "A function is needed within P2SH";
- return nullptr;
+ return {};
} else if (ctx == ParseScriptContext::P2WSH) {
error = "A function is needed within P2WSH";
- return nullptr;
+ return {};
}
error = strprintf("'%s' is not a valid descriptor function", std::string(expr.begin(), expr.end()));
- return nullptr;
+ return {};
}
std::unique_ptr<DescriptorImpl> InferMultiA(const CScript& script, ParseScriptContext ctx, const SigningProvider& provider)
@@ -2012,7 +2305,12 @@ std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptCo
KeyParser parser(/* out = */nullptr, /* in = */&provider, /* ctx = */script_ctx);
auto node = miniscript::FromScript(script, parser);
if (node && node->IsSane()) {
- return std::make_unique<MiniscriptDescriptor>(std::move(parser.m_keys), std::move(node));
+ std::vector<std::unique_ptr<PubkeyProvider>> keys;
+ keys.reserve(parser.m_keys.size());
+ for (auto& key : parser.m_keys) {
+ keys.emplace_back(std::move(key.at(0)));
+ }
+ return std::make_unique<MiniscriptDescriptor>(std::move(keys), std::move(node));
}
}
@@ -2067,14 +2365,21 @@ bool CheckChecksum(Span<const char>& sp, bool require_checksum, std::string& err
return true;
}
-std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum)
+std::vector<std::unique_ptr<Descriptor>> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum)
{
Span<const char> sp{descriptor};
- if (!CheckChecksum(sp, require_checksum, error)) return nullptr;
+ if (!CheckChecksum(sp, require_checksum, error)) return {};
uint32_t key_exp_index = 0;
auto ret = ParseScript(key_exp_index, sp, ParseScriptContext::TOP, out, error);
- if (sp.size() == 0 && ret) return std::unique_ptr<Descriptor>(std::move(ret));
- return nullptr;
+ if (sp.size() == 0 && !ret.empty()) {
+ std::vector<std::unique_ptr<Descriptor>> descs;
+ descs.reserve(ret.size());
+ for (auto& r : ret) {
+ descs.emplace_back(std::unique_ptr<Descriptor>(std::move(r)));
+ }
+ return descs;
+ }
+ return {};
}
std::string GetDescriptorChecksum(const std::string& descriptor)
diff --git a/src/script/descriptor.h b/src/script/descriptor.h
index e78a775330..473649a314 100644
--- a/src/script/descriptor.h
+++ b/src/script/descriptor.h
@@ -173,9 +173,9 @@ struct Descriptor {
* is set, the checksum is mandatory - otherwise it is optional.
*
* If a parse error occurs, or the checksum is missing/invalid, or anything
- * else is wrong, `nullptr` is returned.
+ * else is wrong, an empty vector is returned.
*/
-std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum = false);
+std::vector<std::unique_ptr<Descriptor>> Parse(const std::string& descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum = false);
/** Get the checksum for a `descriptor`.
*
diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp
index 20a9830d0e..dcdddb88e9 100644
--- a/src/script/interpreter.cpp
+++ b/src/script/interpreter.cpp
@@ -1303,7 +1303,7 @@ public:
// Serialize the nSequence
if (nInput != nIn && (fHashSingle || fHashNone))
// let the others update at will
- ::Serialize(s, int{0});
+ ::Serialize(s, int32_t{0});
else
::Serialize(s, txTo.vin[nInput].nSequence);
}
@@ -1565,7 +1565,7 @@ bool SignatureHashSchnorr(uint256& hash_out, ScriptExecutionData& execdata, cons
}
template <class T>
-uint256 SignatureHash(const CScript& scriptCode, const T& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache)
+uint256 SignatureHash(const CScript& scriptCode, const T& txTo, unsigned int nIn, int32_t nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache)
{
assert(nIn < txTo.vin.size());
@@ -1943,6 +1943,8 @@ static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion,
}
return set_success(serror);
}
+ } else if (!is_p2sh && CScript::IsPayToAnchor(witversion, program)) {
+ return true;
} else {
if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM) {
return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM);
diff --git a/src/script/interpreter.h b/src/script/interpreter.h
index 836c2e7982..8ba0018c23 100644
--- a/src/script/interpreter.h
+++ b/src/script/interpreter.h
@@ -265,7 +265,7 @@ public:
return false;
}
- virtual ~BaseSignatureChecker() {}
+ virtual ~BaseSignatureChecker() = default;
};
/** Enum to specify what *TransactionSignatureChecker's behavior should be
diff --git a/src/script/miniscript.h b/src/script/miniscript.h
index a269709e72..58f24434f0 100644
--- a/src/script/miniscript.h
+++ b/src/script/miniscript.h
@@ -305,7 +305,7 @@ struct InputStack {
//! Data elements.
std::vector<std::vector<unsigned char>> stack;
//! Construct an empty stack (valid).
- InputStack() {}
+ InputStack() = default;
//! Construct a valid single-element stack (with an element up to 75 bytes).
InputStack(std::vector<unsigned char> in) : size(in.size() + 1), stack(Vector(std::move(in))) {}
//! Change availability
@@ -1793,8 +1793,9 @@ inline NodeRef<Key> Parse(Span<const char> in, const Ctx& ctx)
// Get threshold
int next_comma = FindNextChar(in, ',');
if (next_comma < 1) return false;
- int64_t k;
- if (!ParseInt64(std::string(in.begin(), in.begin() + next_comma), &k)) return false;
+ const auto k_to_integral{ToIntegral<int64_t>(std::string_view(in.begin(), next_comma))};
+ if (!k_to_integral.has_value()) return false;
+ const int64_t k{k_to_integral.value()};
in = in.subspan(next_comma + 1);
// Get keys. It is compatible for both compressed and x-only keys.
std::vector<Key> keys;
@@ -1948,21 +1949,19 @@ inline NodeRef<Key> Parse(Span<const char> in, const Ctx& ctx)
} else if (Const("after(", in)) {
int arg_size = FindNextChar(in, ')');
if (arg_size < 1) return {};
- int64_t num;
- if (!ParseInt64(std::string(in.begin(), in.begin() + arg_size), &num)) return {};
- if (num < 1 || num >= 0x80000000L) return {};
- constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::AFTER, num));
+ const auto num{ToIntegral<int64_t>(std::string_view(in.begin(), arg_size))};
+ if (!num.has_value() || *num < 1 || *num >= 0x80000000L) return {};
+ constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::AFTER, *num));
in = in.subspan(arg_size + 1);
- script_size += 1 + (num > 16) + (num > 0x7f) + (num > 0x7fff) + (num > 0x7fffff);
+ script_size += 1 + (*num > 16) + (*num > 0x7f) + (*num > 0x7fff) + (*num > 0x7fffff);
} else if (Const("older(", in)) {
int arg_size = FindNextChar(in, ')');
if (arg_size < 1) return {};
- int64_t num;
- if (!ParseInt64(std::string(in.begin(), in.begin() + arg_size), &num)) return {};
- if (num < 1 || num >= 0x80000000L) return {};
- constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::OLDER, num));
+ const auto num{ToIntegral<int64_t>(std::string_view(in.begin(), arg_size))};
+ if (!num.has_value() || *num < 1 || *num >= 0x80000000L) return {};
+ constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::OLDER, *num));
in = in.subspan(arg_size + 1);
- script_size += 1 + (num > 16) + (num > 0x7f) + (num > 0x7fff) + (num > 0x7fffff);
+ script_size += 1 + (*num > 16) + (*num > 0x7f) + (*num > 0x7fff) + (*num > 0x7fffff);
} else if (Const("multi(", in)) {
if (!parse_multi_exp(in, /* is_multi_a = */false)) return {};
} else if (Const("multi_a(", in)) {
@@ -1970,13 +1969,13 @@ inline NodeRef<Key> Parse(Span<const char> in, const Ctx& ctx)
} else if (Const("thresh(", in)) {
int next_comma = FindNextChar(in, ',');
if (next_comma < 1) return {};
- if (!ParseInt64(std::string(in.begin(), in.begin() + next_comma), &k)) return {};
- if (k < 1) return {};
+ const auto k{ToIntegral<int64_t>(std::string_view(in.begin(), next_comma))};
+ if (!k.has_value() || *k < 1) return {};
in = in.subspan(next_comma + 1);
// n = 1 here because we read the first WRAPPED_EXPR before reaching THRESH
- to_parse.emplace_back(ParseContext::THRESH, 1, k);
+ to_parse.emplace_back(ParseContext::THRESH, 1, *k);
to_parse.emplace_back(ParseContext::WRAPPED_EXPR, -1, -1);
- script_size += 2 + (k > 16) + (k > 0x7f) + (k > 0x7fff) + (k > 0x7fffff);
+ script_size += 2 + (*k > 16) + (*k > 0x7f) + (*k > 0x7fff) + (*k > 0x7fffff);
} else if (Const("andor(", in)) {
to_parse.emplace_back(ParseContext::ANDOR, -1, -1);
to_parse.emplace_back(ParseContext::CLOSE_BRACKET, -1, -1);
diff --git a/src/script/script.cpp b/src/script/script.cpp
index 73ea336c4f..d650db9a0d 100644
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -204,6 +204,23 @@ unsigned int CScript::GetSigOpCount(const CScript& scriptSig) const
return subscript.GetSigOpCount(true);
}
+bool CScript::IsPayToAnchor() const
+{
+ return (this->size() == 4 &&
+ (*this)[0] == OP_1 &&
+ (*this)[1] == 0x02 &&
+ (*this)[2] == 0x4e &&
+ (*this)[3] == 0x73);
+}
+
+bool CScript::IsPayToAnchor(int version, const std::vector<unsigned char>& program)
+{
+ return version == 1 &&
+ program.size() == 2 &&
+ program[0] == 0x4e &&
+ program[1] == 0x73;
+}
+
bool CScript::IsPayToScriptHash() const
{
// Extra-fast test for pay-to-script-hash CScripts:
diff --git a/src/script/script.h b/src/script/script.h
index 66d63fae89..f457984980 100644
--- a/src/script/script.h
+++ b/src/script/script.h
@@ -17,6 +17,7 @@
#include <cstdint>
#include <cstring>
#include <limits>
+#include <span>
#include <stdexcept>
#include <string>
#include <type_traits>
@@ -412,6 +413,32 @@ bool GetScriptOp(CScriptBase::const_iterator& pc, CScriptBase::const_iterator en
/** Serialized script, used inside transaction inputs and outputs */
class CScript : public CScriptBase
{
+private:
+ inline void AppendDataSize(const uint32_t size)
+ {
+ if (size < OP_PUSHDATA1) {
+ insert(end(), static_cast<value_type>(size));
+ } else if (size <= 0xff) {
+ insert(end(), OP_PUSHDATA1);
+ insert(end(), static_cast<value_type>(size));
+ } else if (size <= 0xffff) {
+ insert(end(), OP_PUSHDATA2);
+ value_type data[2];
+ WriteLE16(data, size);
+ insert(end(), std::cbegin(data), std::cend(data));
+ } else {
+ insert(end(), OP_PUSHDATA4);
+ value_type data[4];
+ WriteLE32(data, size);
+ insert(end(), std::cbegin(data), std::cend(data));
+ }
+ }
+
+ void AppendData(std::span<const value_type> data)
+ {
+ insert(end(), data.begin(), data.end());
+ }
+
protected:
CScript& push_int64(int64_t n)
{
@@ -429,11 +456,11 @@ protected:
}
return *this;
}
+
public:
- CScript() { }
- CScript(const_iterator pbegin, const_iterator pend) : CScriptBase(pbegin, pend) { }
- CScript(std::vector<unsigned char>::const_iterator pbegin, std::vector<unsigned char>::const_iterator pend) : CScriptBase(pbegin, pend) { }
- CScript(const unsigned char* pbegin, const unsigned char* pend) : CScriptBase(pbegin, pend) { }
+ CScript() = default;
+ template <std::input_iterator InputIterator>
+ CScript(InputIterator first, InputIterator last) : CScriptBase{first, last} { }
SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); }
@@ -463,35 +490,19 @@ public:
return *this;
}
- CScript& operator<<(const std::vector<unsigned char>& b) LIFETIMEBOUND
+ CScript& operator<<(std::span<const std::byte> b) LIFETIMEBOUND
{
- if (b.size() < OP_PUSHDATA1)
- {
- insert(end(), (unsigned char)b.size());
- }
- else if (b.size() <= 0xff)
- {
- insert(end(), OP_PUSHDATA1);
- insert(end(), (unsigned char)b.size());
- }
- else if (b.size() <= 0xffff)
- {
- insert(end(), OP_PUSHDATA2);
- uint8_t _data[2];
- WriteLE16(_data, b.size());
- insert(end(), _data, _data + sizeof(_data));
- }
- else
- {
- insert(end(), OP_PUSHDATA4);
- uint8_t _data[4];
- WriteLE32(_data, b.size());
- insert(end(), _data, _data + sizeof(_data));
- }
- insert(end(), b.begin(), b.end());
+ AppendDataSize(b.size());
+ AppendData({reinterpret_cast<const value_type*>(b.data()), b.size()});
return *this;
}
+ // For compatibility reasons. In new code, prefer using std::byte instead of uint8_t.
+ CScript& operator<<(std::span<const value_type> b) LIFETIMEBOUND
+ {
+ return *this << std::as_bytes(b);
+ }
+
bool GetOp(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>& vchRet) const
{
return GetScriptOp(pc, end(), opcodeRet, &vchRet);
@@ -533,6 +544,14 @@ public:
*/
unsigned int GetSigOpCount(const CScript& scriptSig) const;
+ /*
+ * OP_1 <0x4e73>
+ */
+ bool IsPayToAnchor() const;
+ /** Checks if output of IsWitnessProgram comes from a P2A output script
+ */
+ static bool IsPayToAnchor(int version, const std::vector<unsigned char>& program);
+
bool IsPayToScriptHash() const;
bool IsPayToWitnessScriptHash() const;
bool IsWitnessProgram(int& version, std::vector<unsigned char>& program) const;
@@ -569,7 +588,7 @@ struct CScriptWitness
std::vector<std::vector<unsigned char> > stack;
// Some compilers complain without a default constructor
- CScriptWitness() { }
+ CScriptWitness() = default;
bool IsNull() const { return stack.empty(); }
diff --git a/src/script/sigcache.cpp b/src/script/sigcache.cpp
index 7c6c282cc4..33531e6bf5 100644
--- a/src/script/sigcache.cpp
+++ b/src/script/sigcache.cpp
@@ -5,125 +5,80 @@
#include <script/sigcache.h>
-#include <common/system.h>
+#include <crypto/sha256.h>
#include <logging.h>
#include <pubkey.h>
#include <random.h>
+#include <script/interpreter.h>
+#include <span.h>
#include <uint256.h>
-#include <cuckoocache.h>
-
-#include <algorithm>
#include <mutex>
-#include <optional>
#include <shared_mutex>
#include <vector>
-namespace {
-/**
- * Valid signature cache, to avoid doing expensive ECDSA signature checking
- * twice for every transaction (once when accepted into memory pool, and
- * again when accepted into the block chain)
- */
-class CSignatureCache
+SignatureCache::SignatureCache(const size_t max_size_bytes)
{
-private:
- //! Entries are SHA256(nonce || 'E' or 'S' || 31 zero bytes || signature hash || public key || signature):
- CSHA256 m_salted_hasher_ecdsa;
- CSHA256 m_salted_hasher_schnorr;
- typedef CuckooCache::cache<uint256, SignatureCacheHasher> map_type;
- map_type setValid;
- std::shared_mutex cs_sigcache;
-
-public:
- CSignatureCache()
- {
- uint256 nonce = GetRandHash();
- // We want the nonce to be 64 bytes long to force the hasher to process
- // this chunk, which makes later hash computations more efficient. We
- // just write our 32-byte entropy, and then pad with 'E' for ECDSA and
- // 'S' for Schnorr (followed by 0 bytes).
- static constexpr unsigned char PADDING_ECDSA[32] = {'E'};
- static constexpr unsigned char PADDING_SCHNORR[32] = {'S'};
- m_salted_hasher_ecdsa.Write(nonce.begin(), 32);
- m_salted_hasher_ecdsa.Write(PADDING_ECDSA, 32);
- m_salted_hasher_schnorr.Write(nonce.begin(), 32);
- m_salted_hasher_schnorr.Write(PADDING_SCHNORR, 32);
- }
-
- void
- ComputeEntryECDSA(uint256& entry, const uint256 &hash, const std::vector<unsigned char>& vchSig, const CPubKey& pubkey) const
- {
- CSHA256 hasher = m_salted_hasher_ecdsa;
- hasher.Write(hash.begin(), 32).Write(pubkey.data(), pubkey.size()).Write(vchSig.data(), vchSig.size()).Finalize(entry.begin());
- }
-
- void
- ComputeEntrySchnorr(uint256& entry, const uint256 &hash, Span<const unsigned char> sig, const XOnlyPubKey& pubkey) const
- {
- CSHA256 hasher = m_salted_hasher_schnorr;
- hasher.Write(hash.begin(), 32).Write(pubkey.data(), pubkey.size()).Write(sig.data(), sig.size()).Finalize(entry.begin());
- }
+ uint256 nonce = GetRandHash();
+ // We want the nonce to be 64 bytes long to force the hasher to process
+ // this chunk, which makes later hash computations more efficient. We
+ // just write our 32-byte entropy, and then pad with 'E' for ECDSA and
+ // 'S' for Schnorr (followed by 0 bytes).
+ static constexpr unsigned char PADDING_ECDSA[32] = {'E'};
+ static constexpr unsigned char PADDING_SCHNORR[32] = {'S'};
+ m_salted_hasher_ecdsa.Write(nonce.begin(), 32);
+ m_salted_hasher_ecdsa.Write(PADDING_ECDSA, 32);
+ m_salted_hasher_schnorr.Write(nonce.begin(), 32);
+ m_salted_hasher_schnorr.Write(PADDING_SCHNORR, 32);
- bool
- Get(const uint256& entry, const bool erase)
- {
- std::shared_lock<std::shared_mutex> lock(cs_sigcache);
- return setValid.contains(entry, erase);
- }
+ const auto [num_elems, approx_size_bytes] = setValid.setup_bytes(max_size_bytes);
+ LogPrintf("Using %zu MiB out of %zu MiB requested for signature cache, able to store %zu elements\n",
+ approx_size_bytes >> 20, max_size_bytes >> 20, num_elems);
+}
- void Set(const uint256& entry)
- {
- std::unique_lock<std::shared_mutex> lock(cs_sigcache);
- setValid.insert(entry);
- }
- std::optional<std::pair<uint32_t, size_t>> setup_bytes(size_t n)
- {
- return setValid.setup_bytes(n);
- }
-};
+void SignatureCache::ComputeEntryECDSA(uint256& entry, const uint256& hash, const std::vector<unsigned char>& vchSig, const CPubKey& pubkey) const
+{
+ CSHA256 hasher = m_salted_hasher_ecdsa;
+ hasher.Write(hash.begin(), 32).Write(pubkey.data(), pubkey.size()).Write(vchSig.data(), vchSig.size()).Finalize(entry.begin());
+}
-/* In previous versions of this code, signatureCache was a local static variable
- * in CachingTransactionSignatureChecker::VerifySignature. We initialize
- * signatureCache outside of VerifySignature to avoid the atomic operation per
- * call overhead associated with local static variables even though
- * signatureCache could be made local to VerifySignature.
-*/
-static CSignatureCache signatureCache;
-} // namespace
+void SignatureCache::ComputeEntrySchnorr(uint256& entry, const uint256& hash, Span<const unsigned char> sig, const XOnlyPubKey& pubkey) const
+{
+ CSHA256 hasher = m_salted_hasher_schnorr;
+ hasher.Write(hash.begin(), 32).Write(pubkey.data(), pubkey.size()).Write(sig.data(), sig.size()).Finalize(entry.begin());
+}
-// To be called once in AppInitMain/BasicTestingSetup to initialize the
-// signatureCache.
-bool InitSignatureCache(size_t max_size_bytes)
+bool SignatureCache::Get(const uint256& entry, const bool erase)
{
- auto setup_results = signatureCache.setup_bytes(max_size_bytes);
- if (!setup_results) return false;
+ std::shared_lock<std::shared_mutex> lock(cs_sigcache);
+ return setValid.contains(entry, erase);
+}
- const auto [num_elems, approx_size_bytes] = *setup_results;
- LogPrintf("Using %zu MiB out of %zu MiB requested for signature cache, able to store %zu elements\n",
- approx_size_bytes >> 20, max_size_bytes >> 20, num_elems);
- return true;
+void SignatureCache::Set(const uint256& entry)
+{
+ std::unique_lock<std::shared_mutex> lock(cs_sigcache);
+ setValid.insert(entry);
}
bool CachingTransactionSignatureChecker::VerifyECDSASignature(const std::vector<unsigned char>& vchSig, const CPubKey& pubkey, const uint256& sighash) const
{
uint256 entry;
- signatureCache.ComputeEntryECDSA(entry, sighash, vchSig, pubkey);
- if (signatureCache.Get(entry, !store))
+ m_signature_cache.ComputeEntryECDSA(entry, sighash, vchSig, pubkey);
+ if (m_signature_cache.Get(entry, !store))
return true;
if (!TransactionSignatureChecker::VerifyECDSASignature(vchSig, pubkey, sighash))
return false;
if (store)
- signatureCache.Set(entry);
+ m_signature_cache.Set(entry);
return true;
}
bool CachingTransactionSignatureChecker::VerifySchnorrSignature(Span<const unsigned char> sig, const XOnlyPubKey& pubkey, const uint256& sighash) const
{
uint256 entry;
- signatureCache.ComputeEntrySchnorr(entry, sighash, sig, pubkey);
- if (signatureCache.Get(entry, !store)) return true;
+ m_signature_cache.ComputeEntrySchnorr(entry, sighash, sig, pubkey);
+ if (m_signature_cache.Get(entry, !store)) return true;
if (!TransactionSignatureChecker::VerifySchnorrSignature(sig, pubkey, sighash)) return false;
- if (store) signatureCache.Set(entry);
+ if (store) m_signature_cache.Set(entry);
return true;
}
diff --git a/src/script/sigcache.h b/src/script/sigcache.h
index d33d60d5bc..76802e6a7c 100644
--- a/src/script/sigcache.h
+++ b/src/script/sigcache.h
@@ -6,32 +6,71 @@
#ifndef BITCOIN_SCRIPT_SIGCACHE_H
#define BITCOIN_SCRIPT_SIGCACHE_H
+#include <consensus/amount.h>
+#include <crypto/sha256.h>
+#include <cuckoocache.h>
#include <script/interpreter.h>
#include <span.h>
+#include <uint256.h>
#include <util/hasher.h>
-#include <optional>
+#include <cstddef>
+#include <shared_mutex>
#include <vector>
+class CPubKey;
+class CTransaction;
+class XOnlyPubKey;
+
// DoS prevention: limit cache size to 32MiB (over 1000000 entries on 64-bit
// systems). Due to how we count cache size, actual memory usage is slightly
// more (~32.25 MiB)
-static constexpr size_t DEFAULT_MAX_SIG_CACHE_BYTES{32 << 20};
+static constexpr size_t DEFAULT_VALIDATION_CACHE_BYTES{32 << 20};
+static constexpr size_t DEFAULT_SIGNATURE_CACHE_BYTES{DEFAULT_VALIDATION_CACHE_BYTES / 2};
+static constexpr size_t DEFAULT_SCRIPT_EXECUTION_CACHE_BYTES{DEFAULT_VALIDATION_CACHE_BYTES / 2};
+static_assert(DEFAULT_VALIDATION_CACHE_BYTES == DEFAULT_SIGNATURE_CACHE_BYTES + DEFAULT_SCRIPT_EXECUTION_CACHE_BYTES);
-class CPubKey;
+/**
+ * Valid signature cache, to avoid doing expensive ECDSA signature checking
+ * twice for every transaction (once when accepted into memory pool, and
+ * again when accepted into the block chain)
+ */
+class SignatureCache
+{
+private:
+ //! Entries are SHA256(nonce || 'E' or 'S' || 31 zero bytes || signature hash || public key || signature):
+ CSHA256 m_salted_hasher_ecdsa;
+ CSHA256 m_salted_hasher_schnorr;
+ typedef CuckooCache::cache<uint256, SignatureCacheHasher> map_type;
+ map_type setValid;
+ std::shared_mutex cs_sigcache;
+
+public:
+ SignatureCache(size_t max_size_bytes);
+
+ SignatureCache(const SignatureCache&) = delete;
+ SignatureCache& operator=(const SignatureCache&) = delete;
+
+ void ComputeEntryECDSA(uint256& entry, const uint256 &hash, const std::vector<unsigned char>& vchSig, const CPubKey& pubkey) const;
+
+ void ComputeEntrySchnorr(uint256& entry, const uint256 &hash, Span<const unsigned char> sig, const XOnlyPubKey& pubkey) const;
+
+ bool Get(const uint256& entry, const bool erase);
+
+ void Set(const uint256& entry);
+};
class CachingTransactionSignatureChecker : public TransactionSignatureChecker
{
private:
bool store;
+ SignatureCache& m_signature_cache;
public:
- CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, bool storeIn, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amountIn, txdataIn, MissingDataBehavior::ASSERT_FAIL), store(storeIn) {}
+ CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, bool storeIn, SignatureCache& signature_cache, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amountIn, txdataIn, MissingDataBehavior::ASSERT_FAIL), store(storeIn), m_signature_cache(signature_cache) {}
bool VerifyECDSASignature(const std::vector<unsigned char>& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const override;
bool VerifySchnorrSignature(Span<const unsigned char> sig, const XOnlyPubKey& pubkey, const uint256& sighash) const override;
};
-[[nodiscard]] bool InitSignatureCache(size_t max_size_bytes);
-
#endif // BITCOIN_SCRIPT_SIGCACHE_H
diff --git a/src/script/sign.cpp b/src/script/sign.cpp
index 22ac062a63..42db251359 100644
--- a/src/script/sign.cpp
+++ b/src/script/sign.cpp
@@ -475,6 +475,9 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
case TxoutType::WITNESS_V1_TAPROOT:
return SignTaproot(provider, creator, WitnessV1Taproot(XOnlyPubKey{vSolutions[0]}), sigdata, ret);
+
+ case TxoutType::ANCHOR:
+ return true;
} // no default case, so the compiler can warn about missing cases
assert(false);
}
@@ -691,27 +694,6 @@ void SignatureData::MergeSignatureData(SignatureData sigdata)
signatures.insert(std::make_move_iterator(sigdata.signatures.begin()), std::make_move_iterator(sigdata.signatures.end()));
}
-bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType, SignatureData& sig_data)
-{
- assert(nIn < txTo.vin.size());
-
- MutableTransactionSignatureCreator creator(txTo, nIn, amount, nHashType);
-
- bool ret = ProduceSignature(provider, creator, fromPubKey, sig_data);
- UpdateInput(txTo.vin.at(nIn), sig_data);
- return ret;
-}
-
-bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType, SignatureData& sig_data)
-{
- assert(nIn < txTo.vin.size());
- const CTxIn& txin = txTo.vin[nIn];
- assert(txin.prevout.n < txFrom.vout.size());
- const CTxOut& txout = txFrom.vout[txin.prevout.n];
-
- return SignSignature(provider, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType, sig_data);
-}
-
namespace {
/** Dummy signature checker which accepts all signatures. */
class DummySignatureChecker final : public BaseSignatureChecker
@@ -831,7 +813,7 @@ bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore,
}
ScriptError serror = SCRIPT_ERR_OK;
- if (!VerifyScript(txin.scriptSig, prevPubKey, &txin.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount, txdata, MissingDataBehavior::FAIL), &serror)) {
+ if (!sigdata.complete && !VerifyScript(txin.scriptSig, prevPubKey, &txin.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount, txdata, MissingDataBehavior::FAIL), &serror)) {
if (serror == SCRIPT_ERR_INVALID_STACK_OPERATION) {
// Unable to sign input and verification failed (possible attempt to partially sign).
input_errors[i] = Untranslated("Unable to sign input, invalid stack size (possibly missing key)");
diff --git a/src/script/sign.h b/src/script/sign.h
index ace2ba7856..fe2c470bc6 100644
--- a/src/script/sign.h
+++ b/src/script/sign.h
@@ -27,7 +27,7 @@ struct CMutableTransaction;
/** Interface for signature creators. */
class BaseSignatureCreator {
public:
- virtual ~BaseSignatureCreator() {}
+ virtual ~BaseSignatureCreator() = default;
virtual const BaseSignatureChecker& Checker() const =0;
/** Create a singular (non-script) signature. */
@@ -89,7 +89,7 @@ struct SignatureData {
std::map<std::vector<uint8_t>, std::vector<uint8_t>> ripemd160_preimages; ///< Mapping from a RIPEMD160 hash to its preimage provided to solve a Script
std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash160_preimages; ///< Mapping from a HASH160 hash to its preimage provided to solve a Script
- SignatureData() {}
+ SignatureData() = default;
explicit SignatureData(const CScript& script) : scriptSig(script) {}
void MergeSignatureData(SignatureData sigdata);
};
@@ -97,25 +97,6 @@ struct SignatureData {
/** Produce a script signature using a generic signature creator. */
bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata);
-/**
- * Produce a satisfying script (scriptSig or witness).
- *
- * @param provider Utility containing the information necessary to solve a script.
- * @param fromPubKey The script to produce a satisfaction for.
- * @param txTo The spending transaction.
- * @param nIn The index of the input in `txTo` referring the output being spent.
- * @param amount The value of the output being spent.
- * @param nHashType Signature hash type.
- * @param sig_data Additional data provided to solve a script. Filled with the resulting satisfying
- * script and whether the satisfaction is complete.
- *
- * @return True if the produced script is entirely satisfying `fromPubKey`.
- **/
-bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo,
- unsigned int nIn, const CAmount& amount, int nHashType, SignatureData& sig_data);
-bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo,
- unsigned int nIn, int nHashType, SignatureData& sig_data);
-
/** Extract signature data from a transaction input, and insert it. */
SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);
void UpdateInput(CTxIn& input, const SignatureData& data);
diff --git a/src/script/signingprovider.h b/src/script/signingprovider.h
index 3298376389..efdfd9ee56 100644
--- a/src/script/signingprovider.h
+++ b/src/script/signingprovider.h
@@ -150,7 +150,7 @@ std::optional<std::vector<std::tuple<int, std::vector<unsigned char>, int>>> Inf
class SigningProvider
{
public:
- virtual ~SigningProvider() {}
+ virtual ~SigningProvider() = default;
virtual bool GetCScript(const CScriptID &scriptid, CScript& script) const { return false; }
virtual bool HaveCScript(const CScriptID &scriptid) const { return false; }
virtual bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const { return false; }
diff --git a/src/script/solver.cpp b/src/script/solver.cpp
index 3dfa9cd6ba..bd3c5cdf72 100644
--- a/src/script/solver.cpp
+++ b/src/script/solver.cpp
@@ -24,6 +24,7 @@ std::string GetTxnOutputType(TxoutType t)
case TxoutType::SCRIPTHASH: return "scripthash";
case TxoutType::MULTISIG: return "multisig";
case TxoutType::NULL_DATA: return "nulldata";
+ case TxoutType::ANCHOR: return "anchor";
case TxoutType::WITNESS_V0_KEYHASH: return "witness_v0_keyhash";
case TxoutType::WITNESS_V0_SCRIPTHASH: return "witness_v0_scripthash";
case TxoutType::WITNESS_V1_TAPROOT: return "witness_v1_taproot";
@@ -165,6 +166,9 @@ TxoutType Solver(const CScript& scriptPubKey, std::vector<std::vector<unsigned c
vSolutionsRet.push_back(std::move(witnessprogram));
return TxoutType::WITNESS_V1_TAPROOT;
}
+ if (scriptPubKey.IsPayToAnchor()) {
+ return TxoutType::ANCHOR;
+ }
if (witnessversion != 0) {
vSolutionsRet.push_back(std::vector<unsigned char>{(unsigned char)witnessversion});
vSolutionsRet.push_back(std::move(witnessprogram));
diff --git a/src/script/solver.h b/src/script/solver.h
index dc8f4c357d..5a7b685a6f 100644
--- a/src/script/solver.h
+++ b/src/script/solver.h
@@ -22,6 +22,7 @@ template <typename C> class Span;
enum class TxoutType {
NONSTANDARD,
// 'standard' transaction types:
+ ANCHOR, //!< anyone can spend script
PUBKEY,
PUBKEYHASH,
SCRIPTHASH,
diff --git a/src/secp256k1/.cirrus.yml b/src/secp256k1/.cirrus.yml
index 4bd15511a4..0c1e01dc95 100644
--- a/src/secp256k1/.cirrus.yml
+++ b/src/secp256k1/.cirrus.yml
@@ -20,6 +20,7 @@ env:
EXPERIMENTAL: no
ECDH: no
RECOVERY: no
+ EXTRAKEYS: no
SCHNORRSIG: no
ELLSWIFT: no
### test options
@@ -66,6 +67,7 @@ task:
env:
ECDH: yes
RECOVERY: yes
+ EXTRAKEYS: yes
SCHNORRSIG: yes
ELLSWIFT: yes
matrix:
@@ -82,6 +84,7 @@ task:
env:
ECDH: yes
RECOVERY: yes
+ EXTRAKEYS: yes
SCHNORRSIG: yes
ELLSWIFT: yes
WRAPPER_CMD: 'valgrind --error-exitcode=42'
diff --git a/src/secp256k1/.github/workflows/ci.yml b/src/secp256k1/.github/workflows/ci.yml
index ade94e1eec..0fc104d29b 100644
--- a/src/secp256k1/.github/workflows/ci.yml
+++ b/src/secp256k1/.github/workflows/ci.yml
@@ -22,7 +22,7 @@ env:
BUILD: 'check'
### secp256k1 config
ECMULTWINDOW: 15
- ECMULTGENKB: 22
+ ECMULTGENKB: 86
ASM: 'no'
WIDEMUL: 'auto'
WITH_VALGRIND: 'yes'
@@ -31,6 +31,7 @@ env:
EXPERIMENTAL: 'no'
ECDH: 'no'
RECOVERY: 'no'
+ EXTRAKEYS: 'no'
SCHNORRSIG: 'no'
ELLSWIFT: 'no'
### test options
@@ -71,18 +72,18 @@ jobs:
matrix:
configuration:
- env_vars: { WIDEMUL: 'int64', RECOVERY: 'yes' }
- - env_vars: { WIDEMUL: 'int64', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - env_vars: { WIDEMUL: 'int64', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- env_vars: { WIDEMUL: 'int128' }
- - env_vars: { WIDEMUL: 'int128_struct', ELLSWIFT: 'yes' }
- - env_vars: { WIDEMUL: 'int128', RECOVERY: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- - env_vars: { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes' }
- - env_vars: { WIDEMUL: 'int128', ASM: 'x86_64', ELLSWIFT: 'yes' }
- - env_vars: { RECOVERY: 'yes', SCHNORRSIG: 'yes' }
- - env_vars: { CTIMETESTS: 'no', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', CPPFLAGS: '-DVERIFY' }
+ - env_vars: { WIDEMUL: 'int128_struct', ELLSWIFT: 'yes' }
+ - env_vars: { WIDEMUL: 'int128', RECOVERY: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - env_vars: { WIDEMUL: 'int128', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes' }
+ - env_vars: { WIDEMUL: 'int128', ASM: 'x86_64', ELLSWIFT: 'yes' }
+ - env_vars: { RECOVERY: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes' }
+ - env_vars: { CTIMETESTS: 'no', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', CPPFLAGS: '-DVERIFY' }
- env_vars: { BUILD: 'distcheck', WITH_VALGRIND: 'no', CTIMETESTS: 'no', BENCH: 'no' }
- env_vars: { CPPFLAGS: '-DDETERMINISTIC' }
- env_vars: { CFLAGS: '-O0', CTIMETESTS: 'no' }
- - env_vars: { CFLAGS: '-O1', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - env_vars: { CFLAGS: '-O1', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- env_vars: { ECMULTGENKB: 2, ECMULTWINDOW: 2 }
- env_vars: { ECMULTGENKB: 86, ECMULTWINDOW: 4 }
cc:
@@ -139,6 +140,7 @@ jobs:
HOST: 'i686-linux-gnu'
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CC: ${{ matrix.cc }}
@@ -183,6 +185,7 @@ jobs:
WITH_VALGRIND: 'no'
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CTIMETESTS: 'no'
@@ -234,6 +237,7 @@ jobs:
WITH_VALGRIND: 'no'
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CTIMETESTS: 'no'
@@ -279,6 +283,7 @@ jobs:
WITH_VALGRIND: 'no'
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CTIMETESTS: 'no'
@@ -334,6 +339,7 @@ jobs:
WITH_VALGRIND: 'no'
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CTIMETESTS: 'no'
@@ -386,6 +392,7 @@ jobs:
WRAPPER_CMD: 'valgrind --error-exitcode=42'
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CTIMETESTS: 'no'
@@ -437,6 +444,7 @@ jobs:
env:
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CTIMETESTS: 'no'
@@ -501,6 +509,7 @@ jobs:
env:
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CC: 'clang'
@@ -547,6 +556,7 @@ jobs:
WITH_VALGRIND: 'no'
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
CTIMETESTS: 'no'
@@ -605,15 +615,15 @@ jobs:
fail-fast: false
matrix:
env_vars:
- - { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- { WIDEMUL: 'int128_struct', ECMULTGENKB: 2, ECMULTWINDOW: 4 }
- - { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - { WIDEMUL: 'int128', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- { WIDEMUL: 'int128', RECOVERY: 'yes' }
- - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' }
- - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', WRAPPER_CMD: 'valgrind --error-exitcode=42', SECP256K1_TEST_ITERS: 2 }
- - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc', WRAPPER_CMD: 'valgrind --error-exitcode=42', SECP256K1_TEST_ITERS: 2 }
- - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY', CTIMETESTS: 'no' }
+ - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' }
+ - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', WRAPPER_CMD: 'valgrind --error-exitcode=42', SECP256K1_TEST_ITERS: 2 }
+ - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc', WRAPPER_CMD: 'valgrind --error-exitcode=42', SECP256K1_TEST_ITERS: 2 }
+ - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY', CTIMETESTS: 'no' }
- BUILD: 'distcheck'
steps:
@@ -622,7 +632,7 @@ jobs:
- name: Install Homebrew packages
run: |
- brew install automake libtool gcc
+ brew install --quiet automake libtool gcc
ln -s $(brew --prefix gcc)/bin/gcc-?? /usr/local/bin/gcc
- name: Install and cache Valgrind
@@ -666,13 +676,13 @@ jobs:
fail-fast: false
matrix:
env_vars:
- - { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- { WIDEMUL: 'int128_struct', ECMULTGENPRECISION: 2, ECMULTWINDOW: 4 }
- - { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - { WIDEMUL: 'int128', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- { WIDEMUL: 'int128', RECOVERY: 'yes' }
- - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
- - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' }
- - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY' }
+ - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
+ - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' }
+ - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY' }
- BUILD: 'distcheck'
steps:
@@ -681,7 +691,7 @@ jobs:
- name: Install Homebrew packages
run: |
- brew install automake libtool gcc
+ brew install --quiet automake libtool gcc
ln -s $(brew --prefix gcc)/bin/gcc-?? /usr/local/bin/gcc
- name: CI script
@@ -778,6 +788,7 @@ jobs:
WERROR_CFLAGS:
ECDH: 'yes'
RECOVERY: 'yes'
+ EXTRAKEYS: 'yes'
SCHNORRSIG: 'yes'
ELLSWIFT: 'yes'
@@ -864,5 +875,5 @@ jobs:
CI_BUILD: ${{ runner.temp }}/${{ github.run_id }}${{ github.action }}/build
CI_INSTALL: ${{ runner.temp }}/${{ github.run_id }}${{ github.action }}/install
run: |
- cmake -B ${{ env.CI_BUILD }} -DCMAKE_INSTALL_PREFIX=${{ env.CI_INSTALL }} && cmake --build ${{ env.CI_BUILD }} --target install && ls -RlAh ${{ env.CI_INSTALL }}
+ cmake -B ${{ env.CI_BUILD }} -DCMAKE_INSTALL_PREFIX=${{ env.CI_INSTALL }} && cmake --build ${{ env.CI_BUILD }} && cmake --install ${{ env.CI_BUILD }} && ls -RlAh ${{ env.CI_INSTALL }}
gcc -o ecdsa examples/ecdsa.c -I ${{ env.CI_INSTALL }}/include -L ${{ env.CI_INSTALL }}/lib*/ -l secp256k1 -Wl,-rpath,"${{ env.CI_INSTALL }}/lib",-rpath,"${{ env.CI_INSTALL }}/lib64" && ./ecdsa
diff --git a/src/secp256k1/.gitignore b/src/secp256k1/.gitignore
index 574902b8b5..18e3259f59 100644
--- a/src/secp256k1/.gitignore
+++ b/src/secp256k1/.gitignore
@@ -10,6 +10,7 @@ ctime_tests
ecdh_example
ecdsa_example
schnorr_example
+ellswift_example
*.exe
*.so
*.a
diff --git a/src/secp256k1/CHANGELOG.md b/src/secp256k1/CHANGELOG.md
index a2855912fd..fb82940627 100644
--- a/src/secp256k1/CHANGELOG.md
+++ b/src/secp256k1/CHANGELOG.md
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [0.5.1] - 2024-08-01
+
+#### Added
+ - Added usage example for an ElligatorSwift key exchange.
+
+#### Changed
+ - The default size of the precomputed table for signing was changed from 22 KiB to 86 KiB. The size can be changed with the configure option `--ecmult-gen-kb` (`SECP256K1_ECMULT_GEN_KB` for CMake).
+ - "auto" is no longer an accepted value for the `--with-ecmult-window` and `--with-ecmult-gen-kb` configure options (this also applies to `SECP256K1_ECMULT_WINDOW_SIZE` and `SECP256K1_ECMULT_GEN_KB` in CMake). To achieve the same configuration as previously provided by the "auto" value, omit setting the configure option explicitly.
+
+#### Fixed
+ - Fixed compilation when the extrakeys module is disabled.
+
+#### ABI Compatibility
+The ABI is backward compatible with versions 0.5.0, 0.4.x and 0.3.x.
+
## [0.5.0] - 2024-05-06
#### Added
@@ -14,7 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
#### Changed
- The implementation of the point multiplication algorithm used for signing and public key generation was changed, resulting in improved performance for those operations.
- - The related configure option `--ecmult-gen-precision` was replaced with `--ecmult-gen-kb` (`ECMULT_GEN_KB` for CMake).
+ - The related configure option `--ecmult-gen-precision` was replaced with `--ecmult-gen-kb` (`SECP256K1_ECMULT_GEN_KB` for CMake).
- This changes the supported precomputed table sizes for these operations. The new supported sizes are 2 KiB, 22 KiB, or 86 KiB (while the old supported sizes were 32 KiB, 64 KiB, or 512 KiB).
#### ABI Compatibility
@@ -128,7 +143,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.5.0...HEAD
+[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.1...HEAD
+[0.5.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.0...v0.5.1
[0.5.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.1...v0.5.0
[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
diff --git a/src/secp256k1/CMakeLists.txt b/src/secp256k1/CMakeLists.txt
index 7e3465a75b..d5a7a2de39 100644
--- a/src/secp256k1/CMakeLists.txt
+++ b/src/secp256k1/CMakeLists.txt
@@ -1,17 +1,10 @@
-cmake_minimum_required(VERSION 3.13)
-
-if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.15)
- # MSVC runtime library flags are selected by the CMAKE_MSVC_RUNTIME_LIBRARY abstraction.
- cmake_policy(SET CMP0091 NEW)
- # MSVC warning flags are not in CMAKE_<LANG>_FLAGS by default.
- cmake_policy(SET CMP0092 NEW)
-endif()
+cmake_minimum_required(VERSION 3.16)
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.5.1
+ VERSION 0.5.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
@@ -34,7 +27,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 4)
-set(${PROJECT_NAME}_LIB_VERSION_REVISION 1)
+set(${PROJECT_NAME}_LIB_VERSION_REVISION 2)
set(${PROJECT_NAME}_LIB_VERSION_AGE 2)
set(CMAKE_C_STANDARD 90)
@@ -97,7 +90,7 @@ include(CheckStringOptionValue)
check_string_option_value(SECP256K1_ECMULT_WINDOW_SIZE)
add_compile_definitions(ECMULT_WINDOW_SIZE=${SECP256K1_ECMULT_WINDOW_SIZE})
-set(SECP256K1_ECMULT_GEN_KB 22 CACHE STRING "The size of the precomputed table for signing in multiples of 1024 bytes (on typical platforms). Larger values result in possibly better signing or key generation performance at the cost of a larger table. Valid choices are 2, 22, 86. The default value is a reasonable setting for desktop machines (currently 22). [default=22]")
+set(SECP256K1_ECMULT_GEN_KB 86 CACHE STRING "The size of the precomputed table for signing in multiples of 1024 bytes (on typical platforms). Larger values result in possibly better signing or key generation performance at the cost of a larger table. Valid choices are 2, 22, 86. The default value is a reasonable setting for desktop machines (currently 86). [default=86]")
set_property(CACHE SECP256K1_ECMULT_GEN_KB PROPERTY STRINGS 2 22 86)
check_string_option_value(SECP256K1_ECMULT_GEN_KB)
if(SECP256K1_ECMULT_GEN_KB EQUAL 2)
@@ -185,7 +178,7 @@ else()
string(REGEX REPLACE "-DNDEBUG[ \t\r\n]*" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
string(REGEX REPLACE "-DNDEBUG[ \t\r\n]*" "" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
# Prefer -O2 optimization level. (-O3 is CMake's default for Release for many compilers.)
- string(REGEX REPLACE "-O3[ \t\r\n]*" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
+ string(REGEX REPLACE "-O3( |$)" "-O2\\1" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
endif()
# Define custom "Coverage" build type.
@@ -283,6 +276,14 @@ if(SECP256K1_APPEND_CFLAGS)
string(APPEND CMAKE_C_COMPILE_OBJECT " ${SECP256K1_APPEND_CFLAGS}")
endif()
+set(SECP256K1_APPEND_LDFLAGS "" CACHE STRING "Linker flags that are appended to the command line after all other flags added by the build system. This variable is intended for debugging and special builds.")
+if(SECP256K1_APPEND_LDFLAGS)
+ # Appending to this low-level rule variable is the only way to
+ # guarantee that the flags appear at the end of the command line.
+ string(APPEND CMAKE_C_CREATE_SHARED_LIBRARY " ${SECP256K1_APPEND_LDFLAGS}")
+ string(APPEND CMAKE_C_LINK_EXECUTABLE " ${SECP256K1_APPEND_LDFLAGS}")
+endif()
+
add_subdirectory(src)
if(SECP256K1_BUILD_EXAMPLES)
add_subdirectory(examples)
@@ -362,6 +363,9 @@ endif()
if(SECP256K1_APPEND_CFLAGS)
message("SECP256K1_APPEND_CFLAGS ............... ${SECP256K1_APPEND_CFLAGS}")
endif()
+if(SECP256K1_APPEND_LDFLAGS)
+ message("SECP256K1_APPEND_LDFLAGS .............. ${SECP256K1_APPEND_LDFLAGS}")
+endif()
message("")
if(print_msan_notice)
message(
diff --git a/src/secp256k1/CONTRIBUTING.md b/src/secp256k1/CONTRIBUTING.md
index 5fbf7332c9..a366d38b0e 100644
--- a/src/secp256k1/CONTRIBUTING.md
+++ b/src/secp256k1/CONTRIBUTING.md
@@ -49,6 +49,7 @@ In addition, libsecp256k1 tries to maintain the following coding conventions:
* 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)).
+* As a rule of thumb, the default values for configuration options should target standard desktop machines and align with Bitcoin Core's defaults, and the tests should mostly exercise the default configuration (see [#1549](https://github.com/bitcoin-core/secp256k1/issues/1549#issuecomment-2200559257)).
#### Style conventions
diff --git a/src/secp256k1/Makefile.am b/src/secp256k1/Makefile.am
index 322e44eaab..8723b53b2c 100644
--- a/src/secp256k1/Makefile.am
+++ b/src/secp256k1/Makefile.am
@@ -184,6 +184,17 @@ schnorr_example_LDFLAGS += -lbcrypt
endif
TESTS += schnorr_example
endif
+if ENABLE_MODULE_ELLSWIFT
+noinst_PROGRAMS += ellswift_example
+ellswift_example_SOURCES = examples/ellswift.c
+ellswift_example_CPPFLAGS = -I$(top_srcdir)/include -DSECP256K1_STATIC
+ellswift_example_LDADD = libsecp256k1.la
+ellswift_example_LDFLAGS = -static
+if BUILD_WINDOWS
+ellswift_example_LDFLAGS += -lbcrypt
+endif
+TESTS += ellswift_example
+endif
endif
### Precomputed tables
diff --git a/src/secp256k1/README.md b/src/secp256k1/README.md
index e8d4123ab9..ed93e0519e 100644
--- a/src/secp256k1/README.md
+++ b/src/secp256k1/README.md
@@ -82,7 +82,7 @@ To maintain a pristine source tree, CMake encourages to perform an out-of-source
$ cmake ..
$ cmake --build .
$ ctest # run the test suite
- $ sudo cmake --build . --target install # optional
+ $ sudo cmake --install . # optional
To compile optional modules (such as Schnorr signatures), you need to run `cmake` with additional flags (such as `-DSECP256K1_ENABLE_MODULE_SCHNORRSIG=ON`). Run `cmake .. -LH` to see the full list of available flags.
@@ -114,6 +114,7 @@ Usage examples can be found in the [examples](examples) directory. To compile th
* [ECDSA example](examples/ecdsa.c)
* [Schnorr signatures example](examples/schnorr.c)
* [Deriving a shared secret (ECDH) example](examples/ecdh.c)
+ * [ElligatorSwift key exchange example](examples/ellswift.c)
To compile the Schnorr signature and ECDH examples, you also need to configure with `--enable-module-schnorrsig` and `--enable-module-ecdh`.
diff --git a/src/secp256k1/ci/ci.sh b/src/secp256k1/ci/ci.sh
index c7d2e9e4ea..a6c608c29c 100755
--- a/src/secp256k1/ci/ci.sh
+++ b/src/secp256k1/ci/ci.sh
@@ -13,7 +13,7 @@ print_environment() {
# does not rely on bash.
for var in WERROR_CFLAGS MAKEFLAGS BUILD \
ECMULTWINDOW ECMULTGENKB ASM WIDEMUL WITH_VALGRIND EXTRAFLAGS \
- EXPERIMENTAL ECDH RECOVERY SCHNORRSIG ELLSWIFT \
+ EXPERIMENTAL ECDH RECOVERY EXTRAKEYS SCHNORRSIG ELLSWIFT \
SECP256K1_TEST_ITERS BENCH SECP256K1_BENCH_ITERS CTIMETESTS\
EXAMPLES \
HOST WRAPPER_CMD \
@@ -77,6 +77,7 @@ esac
--with-ecmult-gen-kb="$ECMULTGENKB" \
--enable-module-ecdh="$ECDH" --enable-module-recovery="$RECOVERY" \
--enable-module-ellswift="$ELLSWIFT" \
+ --enable-module-extrakeys="$EXTRAKEYS" \
--enable-module-schnorrsig="$SCHNORRSIG" \
--enable-examples="$EXAMPLES" \
--enable-ctime-tests="$CTIMETESTS" \
diff --git a/src/secp256k1/ci/linux-debian.Dockerfile b/src/secp256k1/ci/linux-debian.Dockerfile
index 5ce715b41b..241bfa9719 100644
--- a/src/secp256k1/ci/linux-debian.Dockerfile
+++ b/src/secp256k1/ci/linux-debian.Dockerfile
@@ -40,7 +40,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
apt-get clean && rm -rf /var/lib/apt/lists/*
# Build and install gcc snapshot
-ARG GCC_SNAPSHOT_MAJOR=14
+ARG GCC_SNAPSHOT_MAJOR=15
RUN apt-get update && apt-get install --no-install-recommends -y wget libgmp-dev libmpfr-dev libmpc-dev flex && \
mkdir gcc && cd gcc && \
wget --progress=dot:giga --https-only --recursive --accept '*.tar.xz' --level 1 --no-directories "https://gcc.gnu.org/pub/gcc/snapshots/LATEST-${GCC_SNAPSHOT_MAJOR}" && \
diff --git a/src/secp256k1/configure.ac b/src/secp256k1/configure.ac
index adae189787..6841543f59 100644
--- a/src/secp256k1/configure.ac
+++ b/src/secp256k1/configure.ac
@@ -5,7 +5,7 @@ AC_PREREQ([2.60])
# backwards-compatible and therefore at most increase the minor version.
define(_PKG_VERSION_MAJOR, 0)
define(_PKG_VERSION_MINOR, 5)
-define(_PKG_VERSION_PATCH, 1)
+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
@@ -14,7 +14,7 @@ define(_PKG_VERSION_IS_RELEASE, false)
# 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, 4)
-define(_LIB_VERSION_REVISION, 1)
+define(_LIB_VERSION_REVISION, 2)
define(_LIB_VERSION_AGE, 2)
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])
@@ -216,9 +216,9 @@ AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE],
AC_ARG_WITH([ecmult-gen-kb], [AS_HELP_STRING([--with-ecmult-gen-kb=2|22|86],
[The size of the precomputed table for signing in multiples of 1024 bytes (on typical platforms).]
[Larger values result in possibly better signing/keygeneration performance at the cost of a larger table.]
-[The default value is a reasonable setting for desktop machines (currently 22). [default=22]]
+[The default value is a reasonable setting for desktop machines (currently 86). [default=86]]
)],
-[set_ecmult_gen_kb=$withval], [set_ecmult_gen_kb=22])
+[set_ecmult_gen_kb=$withval], [set_ecmult_gen_kb=86])
AC_ARG_WITH([valgrind], [AS_HELP_STRING([--with-valgrind=yes|no|auto],
[Build with extra checks for running inside Valgrind [default=auto]]
diff --git a/src/secp256k1/doc/release-process.md b/src/secp256k1/doc/release-process.md
index cdf62430df..a64bae0f0d 100644
--- a/src/secp256k1/doc/release-process.md
+++ b/src/secp256k1/doc/release-process.md
@@ -31,7 +31,7 @@ Perform these checks when reviewing the release PR (see below):
```shell
dir=$(mktemp -d)
build=$(mktemp -d)
- cmake -B $build -DCMAKE_INSTALL_PREFIX=$dir && cmake --build $build --target install && ls -RlAh $dir
+ cmake -B $build -DCMAKE_INSTALL_PREFIX=$dir && cmake --build $build && cmake --install $build && 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 verify that there are no unexpected ABI incompatibilities and that the version number and the release notes accurately reflect all potential ABI changes. To run this tool, the `abi-dumper` and `abi-compliance-checker` packages are required.
@@ -44,7 +44,8 @@ Perform these checks when reviewing the release PR (see below):
1. Open a PR to the master branch with a commit (using message `"release: prepare for $MAJOR.$MINOR.$PATCH"`, for example) that
* 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
+ * removing the `[Unreleased]` section header,
+ * ensuring that the release notes are not missing entries (check the `needs-changelog` label on github), and
* 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,
diff --git a/src/secp256k1/examples/CMakeLists.txt b/src/secp256k1/examples/CMakeLists.txt
index 607bb67770..fd1ebce395 100644
--- a/src/secp256k1/examples/CMakeLists.txt
+++ b/src/secp256k1/examples/CMakeLists.txt
@@ -28,3 +28,7 @@ endif()
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
add_example(schnorr)
endif()
+
+if(SECP256K1_ENABLE_MODULE_ELLSWIFT)
+ add_example(ellswift)
+endif()
diff --git a/src/secp256k1/examples/ecdh.c b/src/secp256k1/examples/ecdh.c
index 4b7b7d6154..d71fd2f604 100644
--- a/src/secp256k1/examples/ecdh.c
+++ b/src/secp256k1/examples/ecdh.c
@@ -108,7 +108,7 @@ int main(void) {
/* It's best practice to try to clear secrets from memory after using them.
* This is done because some bugs can allow an attacker to leak memory, for
- * example through "out of bounds" array access (see Heartbleed), Or the OS
+ * example through "out of bounds" array access (see Heartbleed), or the OS
* swapping them to disk. Hence, we overwrite the secret key buffer with zeros.
*
* Here we are preventing these writes from being optimized out, as any good compiler
diff --git a/src/secp256k1/examples/ecdsa.c b/src/secp256k1/examples/ecdsa.c
index d1d2b0e365..d5c4613d9c 100644
--- a/src/secp256k1/examples/ecdsa.c
+++ b/src/secp256k1/examples/ecdsa.c
@@ -128,7 +128,7 @@ int main(void) {
/* It's best practice to try to clear secrets from memory after using them.
* This is done because some bugs can allow an attacker to leak memory, for
- * example through "out of bounds" array access (see Heartbleed), Or the OS
+ * example through "out of bounds" array access (see Heartbleed), or the OS
* swapping them to disk. Hence, we overwrite the secret key buffer with zeros.
*
* Here we are preventing these writes from being optimized out, as any good compiler
diff --git a/src/secp256k1/examples/ellswift.c b/src/secp256k1/examples/ellswift.c
new file mode 100644
index 0000000000..52be7eebfb
--- /dev/null
+++ b/src/secp256k1/examples/ellswift.c
@@ -0,0 +1,123 @@
+/*************************************************************************
+ * Written in 2024 by Sebastian Falbesoner *
+ * To the extent possible under law, the author(s) have dedicated all *
+ * copyright and related and neighboring rights to the software in this *
+ * file to the public domain worldwide. This software is distributed *
+ * without any warranty. For the CC0 Public Domain Dedication, see *
+ * EXAMPLES_COPYING or https://creativecommons.org/publicdomain/zero/1.0 *
+ *************************************************************************/
+
+/** This file demonstrates how to use the ElligatorSwift module to perform
+ * a key exchange according to BIP 324. Additionally, see the documentation
+ * in include/secp256k1_ellswift.h and doc/ellswift.md.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+
+#include <secp256k1.h>
+#include <secp256k1_ellswift.h>
+
+#include "examples_util.h"
+
+int main(void) {
+ secp256k1_context* ctx;
+ unsigned char randomize[32];
+ unsigned char auxrand1[32];
+ unsigned char auxrand2[32];
+ unsigned char seckey1[32];
+ unsigned char seckey2[32];
+ unsigned char ellswift_pubkey1[64];
+ unsigned char ellswift_pubkey2[64];
+ unsigned char shared_secret1[32];
+ unsigned char shared_secret2[32];
+ int return_val;
+
+ /* Create a secp256k1 context */
+ ctx = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
+ if (!fill_random(randomize, sizeof(randomize))) {
+ printf("Failed to generate randomness\n");
+ return 1;
+ }
+ /* Randomizing the context is recommended to protect against side-channel
+ * leakage. See `secp256k1_context_randomize` in secp256k1.h for more
+ * information about it. This should never fail. */
+ return_val = secp256k1_context_randomize(ctx, randomize);
+ assert(return_val);
+
+ /*** Generate secret keys ***/
+
+ /* If the secret key is zero or out of range (bigger than secp256k1's
+ * order), we try to sample a new key. Note that the probability of this
+ * happening is negligible. */
+ while (1) {
+ if (!fill_random(seckey1, sizeof(seckey1)) || !fill_random(seckey2, sizeof(seckey2))) {
+ printf("Failed to generate randomness\n");
+ return 1;
+ }
+ if (secp256k1_ec_seckey_verify(ctx, seckey1) && secp256k1_ec_seckey_verify(ctx, seckey2)) {
+ break;
+ }
+ }
+
+ /* Generate ElligatorSwift public keys. This should never fail with valid context and
+ verified secret keys. Note that providing additional randomness (fourth parameter) is
+ optional, but recommended. */
+ if (!fill_random(auxrand1, sizeof(auxrand1)) || !fill_random(auxrand2, sizeof(auxrand2))) {
+ printf("Failed to generate randomness\n");
+ return 1;
+ }
+ return_val = secp256k1_ellswift_create(ctx, ellswift_pubkey1, seckey1, auxrand1);
+ assert(return_val);
+ return_val = secp256k1_ellswift_create(ctx, ellswift_pubkey2, seckey2, auxrand2);
+ assert(return_val);
+
+ /*** Create the shared secret on each side ***/
+
+ /* Perform x-only ECDH with seckey1 and ellswift_pubkey2. Should never fail
+ * with a verified seckey and valid pubkey. Note that both parties pass both
+ * EllSwift pubkeys in the same order; the pubkey of the calling party is
+ * determined by the "party" boolean (sixth parameter). */
+ return_val = secp256k1_ellswift_xdh(ctx, shared_secret1, ellswift_pubkey1, ellswift_pubkey2,
+ seckey1, 0, secp256k1_ellswift_xdh_hash_function_bip324, NULL);
+ assert(return_val);
+
+ /* Perform x-only ECDH with seckey2 and ellswift_pubkey1. Should never fail
+ * with a verified seckey and valid pubkey. */
+ return_val = secp256k1_ellswift_xdh(ctx, shared_secret2, ellswift_pubkey1, ellswift_pubkey2,
+ seckey2, 1, secp256k1_ellswift_xdh_hash_function_bip324, NULL);
+ assert(return_val);
+
+ /* Both parties should end up with the same shared secret */
+ return_val = memcmp(shared_secret1, shared_secret2, sizeof(shared_secret1));
+ assert(return_val == 0);
+
+ printf( " Secret Key1: ");
+ print_hex(seckey1, sizeof(seckey1));
+ printf( "EllSwift Pubkey1: ");
+ print_hex(ellswift_pubkey1, sizeof(ellswift_pubkey1));
+ printf("\n Secret Key2: ");
+ print_hex(seckey2, sizeof(seckey2));
+ printf( "EllSwift Pubkey2: ");
+ print_hex(ellswift_pubkey2, sizeof(ellswift_pubkey2));
+ printf("\n Shared Secret: ");
+ print_hex(shared_secret1, sizeof(shared_secret1));
+
+ /* This will clear everything from the context and free the memory */
+ secp256k1_context_destroy(ctx);
+
+ /* It's best practice to try to clear secrets from memory after using them.
+ * This is done because some bugs can allow an attacker to leak memory, for
+ * example through "out of bounds" array access (see Heartbleed), or the OS
+ * swapping them to disk. Hence, we overwrite the secret key buffer with zeros.
+ *
+ * Here we are preventing these writes from being optimized out, as any good compiler
+ * will remove any writes that aren't used. */
+ secure_erase(seckey1, sizeof(seckey1));
+ secure_erase(seckey2, sizeof(seckey2));
+ secure_erase(shared_secret1, sizeof(shared_secret1));
+ secure_erase(shared_secret2, sizeof(shared_secret2));
+
+ return 0;
+}
diff --git a/src/secp256k1/examples/schnorr.c b/src/secp256k1/examples/schnorr.c
index 4c0dd1c1a9..8d5d14bdaf 100644
--- a/src/secp256k1/examples/schnorr.c
+++ b/src/secp256k1/examples/schnorr.c
@@ -18,9 +18,9 @@
#include "examples_util.h"
int main(void) {
- unsigned char msg[12] = "Hello World!";
+ unsigned char msg[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
unsigned char msg_hash[32];
- unsigned char tag[17] = "my_fancy_protocol";
+ unsigned char tag[] = {'m', 'y', '_', 'f', 'a', 'n', 'c', 'y', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l'};
unsigned char seckey[32];
unsigned char randomize[32];
unsigned char auxiliary_rand[32];
@@ -146,7 +146,7 @@ int main(void) {
/* It's best practice to try to clear secrets from memory after using them.
* This is done because some bugs can allow an attacker to leak memory, for
- * example through "out of bounds" array access (see Heartbleed), Or the OS
+ * example through "out of bounds" array access (see Heartbleed), or the OS
* swapping them to disk. Hence, we overwrite the secret key buffer with zeros.
*
* Here we are preventing these writes from being optimized out, as any good compiler
diff --git a/src/secp256k1/include/secp256k1_ellswift.h b/src/secp256k1/include/secp256k1_ellswift.h
index ae37287f82..0d1293e94f 100644
--- a/src/secp256k1/include/secp256k1_ellswift.h
+++ b/src/secp256k1/include/secp256k1_ellswift.h
@@ -35,7 +35,7 @@ extern "C" {
*
* If the Y coordinate is relevant, it is given the same parity as t.
*
- * Changes w.r.t. the the paper:
+ * Changes w.r.t. the paper:
* - The u=0, t=0, and u^3+t^2+7=0 conditions result in decoding to the point
* at infinity in the paper. Here they are remapped to finite points.
* - The paper uses an additional encoding bit for the parity of y. Here the
diff --git a/src/secp256k1/src/modules/ellswift/tests_impl.h b/src/secp256k1/src/modules/ellswift/tests_impl.h
index ed5658f34c..3c314c9b50 100644
--- a/src/secp256k1/src/modules/ellswift/tests_impl.h
+++ b/src/secp256k1/src/modules/ellswift/tests_impl.h
@@ -406,9 +406,9 @@ void run_ellswift_tests(void) {
/* Test hash initializers. */
{
secp256k1_sha256 sha, sha_optimized;
- static const unsigned char encode_tag[25] = "secp256k1_ellswift_encode";
- static const unsigned char create_tag[25] = "secp256k1_ellswift_create";
- static const unsigned char bip324_tag[26] = "bip324_ellswift_xonly_ecdh";
+ static const unsigned char encode_tag[] = {'s', 'e', 'c', 'p', '2', '5', '6', 'k', '1', '_', 'e', 'l', 'l', 's', 'w', 'i', 'f', 't', '_', 'e', 'n', 'c', 'o', 'd', 'e'};
+ static const unsigned char create_tag[] = {'s', 'e', 'c', 'p', '2', '5', '6', 'k', '1', '_', 'e', 'l', 'l', 's', 'w', 'i', 'f', 't', '_', 'c', 'r', 'e', 'a', 't', 'e'};
+ static const unsigned char bip324_tag[] = {'b', 'i', 'p', '3', '2', '4', '_', 'e', 'l', 'l', 's', 'w', 'i', 'f', 't', '_', 'x', 'o', 'n', 'l', 'y', '_', 'e', 'c', 'd', 'h'};
/* Check that hash initialized by
* secp256k1_ellswift_sha256_init_encode has the expected
diff --git a/src/secp256k1/src/modules/schnorrsig/main_impl.h b/src/secp256k1/src/modules/schnorrsig/main_impl.h
index 26727e4651..57f7eadd3c 100644
--- a/src/secp256k1/src/modules/schnorrsig/main_impl.h
+++ b/src/secp256k1/src/modules/schnorrsig/main_impl.h
@@ -45,7 +45,7 @@ static void secp256k1_nonce_function_bip340_sha256_tagged_aux(secp256k1_sha256 *
/* algo argument for nonce_function_bip340 to derive the nonce exactly as stated in BIP-340
* by using the correct tagged hash function. */
-static const unsigned char bip340_algo[13] = "BIP0340/nonce";
+static const unsigned char bip340_algo[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'n', 'o', 'n', 'c', 'e'};
static const unsigned char schnorrsig_extraparams_magic[4] = SECP256K1_SCHNORRSIG_EXTRAPARAMS_MAGIC;
diff --git a/src/secp256k1/src/modules/schnorrsig/tests_impl.h b/src/secp256k1/src/modules/schnorrsig/tests_impl.h
index aa4fc38270..2d716a01f8 100644
--- a/src/secp256k1/src/modules/schnorrsig/tests_impl.h
+++ b/src/secp256k1/src/modules/schnorrsig/tests_impl.h
@@ -21,9 +21,9 @@ static void nonce_function_bip340_bitflip(unsigned char **args, size_t n_flip, s
}
static void run_nonce_function_bip340_tests(void) {
- unsigned char tag[13] = "BIP0340/nonce";
- unsigned char aux_tag[11] = "BIP0340/aux";
- unsigned char algo[13] = "BIP0340/nonce";
+ unsigned char tag[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'n', 'o', 'n', 'c', 'e'};
+ unsigned char aux_tag[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'a', 'u', 'x'};
+ unsigned char algo[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'n', 'o', 'n', 'c', 'e'};
size_t algolen = sizeof(algo);
secp256k1_sha256 sha;
secp256k1_sha256 sha_optimized;
@@ -158,7 +158,7 @@ static void test_schnorrsig_api(void) {
/* Checks that hash initialized by secp256k1_schnorrsig_sha256_tagged has the
* expected state. */
static void test_schnorrsig_sha256_tagged(void) {
- unsigned char tag[17] = "BIP0340/challenge";
+ unsigned char tag[] = {'B', 'I', 'P', '0', '3', '4', '0', '/', 'c', 'h', 'a', 'l', 'l', 'e', 'n', 'g', 'e'};
secp256k1_sha256 sha;
secp256k1_sha256 sha_optimized;
@@ -806,7 +806,7 @@ static void test_schnorrsig_sign(void) {
unsigned char sk[32];
secp256k1_xonly_pubkey pk;
secp256k1_keypair keypair;
- const unsigned char msg[32] = "this is a msg for a schnorrsig..";
+ const unsigned char msg[] = {'t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 'm', 's', 'g', ' ', 'f', 'o', 'r', ' ', 'a', ' ', 's', 'c', 'h', 'n', 'o', 'r', 'r', 's', 'i', 'g', '.', '.'};
unsigned char sig[64];
unsigned char sig2[64];
unsigned char zeros64[64] = { 0 };
diff --git a/src/secp256k1/src/testrand_impl.h b/src/secp256k1/src/testrand_impl.h
index 07564f7f3f..b84f5730a9 100644
--- a/src/secp256k1/src/testrand_impl.h
+++ b/src/secp256k1/src/testrand_impl.h
@@ -18,7 +18,7 @@
static uint64_t secp256k1_test_state[4];
SECP256K1_INLINE static void testrand_seed(const unsigned char *seed16) {
- static const unsigned char PREFIX[19] = "secp256k1 test init";
+ static const unsigned char PREFIX[] = {'s', 'e', 'c', 'p', '2', '5', '6', 'k', '1', ' ', 't', 'e', 's', 't', ' ', 'i', 'n', 'i', 't'};
unsigned char out32[32];
secp256k1_sha256 hash;
int i;
diff --git a/src/secp256k1/src/tests.c b/src/secp256k1/src/tests.c
index 6b401e52c0..70c15f870b 100644
--- a/src/secp256k1/src/tests.c
+++ b/src/secp256k1/src/tests.c
@@ -6609,14 +6609,6 @@ static void permute(size_t *arr, size_t n) {
}
}
-static void rand_pk(secp256k1_pubkey *pk) {
- unsigned char seckey[32];
- secp256k1_keypair keypair;
- testrand256(seckey);
- CHECK(secp256k1_keypair_create(CTX, &keypair, seckey) == 1);
- CHECK(secp256k1_keypair_pub(CTX, pk, &keypair) == 1);
-}
-
static void test_sort_api(void) {
secp256k1_pubkey pks[2];
const secp256k1_pubkey *pks_ptr[2];
@@ -6624,8 +6616,8 @@ static void test_sort_api(void) {
pks_ptr[0] = &pks[0];
pks_ptr[1] = &pks[1];
- rand_pk(&pks[0]);
- rand_pk(&pks[1]);
+ testutil_random_pubkey_test(&pks[0]);
+ testutil_random_pubkey_test(&pks[1]);
CHECK(secp256k1_ec_pubkey_sort(CTX, pks_ptr, 2) == 1);
CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_sort(CTX, NULL, 2));
@@ -6678,7 +6670,7 @@ static void test_sort(void) {
int j;
const secp256k1_pubkey *pk_ptr[5];
for (j = 0; j < 5; j++) {
- rand_pk(&pk[j]);
+ testutil_random_pubkey_test(&pk[j]);
pk_ptr[j] = &pk[j];
}
secp256k1_ec_pubkey_sort(CTX, pk_ptr, 5);
diff --git a/src/secp256k1/src/testutil.h b/src/secp256k1/src/testutil.h
index 8296a5fb99..fc56854dd3 100644
--- a/src/secp256k1/src/testutil.h
+++ b/src/secp256k1/src/testutil.h
@@ -107,6 +107,12 @@ static void testutil_random_gej_test(secp256k1_gej *gej) {
testutil_random_ge_jacobian_test(gej, &ge);
}
+static void testutil_random_pubkey_test(secp256k1_pubkey *pk) {
+ secp256k1_ge ge;
+ testutil_random_ge_test(&ge);
+ secp256k1_pubkey_save(pk, &ge);
+}
+
static void testutil_random_scalar_order_test(secp256k1_scalar *num) {
do {
unsigned char b32[32];
diff --git a/src/serialize.h b/src/serialize.h
index 35519056a5..2af998f3c5 100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -1061,7 +1061,7 @@ protected:
size_t nSize{0};
public:
- SizeComputer() {}
+ SizeComputer() = default;
void write(Span<const std::byte> src)
{
diff --git a/src/signet.cpp b/src/signet.cpp
index 7c193a1d77..9b7ffd07cd 100644
--- a/src/signet.cpp
+++ b/src/signet.cpp
@@ -4,10 +4,6 @@
#include <signet.h>
-#include <array>
-#include <cstdint>
-#include <vector>
-
#include <common/system.h>
#include <consensus/merkle.h>
#include <consensus/params.h>
@@ -23,6 +19,11 @@
#include <uint256.h>
#include <util/strencodings.h>
+#include <algorithm>
+#include <array>
+#include <cstdint>
+#include <vector>
+
static constexpr uint8_t SIGNET_HEADER[4] = {0xec, 0xc7, 0xda, 0xa2};
static constexpr unsigned int BLOCK_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_NULLDUMMY;
@@ -38,7 +39,7 @@ static bool FetchAndClearCommitmentSection(const Span<const uint8_t> header, CSc
std::vector<uint8_t> pushdata;
while (witness_commitment.GetOp(pc, opcode, pushdata)) {
if (pushdata.size() > 0) {
- if (!found_header && pushdata.size() > (size_t)header.size() && Span{pushdata}.first(header.size()) == header) {
+ if (!found_header && pushdata.size() > header.size() && std::ranges::equal(Span{pushdata}.first(header.size()), header)) {
// pushdata only counts if it has the header _and_ some data
result.insert(result.end(), pushdata.begin() + header.size(), pushdata.end());
pushdata.erase(pushdata.begin() + header.size(), pushdata.end());
@@ -132,7 +133,7 @@ bool CheckSignetBlockSolution(const CBlock& block, const Consensus::Params& cons
const std::optional<SignetTxs> signet_txs = SignetTxs::Create(block, challenge);
if (!signet_txs) {
- LogPrint(BCLog::VALIDATION, "CheckSignetBlockSolution: Errors in block (block solution parse failure)\n");
+ LogDebug(BCLog::VALIDATION, "CheckSignetBlockSolution: Errors in block (block solution parse failure)\n");
return false;
}
@@ -144,7 +145,7 @@ bool CheckSignetBlockSolution(const CBlock& block, const Consensus::Params& cons
TransactionSignatureChecker sigcheck(&signet_txs->m_to_sign, /* nInIn= */ 0, /* amountIn= */ signet_txs->m_to_spend.vout[0].nValue, txdata, MissingDataBehavior::ASSERT_FAIL);
if (!VerifyScript(scriptSig, signet_txs->m_to_spend.vout[0].scriptPubKey, &witness, BLOCK_SCRIPT_VERIFY_FLAGS, sigcheck)) {
- LogPrint(BCLog::VALIDATION, "CheckSignetBlockSolution: Errors in block (block solution invalid)\n");
+ LogDebug(BCLog::VALIDATION, "CheckSignetBlockSolution: Errors in block (block solution invalid)\n");
return false;
}
return true;
diff --git a/src/span.h b/src/span.h
index c974c265ce..3c5028f0b7 100644
--- a/src/span.h
+++ b/src/span.h
@@ -5,11 +5,11 @@
#ifndef BITCOIN_SPAN_H
#define BITCOIN_SPAN_H
-#include <algorithm>
#include <cassert>
#include <cstddef>
#include <span>
#include <type_traits>
+#include <utility>
#ifdef DEBUG
#define CONSTEXPR_IF_NOT_DEBUG
@@ -213,13 +213,6 @@ public:
return Span<C>(m_data + m_size - count, count);
}
- friend constexpr bool operator==(const Span& a, const Span& b) noexcept { return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin()); }
- friend constexpr bool operator!=(const Span& a, const Span& b) noexcept { return !(a == b); }
- friend constexpr bool operator<(const Span& a, const Span& b) noexcept { return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()); }
- friend constexpr bool operator<=(const Span& a, const Span& b) noexcept { return !(b < a); }
- friend constexpr bool operator>(const Span& a, const Span& b) noexcept { return (b < a); }
- friend constexpr bool operator>=(const Span& a, const Span& b) noexcept { return !(a < b); }
-
template <typename O> friend class Span;
};
diff --git a/src/streams.cpp b/src/streams.cpp
index cdd36a86fe..baa5ad7abe 100644
--- a/src/streams.cpp
+++ b/src/streams.cpp
@@ -4,21 +4,29 @@
#include <span.h>
#include <streams.h>
+#include <util/fs_helpers.h>
#include <array>
+AutoFile::AutoFile(std::FILE* file, std::vector<std::byte> data_xor)
+ : m_file{file}, m_xor{std::move(data_xor)}
+{
+ if (!IsNull()) {
+ auto pos{std::ftell(m_file)};
+ if (pos >= 0) m_position = pos;
+ }
+}
+
std::size_t AutoFile::detail_fread(Span<std::byte> dst)
{
if (!m_file) throw std::ios_base::failure("AutoFile::read: file handle is nullptr");
- if (m_xor.empty()) {
- return std::fread(dst.data(), 1, dst.size(), m_file);
- } else {
- const auto init_pos{std::ftell(m_file)};
- if (init_pos < 0) throw std::ios_base::failure("AutoFile::read: ftell failed");
- std::size_t ret{std::fread(dst.data(), 1, dst.size(), m_file)};
- util::Xor(dst.subspan(0, ret), m_xor, init_pos);
- return ret;
+ size_t ret = std::fread(dst.data(), 1, dst.size(), m_file);
+ if (!m_xor.empty()) {
+ if (!m_position.has_value()) throw std::ios_base::failure("AutoFile::read: position unknown");
+ util::Xor(dst.subspan(0, ret), m_xor, *m_position);
}
+ if (m_position.has_value()) *m_position += ret;
+ return ret;
}
void AutoFile::seek(int64_t offset, int origin)
@@ -29,18 +37,23 @@ void AutoFile::seek(int64_t offset, int origin)
if (std::fseek(m_file, offset, origin) != 0) {
throw std::ios_base::failure(feof() ? "AutoFile::seek: end of file" : "AutoFile::seek: fseek failed");
}
+ if (origin == SEEK_SET) {
+ m_position = offset;
+ } else if (origin == SEEK_CUR && m_position.has_value()) {
+ *m_position += offset;
+ } else {
+ int64_t r{std::ftell(m_file)};
+ if (r < 0) {
+ throw std::ios_base::failure("AutoFile::seek: ftell failed");
+ }
+ m_position = r;
+ }
}
int64_t AutoFile::tell()
{
- if (IsNull()) {
- throw std::ios_base::failure("AutoFile::tell: file handle is nullptr");
- }
- int64_t r{std::ftell(m_file)};
- if (r < 0) {
- throw std::ios_base::failure("AutoFile::tell: ftell failed");
- }
- return r;
+ if (!m_position.has_value()) throw std::ios_base::failure("AutoFile::tell: position unknown");
+ return *m_position;
}
void AutoFile::read(Span<std::byte> dst)
@@ -60,6 +73,7 @@ void AutoFile::ignore(size_t nSize)
throw std::ios_base::failure(feof() ? "AutoFile::ignore: end of file" : "AutoFile::ignore: fread failed");
}
nSize -= nNow;
+ if (m_position.has_value()) *m_position += nNow;
}
}
@@ -70,19 +84,29 @@ void AutoFile::write(Span<const std::byte> src)
if (std::fwrite(src.data(), 1, src.size(), m_file) != src.size()) {
throw std::ios_base::failure("AutoFile::write: write failed");
}
+ if (m_position.has_value()) *m_position += src.size();
} else {
- auto current_pos{std::ftell(m_file)};
- if (current_pos < 0) throw std::ios_base::failure("AutoFile::write: ftell failed");
+ if (!m_position.has_value()) throw std::ios_base::failure("AutoFile::write: position unknown");
std::array<std::byte, 4096> buf;
while (src.size() > 0) {
auto buf_now{Span{buf}.first(std::min<size_t>(src.size(), buf.size()))};
std::copy(src.begin(), src.begin() + buf_now.size(), buf_now.begin());
- util::Xor(buf_now, m_xor, current_pos);
+ util::Xor(buf_now, m_xor, *m_position);
if (std::fwrite(buf_now.data(), 1, buf_now.size(), m_file) != buf_now.size()) {
throw std::ios_base::failure{"XorFile::write: failed"};
}
src = src.subspan(buf_now.size());
- current_pos += buf_now.size();
+ *m_position += buf_now.size();
}
}
}
+
+bool AutoFile::Commit()
+{
+ return ::FileCommit(m_file);
+}
+
+bool AutoFile::Truncate(unsigned size)
+{
+ return ::TruncateFile(m_file, size);
+}
diff --git a/src/streams.h b/src/streams.h
index 57fc600646..e9f3562c6c 100644
--- a/src/streams.h
+++ b/src/streams.h
@@ -161,7 +161,7 @@ public:
typedef vector_type::const_iterator const_iterator;
typedef vector_type::reverse_iterator reverse_iterator;
- explicit DataStream() {}
+ explicit DataStream() = default;
explicit DataStream(Span<const uint8_t> sp) : DataStream{AsBytes(sp)} {}
explicit DataStream(Span<const value_type> sp) : vch(sp.data(), sp.data() + sp.size()) {}
@@ -390,9 +390,10 @@ class AutoFile
protected:
std::FILE* m_file;
std::vector<std::byte> m_xor;
+ std::optional<int64_t> m_position;
public:
- explicit AutoFile(std::FILE* file, std::vector<std::byte> data_xor={}) : m_file{file}, m_xor{std::move(data_xor)} {}
+ explicit AutoFile(std::FILE* file, std::vector<std::byte> data_xor={});
~AutoFile() { fclose(); }
@@ -419,12 +420,6 @@ public:
return ret;
}
- /** Get wrapped FILE* without transfer of ownership.
- * @note Ownership of the FILE* will remain with this class. Use this only if the scope of the
- * AutoFile outlives use of the passed pointer.
- */
- std::FILE* Get() const { return m_file; }
-
/** Return true if the wrapped FILE* is nullptr, false otherwise.
*/
bool IsNull() const { return m_file == nullptr; }
@@ -435,9 +430,18 @@ public:
/** Implementation detail, only used internally. */
std::size_t detail_fread(Span<std::byte> dst);
+ /** Wrapper around fseek(). Will throw if seeking is not possible. */
void seek(int64_t offset, int origin);
+
+ /** Find position within the file. Will throw if unknown. */
int64_t tell();
+ /** Wrapper around FileCommit(). */
+ bool Commit();
+
+ /** Wrapper around TruncateFile(). */
+ bool Truncate(unsigned size);
+
//
// Stream subset
//
diff --git a/src/support/cleanse.cpp b/src/support/cleanse.cpp
index a8ddcd793f..4e370f1516 100644
--- a/src/support/cleanse.cpp
+++ b/src/support/cleanse.cpp
@@ -7,14 +7,14 @@
#include <cstring>
-#if defined(_MSC_VER)
-#include <Windows.h> // For SecureZeroMemory.
+#if defined(WIN32)
+#include <windows.h>
#endif
void memory_cleanse(void *ptr, size_t len)
{
-#if defined(_MSC_VER)
- /* SecureZeroMemory is guaranteed not to be optimized out by MSVC. */
+#if defined(WIN32)
+ /* SecureZeroMemory is guaranteed not to be optimized out. */
SecureZeroMemory(ptr, len);
#else
std::memset(ptr, 0, len);
diff --git a/src/support/lockedpool.cpp b/src/support/lockedpool.cpp
index fe3ba38cde..01eef2b93d 100644
--- a/src/support/lockedpool.cpp
+++ b/src/support/lockedpool.cpp
@@ -46,9 +46,7 @@ Arena::Arena(void *base_in, size_t size_in, size_t alignment_in):
chunks_free_end.emplace(static_cast<char*>(base) + size_in, it);
}
-Arena::~Arena()
-{
-}
+Arena::~Arena() = default;
void* Arena::alloc(size_t size)
{
diff --git a/src/support/lockedpool.h b/src/support/lockedpool.h
index 81e0df513a..2363b1e4ef 100644
--- a/src/support/lockedpool.h
+++ b/src/support/lockedpool.h
@@ -19,7 +19,7 @@
class LockedPageAllocator
{
public:
- virtual ~LockedPageAllocator() {}
+ virtual ~LockedPageAllocator() = default;
/** Allocate and lock memory pages.
* If len is not a multiple of the system page size, it is rounded up.
* Returns nullptr in case of allocation failure.
diff --git a/src/sync.h b/src/sync.h
index dc63e3f2d0..b22956ef1a 100644
--- a/src/sync.h
+++ b/src/sync.h
@@ -206,7 +206,7 @@ public:
protected:
// needed for reverse_lock
- UniqueLock() { }
+ UniqueLock() = default;
public:
/**
diff --git a/src/test/.gitignore b/src/test/.gitignore
deleted file mode 100644
index 036df1430c..0000000000
--- a/src/test/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# capnp generated files
-*.capnp.*
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
new file mode 100644
index 0000000000..c23fbae92f
--- /dev/null
+++ b/src/test/CMakeLists.txt
@@ -0,0 +1,216 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+include(GenerateHeaders)
+generate_header_from_json(data/base58_encode_decode.json)
+generate_header_from_json(data/bip341_wallet_vectors.json)
+generate_header_from_json(data/blockfilters.json)
+generate_header_from_json(data/key_io_invalid.json)
+generate_header_from_json(data/key_io_valid.json)
+generate_header_from_json(data/script_tests.json)
+generate_header_from_json(data/sighash.json)
+generate_header_from_json(data/tx_invalid.json)
+generate_header_from_json(data/tx_valid.json)
+generate_header_from_raw(data/asmap.raw test::data)
+
+# Do not use generator expressions in test sources because the
+# SOURCES property is processed to gather test suite macros.
+add_executable(test_bitcoin
+ main.cpp
+ $<TARGET_OBJECTS:bitcoin_consensus>
+ ${CMAKE_CURRENT_BINARY_DIR}/data/asmap.raw.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/base58_encode_decode.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/bip341_wallet_vectors.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/blockfilters.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/key_io_invalid.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/key_io_valid.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/script_tests.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/sighash.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/tx_invalid.json.h
+ ${CMAKE_CURRENT_BINARY_DIR}/data/tx_valid.json.h
+ addrman_tests.cpp
+ allocator_tests.cpp
+ amount_tests.cpp
+ argsman_tests.cpp
+ arith_uint256_tests.cpp
+ banman_tests.cpp
+ base32_tests.cpp
+ base58_tests.cpp
+ base64_tests.cpp
+ bech32_tests.cpp
+ bip32_tests.cpp
+ bip324_tests.cpp
+ blockchain_tests.cpp
+ blockencodings_tests.cpp
+ blockfilter_index_tests.cpp
+ blockfilter_tests.cpp
+ blockmanager_tests.cpp
+ bloom_tests.cpp
+ bswap_tests.cpp
+ checkqueue_tests.cpp
+ cluster_linearize_tests.cpp
+ coins_tests.cpp
+ coinscachepair_tests.cpp
+ coinstatsindex_tests.cpp
+ common_url_tests.cpp
+ compilerbug_tests.cpp
+ compress_tests.cpp
+ crypto_tests.cpp
+ cuckoocache_tests.cpp
+ dbwrapper_tests.cpp
+ denialofservice_tests.cpp
+ descriptor_tests.cpp
+ disconnected_transactions.cpp
+ feefrac_tests.cpp
+ flatfile_tests.cpp
+ fs_tests.cpp
+ getarg_tests.cpp
+ hash_tests.cpp
+ headers_sync_chainwork_tests.cpp
+ httpserver_tests.cpp
+ i2p_tests.cpp
+ interfaces_tests.cpp
+ key_io_tests.cpp
+ key_tests.cpp
+ logging_tests.cpp
+ mempool_tests.cpp
+ merkle_tests.cpp
+ merkleblock_tests.cpp
+ miner_tests.cpp
+ miniminer_tests.cpp
+ miniscript_tests.cpp
+ minisketch_tests.cpp
+ multisig_tests.cpp
+ net_peer_connection_tests.cpp
+ net_peer_eviction_tests.cpp
+ net_tests.cpp
+ netbase_tests.cpp
+ node_warnings_tests.cpp
+ orphanage_tests.cpp
+ peerman_tests.cpp
+ pmt_tests.cpp
+ policy_fee_tests.cpp
+ policyestimator_tests.cpp
+ pool_tests.cpp
+ pow_tests.cpp
+ prevector_tests.cpp
+ raii_event_tests.cpp
+ random_tests.cpp
+ rbf_tests.cpp
+ rest_tests.cpp
+ result_tests.cpp
+ reverselock_tests.cpp
+ rpc_tests.cpp
+ sanity_tests.cpp
+ scheduler_tests.cpp
+ script_p2sh_tests.cpp
+ script_parse_tests.cpp
+ script_segwit_tests.cpp
+ script_standard_tests.cpp
+ script_tests.cpp
+ scriptnum_tests.cpp
+ serfloat_tests.cpp
+ serialize_tests.cpp
+ settings_tests.cpp
+ sighash_tests.cpp
+ sigopcount_tests.cpp
+ skiplist_tests.cpp
+ sock_tests.cpp
+ span_tests.cpp
+ streams_tests.cpp
+ sync_tests.cpp
+ system_tests.cpp
+ timeoffsets_tests.cpp
+ torcontrol_tests.cpp
+ transaction_tests.cpp
+ translation_tests.cpp
+ txindex_tests.cpp
+ txpackage_tests.cpp
+ txreconciliation_tests.cpp
+ txrequest_tests.cpp
+ txvalidation_tests.cpp
+ txvalidationcache_tests.cpp
+ uint256_tests.cpp
+ util_string_tests.cpp
+ util_tests.cpp
+ util_threadnames_tests.cpp
+ validation_block_tests.cpp
+ validation_chainstate_tests.cpp
+ validation_chainstatemanager_tests.cpp
+ validation_flush_tests.cpp
+ validation_tests.cpp
+ validationinterface_tests.cpp
+ versionbits_tests.cpp
+)
+
+target_link_libraries(test_bitcoin
+ core_interface
+ test_util
+ bitcoin_cli
+ bitcoin_node
+ minisketch
+ secp256k1
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:libevent::libevent>
+)
+
+if(ENABLE_WALLET)
+ add_subdirectory(${PROJECT_SOURCE_DIR}/src/wallet/test wallet)
+endif()
+
+if(WITH_MULTIPROCESS)
+ target_link_libraries(bitcoin_ipc_test
+ PRIVATE
+ core_interface
+ univalue
+ )
+
+ target_sources(test_bitcoin
+ PRIVATE
+ ipc_tests.cpp
+ )
+ target_link_libraries(test_bitcoin bitcoin_ipc_test bitcoin_ipc)
+endif()
+
+function(add_boost_test source_file)
+ if(NOT EXISTS ${source_file})
+ return()
+ endif()
+
+ file(READ "${source_file}" source_file_content)
+ string(REGEX
+ MATCH "(BOOST_FIXTURE_TEST_SUITE|BOOST_AUTO_TEST_SUITE)\\(([A-Za-z0-9_]+)"
+ test_suite_macro "${source_file_content}"
+ )
+ string(REGEX
+ REPLACE "(BOOST_FIXTURE_TEST_SUITE|BOOST_AUTO_TEST_SUITE)\\(" ""
+ test_suite_name "${test_suite_macro}"
+ )
+ if(test_suite_name)
+ add_test(NAME ${test_suite_name}
+ COMMAND test_bitcoin --run_test=${test_suite_name} --catch_system_error=no --log_level=test_suite -- DEBUG_LOG_OUT
+ )
+ set_property(TEST ${test_suite_name} PROPERTY
+ SKIP_REGULAR_EXPRESSION "no test cases matching filter"
+ )
+ endif()
+endfunction()
+
+function(add_all_test_targets)
+ get_target_property(test_source_dir test_bitcoin SOURCE_DIR)
+ get_target_property(test_sources test_bitcoin SOURCES)
+ foreach(test_source ${test_sources})
+ cmake_path(IS_RELATIVE test_source result)
+ if(result)
+ cmake_path(APPEND test_source_dir ${test_source} OUTPUT_VARIABLE test_source)
+ endif()
+ add_boost_test(${test_source})
+ endforeach()
+endfunction()
+
+add_all_test_targets()
+
+install(TARGETS test_bitcoin
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
diff --git a/src/test/Makefile b/src/test/Makefile
deleted file mode 100644
index 87bf73fec9..0000000000
--- a/src/test/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-all:
- $(MAKE) -C .. bitcoin_test
-clean:
- $(MAKE) -C .. bitcoin_test_clean
-check:
- $(MAKE) -C .. bitcoin_test_check
diff --git a/src/test/README.md b/src/test/README.md
index bab1a28f61..7e0f245ee8 100644
--- a/src/test/README.md
+++ b/src/test/README.md
@@ -10,59 +10,76 @@ The build system is set up to compile an executable called `test_bitcoin`
that runs all of the unit tests. The main source file for the test library is found in
`util/setup_common.cpp`.
+The examples in this document assume the build directory is named
+`build`. You'll need to adapt them if you named it differently.
+
### Compiling/running unit tests
-Unit tests will be automatically compiled if dependencies were met in `./configure`
+Unit tests will be automatically compiled if dependencies were met
+during the generation of the Bitcoin Core build system
and tests weren't explicitly disabled.
-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.
+The unit tests can be run with `ctest --test-dir build`, which includes unit
+tests from subtrees.
+
+Run `test_bitcoin --list_content` for the full list of 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
-modify a non-test file, use `make -C src/test` to recompile only what's needed
+To run the unit tests manually, launch `build/src/test/test_bitcoin`. To recompile
+after a test file was modified, run `cmake --build build` and then run the test again. If you
+modify a non-test file, use `cmake --build build --target test_bitcoin` to recompile only what's needed
to run the unit tests.
To add more unit tests, add `BOOST_AUTO_TEST_CASE` functions to the existing
.cpp files in the `test/` directory or add new .cpp files that
implement new `BOOST_AUTO_TEST_SUITE` sections.
-To run the GUI unit tests manually, launch `src/qt/test/test_bitcoin-qt`
+To run the GUI unit tests manually, launch `build/src/qt/test/test_bitcoin-qt`
To add more GUI unit tests, add them to the `src/qt/test/` directory and
the `src/qt/test/test_main.cpp` file.
### Running individual tests
-`test_bitcoin` accepts the command line arguments from the boost framework.
-For example, to run just the `getarg_tests` suite of tests:
+The `test_bitcoin` runner accepts command line arguments from the Boost
+framework. To see the list of arguments that may be passed, run:
+
+```
+test_bitcoin --help
+```
+
+For example, to run only the tests in the `getarg_tests` file, with full logging:
```bash
-test_bitcoin --log_level=all --run_test=getarg_tests
+build/src/test/test_bitcoin --log_level=all --run_test=getarg_tests
```
-`log_level` controls the verbosity of the test framework, which logs when a
-test case is entered, for example.
+or
-`test_bitcoin` also accepts some of the command line arguments accepted by
-`bitcoind`. Use `--` to separate these sets of arguments:
+```bash
+build/src/test/test_bitcoin -l all -t getarg_tests
+```
+
+or to run only the doubledash test in `getarg_tests`
```bash
-test_bitcoin --log_level=all --run_test=getarg_tests -- -printtoconsole=1
+build/src/test/test_bitcoin --run_test=getarg_tests/doubledash
```
-The `-printtoconsole=1` after the two dashes sends debug logging, which
-normally goes only to `debug.log` within the data directory, also to the
-standard terminal output.
+The `--log_level=` (or `-l`) argument controls the verbosity of the test output.
-... or to run just the doubledash test:
+The `test_bitcoin` runner also accepts some of the command line arguments accepted by
+`bitcoind`. Use `--` to separate these sets of arguments:
```bash
-test_bitcoin --run_test=getarg_tests/doubledash
+build/src/test/test_bitcoin --log_level=all --run_test=getarg_tests -- -printtoconsole=1
```
-`test_bitcoin` creates a temporary working (data) directory with a randomly
-generated pathname within `test_common_Bitcoin Core/`, which in turn is within
+The `-printtoconsole=1` after the two dashes sends debug logging, which
+normally goes only to `debug.log` within the data directory, to the
+standard terminal output as well.
+
+Running `test_bitcoin` creates a temporary working (data) directory with a randomly
+generated pathname within `test_common bitcoin/`, which in turn is within
the system's temporary directory (see
[`temp_directory_path`](https://en.cppreference.com/w/cpp/filesystem/temp_directory_path)).
This data directory looks like a simplified form of the standard `bitcoind` data
@@ -72,7 +89,7 @@ have a `debug.log` file, for example.
The location of the temporary data directory can be specified with the
`-testdatadir` option. This can make debugging easier. The directory
path used is the argument path appended with
-`/test_common_Bitcoin Core/<test-name>/datadir`.
+`/test_common bitcoin/<test-name>/datadir`.
The directory path is created if necessary.
Specifying this argument also causes the data directory
not to be removed after the last test. This is useful for looking at
@@ -81,12 +98,12 @@ what the test wrote to `debug.log` after it completes, for example.
so no leftover state is used.)
```bash
-$ test_bitcoin --run_test=getarg_tests/doubledash -- -testdatadir=/somewhere/mydatadir
-Test directory (will not be deleted): "/somewhere/mydatadir/test_common_Bitcoin Core/getarg_tests/doubledash/datadir
+$ build/src/test/test_bitcoin --run_test=getarg_tests/doubledash -- -testdatadir=/somewhere/mydatadir
+Test directory (will not be deleted): "/somewhere/mydatadir/test_common bitcoin/getarg_tests/doubledash/datadir"
Running 1 test case...
*** No errors detected
-$ ls -l '/somewhere/mydatadir/test_common_Bitcoin Core/getarg_tests/doubledash/datadir'
+$ ls -l '/somewhere/mydatadir/test_common bitcoin/getarg_tests/doubledash/datadir'
total 8
drwxrwxr-x 2 admin admin 4096 Nov 27 22:45 blocks
-rw-rw-r-- 1 admin admin 1003 Nov 27 22:45 debug.log
@@ -96,12 +113,11 @@ If you run an entire test suite, such as `--run_test=getarg_tests`, or all the t
(by not specifying `--run_test`), a separate directory
will be created for each individual test.
-Run `test_bitcoin --help` for the full list of tests.
-
### Adding test cases
-To add a new unit test file to our test suite you need
-to add the file to `src/Makefile.test.include`. The pattern is to create
+To add a new unit test file to our test suite, you need
+to add the file to either `src/test/CMakeLists.txt` or
+`src/wallet/test/CMakeLists.txt` for wallet-related tests. The pattern is to create
one test file for each class or source file for which you want to create
unit tests. The file naming convention is `<source_filename>_tests.cpp`
and such files should wrap their tests in a test suite
@@ -110,7 +126,8 @@ see `uint256_tests.cpp`.
### Logging and debugging in unit tests
-`make check` will write to a log file `foo_tests.cpp.log` and display this file
+`ctest --test-dir build` will write to the log file `build/Testing/Temporary/LastTest.log`. You can
+additionally use the `--output-on-failure` option to display logs of the failed tests automatically
on failure. For running individual tests verbosely, refer to the section
[above](#running-individual-tests).
@@ -121,13 +138,13 @@ For debugging you can launch the `test_bitcoin` executable with `gdb` or `lldb`
start debugging, just like you would with any other program:
```bash
-gdb src/test/test_bitcoin
+gdb build/src/test/test_bitcoin
```
#### Segmentation faults
If you hit a segmentation fault during a test run, you can diagnose where the fault
-is happening by running `gdb ./src/test/test_bitcoin` and then using the `bt` command
+is happening by running `gdb ./build/src/test/test_bitcoin` and then using the `bt` command
within gdb.
Another tool that can be used to resolve segmentation faults is
@@ -145,7 +162,7 @@ Running the tests and hitting a segmentation fault should now produce a file cal
You can then explore the core dump using
```bash
-gdb src/test/test_bitcoin core
+gdb build/src/test/test_bitcoin core
-(gbd) bt # produce a backtrace for where a segfault occurred
+(gdb) bt # produce a backtrace for where a segfault occurred
```
diff --git a/src/test/addrman_tests.cpp b/src/test/addrman_tests.cpp
index e5d25637bd..c4f58ebecf 100644
--- a/src/test/addrman_tests.cpp
+++ b/src/test/addrman_tests.cpp
@@ -47,11 +47,12 @@ static CService ResolveService(const std::string& ip, uint16_t port = 0)
}
-static std::vector<bool> FromBytes(const unsigned char* source, int vector_size)
+static std::vector<bool> FromBytes(std::span<const std::byte> source)
{
+ int vector_size(source.size() * 8);
std::vector<bool> result(vector_size);
for (int byte_i = 0; byte_i < vector_size / 8; ++byte_i) {
- unsigned char cur_byte = source[byte_i];
+ uint8_t cur_byte{std::to_integer<uint8_t>(source[byte_i])};
for (int bit_i = 0; bit_i < 8; ++bit_i) {
result[byte_i * 8 + bit_i] = (cur_byte >> bit_i) & 1;
}
@@ -195,21 +196,21 @@ BOOST_AUTO_TEST_CASE(addrman_select)
BOOST_AUTO_TEST_CASE(addrman_select_by_network)
{
auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node));
- BOOST_CHECK(!addrman->Select(/*new_only=*/true, NET_IPV4).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_IPV4).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/true, {NET_IPV4}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_IPV4}).first.IsValid());
// add ipv4 address to the new table
CNetAddr source = ResolveIP("252.2.2.2");
CService addr1 = ResolveService("250.1.1.1", 8333);
BOOST_CHECK(addrman->Add({CAddress(addr1, NODE_NONE)}, source));
- BOOST_CHECK(addrman->Select(/*new_only=*/true, NET_IPV4).first == addr1);
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_IPV4).first == addr1);
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_IPV6).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_ONION).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_I2P).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_CJDNS).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/true, NET_CJDNS).first.IsValid());
+ BOOST_CHECK(addrman->Select(/*new_only=*/true, {NET_IPV4}).first == addr1);
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_IPV4}).first == addr1);
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_IPV6}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_ONION}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_I2P}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_CJDNS}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/true, {NET_CJDNS}).first.IsValid());
BOOST_CHECK(addrman->Select(/*new_only=*/false).first == addr1);
// add I2P address to the new table
@@ -217,25 +218,29 @@ BOOST_AUTO_TEST_CASE(addrman_select_by_network)
i2p_addr.SetSpecial("udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p");
BOOST_CHECK(addrman->Add({i2p_addr}, source));
- BOOST_CHECK(addrman->Select(/*new_only=*/true, NET_I2P).first == i2p_addr);
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_I2P).first == i2p_addr);
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_IPV4).first == addr1);
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_IPV6).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_ONION).first.IsValid());
- BOOST_CHECK(!addrman->Select(/*new_only=*/false, NET_CJDNS).first.IsValid());
+ BOOST_CHECK(addrman->Select(/*new_only=*/true, {NET_I2P}).first == i2p_addr);
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_I2P}).first == i2p_addr);
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_IPV4}).first == addr1);
+ std::unordered_set<Network> nets_with_entries = {NET_IPV4, NET_I2P};
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, nets_with_entries).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_IPV6}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_ONION}).first.IsValid());
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, {NET_CJDNS}).first.IsValid());
+ std::unordered_set<Network> nets_without_entries = {NET_IPV6, NET_ONION, NET_CJDNS};
+ BOOST_CHECK(!addrman->Select(/*new_only=*/false, nets_without_entries).first.IsValid());
// bump I2P address to tried table
BOOST_CHECK(addrman->Good(i2p_addr));
- BOOST_CHECK(!addrman->Select(/*new_only=*/true, NET_I2P).first.IsValid());
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_I2P).first == i2p_addr);
+ BOOST_CHECK(!addrman->Select(/*new_only=*/true, {NET_I2P}).first.IsValid());
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_I2P}).first == i2p_addr);
// add another I2P address to the new table
CAddress i2p_addr2;
i2p_addr2.SetSpecial("c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p");
BOOST_CHECK(addrman->Add({i2p_addr2}, source));
- BOOST_CHECK(addrman->Select(/*new_only=*/true, NET_I2P).first == i2p_addr2);
+ BOOST_CHECK(addrman->Select(/*new_only=*/true, {NET_I2P}).first == i2p_addr2);
// ensure that both new and tried table are selected from
bool new_selected{false};
@@ -243,7 +248,7 @@ BOOST_AUTO_TEST_CASE(addrman_select_by_network)
int counter = 256;
while (--counter > 0 && (!new_selected || !tried_selected)) {
- const CAddress selected{addrman->Select(/*new_only=*/false, NET_I2P).first};
+ const CAddress selected{addrman->Select(/*new_only=*/false, {NET_I2P}).first};
BOOST_REQUIRE(selected == i2p_addr || selected == i2p_addr2);
if (selected == i2p_addr) {
tried_selected = true;
@@ -276,7 +281,7 @@ BOOST_AUTO_TEST_CASE(addrman_select_special)
// since the only ipv4 address is on the new table, ensure that the new
// table gets selected even if new_only is false. if the table was being
// selected at random, this test will sporadically fail
- BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_IPV4).first == addr1);
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, {NET_IPV4}).first == addr1);
}
BOOST_AUTO_TEST_CASE(addrman_new_collisions)
@@ -576,7 +581,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket_legacy)
// 101.8.0.0/16 AS8
BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
{
- std::vector<bool> asmap = FromBytes(asmap_raw, sizeof(asmap_raw) * 8);
+ std::vector<bool> asmap = FromBytes(test::data::asmap);
NetGroupManager ngm_asmap{asmap};
CAddress addr1 = CAddress(ResolveService("250.1.1.1", 8333), NODE_NONE);
@@ -630,7 +635,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
{
- std::vector<bool> asmap = FromBytes(asmap_raw, sizeof(asmap_raw) * 8);
+ std::vector<bool> asmap = FromBytes(test::data::asmap);
NetGroupManager ngm_asmap{asmap};
CAddress addr1 = CAddress(ResolveService("250.1.2.1", 8333), NODE_NONE);
@@ -708,7 +713,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
BOOST_AUTO_TEST_CASE(addrman_serialization)
{
- std::vector<bool> asmap1 = FromBytes(asmap_raw, sizeof(asmap_raw) * 8);
+ std::vector<bool> asmap1 = FromBytes(test::data::asmap);
NetGroupManager netgroupman{asmap1};
const auto ratio = GetCheckRatio(m_node);
diff --git a/src/test/argsman_tests.cpp b/src/test/argsman_tests.cpp
index 5f0318e8c4..297595a9cf 100644
--- a/src/test/argsman_tests.cpp
+++ b/src/test/argsman_tests.cpp
@@ -644,10 +644,12 @@ BOOST_AUTO_TEST_CASE(util_GetChainTypeString)
{
TestArgsManager test_args;
const auto testnet = std::make_pair("-testnet", ArgsManager::ALLOW_ANY);
+ const auto testnet4 = std::make_pair("-testnet4", ArgsManager::ALLOW_ANY);
const auto regtest = std::make_pair("-regtest", ArgsManager::ALLOW_ANY);
- test_args.SetupArgs({testnet, regtest});
+ test_args.SetupArgs({testnet, testnet4, regtest});
const char* argv_testnet[] = {"cmd", "-testnet"};
+ const char* argv_testnet4[] = {"cmd", "-testnet4"};
const char* argv_regtest[] = {"cmd", "-regtest"};
const char* argv_test_no_reg[] = {"cmd", "-testnet", "-noregtest"};
const char* argv_both[] = {"cmd", "-testnet", "-regtest"};
@@ -663,6 +665,12 @@ BOOST_AUTO_TEST_CASE(util_GetChainTypeString)
BOOST_CHECK(test_args.ParseParameters(2, argv_testnet, error));
BOOST_CHECK_EQUAL(test_args.GetChainTypeString(), "test");
+ BOOST_CHECK(test_args.ParseParameters(0, argv_testnet4, error));
+ BOOST_CHECK_EQUAL(test_args.GetChainTypeString(), "main");
+
+ BOOST_CHECK(test_args.ParseParameters(2, argv_testnet4, error));
+ BOOST_CHECK_EQUAL(test_args.GetChainTypeString(), "testnet4");
+
BOOST_CHECK(test_args.ParseParameters(2, argv_regtest, error));
BOOST_CHECK_EQUAL(test_args.GetChainTypeString(), "regtest");
@@ -758,8 +766,8 @@ struct ArgsMergeTestingSetup : public BasicTestingSetup {
ForEachNoDup(conf_actions, SET, SECTION_NEGATE, [&] {
for (bool soft_set : {false, true}) {
for (bool force_set : {false, true}) {
- for (const std::string& section : {ChainTypeToString(ChainType::MAIN), ChainTypeToString(ChainType::TESTNET), ChainTypeToString(ChainType::SIGNET)}) {
- for (const std::string& network : {ChainTypeToString(ChainType::MAIN), ChainTypeToString(ChainType::TESTNET), ChainTypeToString(ChainType::SIGNET)}) {
+ for (const std::string& section : {ChainTypeToString(ChainType::MAIN), ChainTypeToString(ChainType::TESTNET), ChainTypeToString(ChainType::TESTNET4), ChainTypeToString(ChainType::SIGNET)}) {
+ for (const std::string& network : {ChainTypeToString(ChainType::MAIN), ChainTypeToString(ChainType::TESTNET), ChainTypeToString(ChainType::TESTNET4), ChainTypeToString(ChainType::SIGNET)}) {
for (bool net_specific : {false, true}) {
fn(arg_actions, conf_actions, soft_set, force_set, section, network, net_specific);
}
@@ -913,7 +921,7 @@ BOOST_FIXTURE_TEST_CASE(util_ArgsMerge, ArgsMergeTestingSetup)
// Results file is formatted like:
//
// <input> || <IsArgSet/IsArgNegated/GetArg output> | <GetArgs output> | <GetUnsuitable output>
- BOOST_CHECK_EQUAL(out_sha_hex, "d1e436c1cd510d0ec44d5205d4b4e3bee6387d316e0075c58206cb16603f3d82");
+ BOOST_CHECK_EQUAL(out_sha_hex, "f1ee5ab094cc43d16a6086fa7f2c10389e0f99902616b31bbf29189972ad1473");
}
// Similar test as above, but for ArgsManager::GetChainTypeString function.
@@ -1016,7 +1024,7 @@ BOOST_FIXTURE_TEST_CASE(util_ChainMerge, ChainMergeTestingSetup)
// Results file is formatted like:
//
// <input> || <output>
- BOOST_CHECK_EQUAL(out_sha_hex, "f263493e300023b6509963887444c41386f44b63bc30047eb8402e8c1144854c");
+ BOOST_CHECK_EQUAL(out_sha_hex, "9e60306e1363528bbc19a47f22bcede88e5d6815212f18ec8e6cdc4638dddab4");
}
BOOST_AUTO_TEST_CASE(util_ReadWriteSettings)
diff --git a/src/test/arith_uint256_tests.cpp b/src/test/arith_uint256_tests.cpp
index 10028c7c93..37a39adb9c 100644
--- a/src/test/arith_uint256_tests.cpp
+++ b/src/test/arith_uint256_tests.cpp
@@ -3,6 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <arith_uint256.h>
+#include <test/util/setup_common.h>
#include <uint256.h>
#include <boost/test/unit_test.hpp>
@@ -22,8 +23,6 @@ static inline arith_uint256 arith_uint256V(const std::vector<unsigned char>& vch
{
return UintToArith256(uint256(vch));
}
-static inline arith_uint256 arith_uint256S(const std::string& str) { return UintToArith256(uint256S(str)); }
-
const unsigned char R1Array[] =
"\x9c\x52\x4a\xdb\xcf\x56\x11\x12\x2b\x29\x12\x5e\x5d\x35\xd2\xd2"
"\x22\x81\xaa\xb5\x33\xf0\x08\x32\xd5\x56\xb1\xf9\xea\xe5\x1d\x7d";
@@ -37,8 +36,6 @@ const unsigned char R2Array[] =
"\x13\x30\x47\xa3\x19\x2d\xda\x71\x49\x13\x72\xf0\xb4\xca\x81\xd7";
const arith_uint256 R2L = arith_uint256V(std::vector<unsigned char>(R2Array,R2Array+32));
-const char R1LplusR2L[] = "549FB09FEA236A1EA3E31D4D58F1B1369288D204211CA751527CFC175767850C";
-
const unsigned char ZeroArray[] =
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
@@ -95,26 +92,25 @@ BOOST_AUTO_TEST_CASE( basics ) // constructors, equality, inequality
}
BOOST_CHECK(ZeroL == (OneL << 256));
- // String Constructor and Copy Constructor
- BOOST_CHECK(arith_uint256S("0x" + R1L.ToString()) == R1L);
- BOOST_CHECK(arith_uint256S("0x" + R2L.ToString()) == R2L);
- BOOST_CHECK(arith_uint256S("0x" + ZeroL.ToString()) == ZeroL);
- BOOST_CHECK(arith_uint256S("0x" + OneL.ToString()) == OneL);
- BOOST_CHECK(arith_uint256S("0x" + MaxL.ToString()) == MaxL);
- BOOST_CHECK(arith_uint256S(R1L.ToString()) == R1L);
- BOOST_CHECK(arith_uint256S(" 0x" + R1L.ToString() + " ") == R1L);
- BOOST_CHECK(arith_uint256S("") == ZeroL);
- BOOST_CHECK(R1L == arith_uint256S(R1ArrayHex));
+ // Construct from hex string
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(R1L.ToString()).value()), R1L);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(R2L.ToString()).value()), R2L);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(ZeroL.ToString()).value()), ZeroL);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(OneL.ToString()).value()), OneL);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(MaxL.ToString()).value()), MaxL);
+ BOOST_CHECK_EQUAL(UintToArith256(uint256::FromHex(R1ArrayHex).value()), R1L);
+
+ // Copy constructor
BOOST_CHECK(arith_uint256(R1L) == R1L);
BOOST_CHECK((arith_uint256(R1L^R2L)^R2L) == R1L);
BOOST_CHECK(arith_uint256(ZeroL) == ZeroL);
BOOST_CHECK(arith_uint256(OneL) == OneL);
// uint64_t constructor
- BOOST_CHECK((R1L & arith_uint256S("0xffffffffffffffff")) == arith_uint256(R1LLow64));
- BOOST_CHECK(ZeroL == arith_uint256(0));
- BOOST_CHECK(OneL == arith_uint256(1));
- BOOST_CHECK(arith_uint256S("0xffffffffffffffff") == arith_uint256(0xffffffffffffffffULL));
+ BOOST_CHECK_EQUAL(R1L & arith_uint256{0xffffffffffffffff}, arith_uint256{R1LLow64});
+ BOOST_CHECK_EQUAL(ZeroL, arith_uint256{0});
+ BOOST_CHECK_EQUAL(OneL, arith_uint256{1});
+ BOOST_CHECK_EQUAL(arith_uint256{0xffffffffffffffff}, arith_uint256{0xffffffffffffffffULL});
// Assignment (from base_uint)
arith_uint256 tmpL = ~ZeroL; BOOST_CHECK(tmpL == ~ZeroL);
@@ -278,12 +274,15 @@ BOOST_AUTO_TEST_CASE( comparison ) // <= >= < >
BOOST_CHECK( R1L <= TmpL ); BOOST_CHECK( (R1L == TmpL) != (R1L < TmpL)); BOOST_CHECK( (TmpL == R1L) || !( R1L >= TmpL));
BOOST_CHECK(! (TmpL < R1L)); BOOST_CHECK(! (R1L > TmpL));
}
+
+ BOOST_CHECK_LT(ZeroL,
+ OneL);
}
BOOST_AUTO_TEST_CASE( plusMinus )
{
arith_uint256 TmpL = 0;
- BOOST_CHECK(R1L + R2L == arith_uint256S(R1LplusR2L));
+ BOOST_CHECK_EQUAL(R1L + R2L, UintToArith256(uint256{"549fb09fea236a1ea3e31d4d58f1b1369288d204211ca751527cfc175767850c"}));
TmpL += R1L;
BOOST_CHECK(TmpL == R1L);
TmpL += R2L;
@@ -347,8 +346,8 @@ BOOST_AUTO_TEST_CASE( multiply )
BOOST_AUTO_TEST_CASE( divide )
{
- arith_uint256 D1L{arith_uint256S("AD7133AC1977FA2B7")};
- arith_uint256 D2L{arith_uint256S("ECD751716")};
+ arith_uint256 D1L{UintToArith256(uint256{"00000000000000000000000000000000000000000000000ad7133ac1977fa2b7"})};
+ arith_uint256 D2L{UintToArith256(uint256{"0000000000000000000000000000000000000000000000000000000ecd751716"})};
BOOST_CHECK((R1L / D1L).ToString() == "00000000000000000b8ac01106981635d9ed112290f8895545a7654dde28fb3a");
BOOST_CHECK((R1L / D2L).ToString() == "000000000873ce8efec5b67150bad3aa8c5fcb70e947586153bf2cec7c37c57a");
BOOST_CHECK(R1L / OneL == R1L);
@@ -562,4 +561,51 @@ BOOST_AUTO_TEST_CASE( getmaxcoverage ) // some more tests just to get 100% cover
CHECKBITWISEOPERATOR(R1,~R2,&)
}
+BOOST_AUTO_TEST_CASE(conversion)
+{
+ for (const arith_uint256& arith : {ZeroL, OneL, R1L, R2L}) {
+ const auto u256{uint256::FromHex(arith.GetHex()).value()};
+ BOOST_CHECK_EQUAL(UintToArith256(ArithToUint256(arith)), arith);
+ BOOST_CHECK_EQUAL(UintToArith256(u256), arith);
+ BOOST_CHECK_EQUAL(u256, ArithToUint256(arith));
+ BOOST_CHECK_EQUAL(ArithToUint256(arith).GetHex(), UintToArith256(u256).GetHex());
+ }
+
+ for (uint8_t num : {0, 1, 0xff}) {
+ BOOST_CHECK_EQUAL(UintToArith256(uint256{num}), arith_uint256{num});
+ BOOST_CHECK_EQUAL(uint256{num}, ArithToUint256(arith_uint256{num}));
+ BOOST_CHECK_EQUAL(UintToArith256(uint256{num}), num);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(operator_with_self)
+{
+ /* Clang 16 and earlier detects v -= v and v /= v as self-assignments
+ to 0 and 1 respectively.
+ See: https://github.com/llvm/llvm-project/issues/42469
+ and the fix in commit c5302325b2a62d77cf13dd16cd5c19141862fed0 .
+
+ This makes some sense for arithmetic classes, but could be considered a bug
+ elsewhere. Disable the warning here so that the code can be tested, but the
+ warning should remain on as there will likely always be a better way to
+ express this.
+ */
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wself-assign-overloaded"
+#endif
+ arith_uint256 v{2};
+ v *= v;
+ BOOST_CHECK_EQUAL(v, arith_uint256{4});
+ v /= v;
+ BOOST_CHECK_EQUAL(v, arith_uint256{1});
+ v += v;
+ BOOST_CHECK_EQUAL(v, arith_uint256{2});
+ v -= v;
+ BOOST_CHECK_EQUAL(v, arith_uint256{0});
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/base32_tests.cpp b/src/test/base32_tests.cpp
index 4617beecd9..be3b0c2d1f 100644
--- a/src/test/base32_tests.cpp
+++ b/src/test/base32_tests.cpp
@@ -5,6 +5,8 @@
#include <util/strencodings.h>
#include <boost/test/unit_test.hpp>
+
+#include <algorithm>
#include <string>
using namespace std::literals;
@@ -24,7 +26,7 @@ BOOST_AUTO_TEST_CASE(base32_testvectors)
BOOST_CHECK_EQUAL(strEnc, vstrOutNoPadding[i]);
auto dec = DecodeBase32(vstrOut[i]);
BOOST_REQUIRE(dec);
- BOOST_CHECK_MESSAGE(MakeByteSpan(*dec) == MakeByteSpan(vstrIn[i]), vstrOut[i]);
+ BOOST_CHECK_MESSAGE(std::ranges::equal(*dec, vstrIn[i]), vstrOut[i]);
}
// Decoding strings with embedded NUL characters should fail
diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp
index bb3defb93e..5e97c9f4d6 100644
--- a/src/test/base58_tests.cpp
+++ b/src/test/base58_tests.cpp
@@ -17,6 +17,7 @@
#include <string>
using namespace std::literals;
+using namespace util::hex_literals;
BOOST_FIXTURE_TEST_SUITE(base58_tests, BasicTestingSetup)
@@ -72,7 +73,7 @@ BOOST_AUTO_TEST_CASE(base58_DecodeBase58)
// check that DecodeBase58 skips whitespace, but still fails with unexpected non-whitespace at the end.
BOOST_CHECK(!DecodeBase58(" \t\n\v\f\r skip \r\f\v\n\t a", result, 3));
BOOST_CHECK( DecodeBase58(" \t\n\v\f\r skip \r\f\v\n\t ", result, 3));
- std::vector<unsigned char> expected = ParseHex("971a55");
+ constexpr auto expected{"971a55"_hex_u8};
BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
BOOST_CHECK(DecodeBase58Check("3vQB7B6MrGQZaxCuFg4oh"s, result, 100));
@@ -84,14 +85,14 @@ BOOST_AUTO_TEST_CASE(base58_DecodeBase58)
BOOST_AUTO_TEST_CASE(base58_random_encode_decode)
{
for (int n = 0; n < 1000; ++n) {
- unsigned int len = 1 + InsecureRandBits(8);
- unsigned int zeroes = InsecureRandBool() ? InsecureRandRange(len + 1) : 0;
- auto data = Cat(std::vector<unsigned char>(zeroes, '\000'), g_insecure_rand_ctx.randbytes(len - zeroes));
+ unsigned int len = 1 + m_rng.randbits(8);
+ unsigned int zeroes = m_rng.randbool() ? m_rng.randrange(len + 1) : 0;
+ auto data = Cat(std::vector<unsigned char>(zeroes, '\000'), m_rng.randbytes(len - zeroes));
auto encoded = EncodeBase58Check(data);
std::vector<unsigned char> decoded;
- auto ok_too_small = DecodeBase58Check(encoded, decoded, InsecureRandRange(len));
+ auto ok_too_small = DecodeBase58Check(encoded, decoded, m_rng.randrange(len));
BOOST_CHECK(!ok_too_small);
- auto ok = DecodeBase58Check(encoded, decoded, len + InsecureRandRange(257 - len));
+ auto ok = DecodeBase58Check(encoded, decoded, len + m_rng.randrange(257 - len));
BOOST_CHECK(ok);
BOOST_CHECK(data == decoded);
}
diff --git a/src/test/base64_tests.cpp b/src/test/base64_tests.cpp
index 6462aa82fb..b9d0d2b241 100644
--- a/src/test/base64_tests.cpp
+++ b/src/test/base64_tests.cpp
@@ -5,6 +5,8 @@
#include <util/strencodings.h>
#include <boost/test/unit_test.hpp>
+
+#include <algorithm>
#include <string>
using namespace std::literals;
@@ -21,7 +23,7 @@ BOOST_AUTO_TEST_CASE(base64_testvectors)
BOOST_CHECK_EQUAL(strEnc, vstrOut[i]);
auto dec = DecodeBase64(strEnc);
BOOST_REQUIRE(dec);
- BOOST_CHECK_MESSAGE(MakeByteSpan(*dec) == MakeByteSpan(vstrIn[i]), vstrOut[i]);
+ BOOST_CHECK_MESSAGE(std::ranges::equal(*dec, vstrIn[i]), vstrOut[i]);
}
{
diff --git a/src/test/bip324_tests.cpp b/src/test/bip324_tests.cpp
index 1ed7e23bcf..adabb7ef57 100644
--- a/src/test/bip324_tests.cpp
+++ b/src/test/bip324_tests.cpp
@@ -11,6 +11,7 @@
#include <test/util/setup_common.h>
#include <util/strencodings.h>
+#include <algorithm>
#include <array>
#include <cstddef>
#include <cstdint>
@@ -20,6 +21,7 @@
namespace {
+struct BIP324Test : BasicTestingSetup {
void TestBIP324PacketVector(
uint32_t in_idx,
const std::string& in_priv_ours_hex,
@@ -62,9 +64,9 @@ void TestBIP324PacketVector(
BOOST_CHECK(cipher);
// Compare session variables.
- BOOST_CHECK(Span{out_session_id} == cipher.GetSessionID());
- BOOST_CHECK(Span{mid_send_garbage} == cipher.GetSendGarbageTerminator());
- BOOST_CHECK(Span{mid_recv_garbage} == cipher.GetReceiveGarbageTerminator());
+ BOOST_CHECK(std::ranges::equal(out_session_id, cipher.GetSessionID()));
+ BOOST_CHECK(std::ranges::equal(mid_send_garbage, cipher.GetSendGarbageTerminator()));
+ BOOST_CHECK(std::ranges::equal(mid_recv_garbage, cipher.GetReceiveGarbageTerminator()));
// Vector of encrypted empty messages, encrypted in order to seek to the right position.
std::vector<std::vector<std::byte>> dummies(in_idx);
@@ -89,7 +91,7 @@ void TestBIP324PacketVector(
BOOST_CHECK(out_ciphertext == ciphertext);
} else {
BOOST_CHECK(ciphertext.size() >= out_ciphertext_endswith.size());
- BOOST_CHECK(Span{out_ciphertext_endswith} == Span{ciphertext}.last(out_ciphertext_endswith.size()));
+ BOOST_CHECK(std::ranges::equal(out_ciphertext_endswith, Span{ciphertext}.last(out_ciphertext_endswith.size())));
}
for (unsigned error = 0; error <= 12; ++error) {
@@ -109,13 +111,13 @@ void TestBIP324PacketVector(
BOOST_CHECK(dec_cipher);
// Compare session variables.
- BOOST_CHECK((Span{out_session_id} == dec_cipher.GetSessionID()) == (error != 1));
- BOOST_CHECK((Span{mid_send_garbage} == dec_cipher.GetSendGarbageTerminator()) == (error != 1));
- BOOST_CHECK((Span{mid_recv_garbage} == dec_cipher.GetReceiveGarbageTerminator()) == (error != 1));
+ BOOST_CHECK(std::ranges::equal(out_session_id, dec_cipher.GetSessionID()) == (error != 1));
+ BOOST_CHECK(std::ranges::equal(mid_send_garbage, dec_cipher.GetSendGarbageTerminator()) == (error != 1));
+ BOOST_CHECK(std::ranges::equal(mid_recv_garbage, dec_cipher.GetReceiveGarbageTerminator()) == (error != 1));
// Seek to the numbered packet.
if (in_idx == 0 && error == 12) continue;
- uint32_t dec_idx = in_idx ^ (error == 12 ? (1U << InsecureRandRange(16)) : 0);
+ uint32_t dec_idx = in_idx ^ (error == 12 ? (1U << m_rng.randrange(16)) : 0);
for (uint32_t i = 0; i < dec_idx; ++i) {
unsigned use_idx = i < in_idx ? i : 0;
bool dec_ignore{false};
@@ -127,7 +129,7 @@ void TestBIP324PacketVector(
// Decrypt length
auto to_decrypt = ciphertext;
if (error >= 2 && error <= 9) {
- to_decrypt[InsecureRandRange(to_decrypt.size())] ^= std::byte(1U << (error - 2));
+ to_decrypt[m_rng.randrange(to_decrypt.size())] ^= std::byte(1U << (error - 2));
}
// Decrypt length and resize ciphertext to accommodate.
@@ -138,7 +140,7 @@ void TestBIP324PacketVector(
auto dec_aad = in_aad;
if (error == 10) {
if (in_aad.size() == 0) continue;
- dec_aad[InsecureRandRange(dec_aad.size())] ^= std::byte(1U << InsecureRandRange(8));
+ dec_aad[m_rng.randrange(dec_aad.size())] ^= std::byte(1U << m_rng.randrange(8));
}
if (error == 11) dec_aad.push_back({});
@@ -155,10 +157,11 @@ void TestBIP324PacketVector(
}
}
}
+}; // struct BIP324Test
} // namespace
-BOOST_FIXTURE_TEST_SUITE(bip324_tests, BasicTestingSetup)
+BOOST_FIXTURE_TEST_SUITE(bip324_tests, BIP324Test)
BOOST_AUTO_TEST_CASE(packet_test_vectors) {
// BIP324 key derivation uses network magic in the HKDF process. We use mainnet params here
diff --git a/src/test/blockchain_tests.cpp b/src/test/blockchain_tests.cpp
index 9b8f419290..4ecc15041c 100644
--- a/src/test/blockchain_tests.cpp
+++ b/src/test/blockchain_tests.cpp
@@ -5,7 +5,9 @@
#include <boost/test/unit_test.hpp>
#include <chain.h>
+#include <node/blockstorage.h>
#include <rpc/blockchain.h>
+#include <sync.h>
#include <test/util/setup_common.h>
#include <util/string.h>
@@ -76,4 +78,43 @@ BOOST_AUTO_TEST_CASE(get_difficulty_for_very_high_target)
TestDifficulty(0x12345678, 5913134931067755359633408.0);
}
+//! Prune chain from height down to genesis block and check that
+//! GetPruneHeight returns the correct value
+static void CheckGetPruneHeight(node::BlockManager& blockman, CChain& chain, int height) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
+{
+ AssertLockHeld(::cs_main);
+
+ // Emulate pruning all blocks from `height` down to the genesis block
+ // by unsetting the `BLOCK_HAVE_DATA` flag from `nStatus`
+ for (CBlockIndex* it{chain[height]}; it != nullptr && it->nHeight > 0; it = it->pprev) {
+ it->nStatus &= ~BLOCK_HAVE_DATA;
+ }
+
+ const auto prune_height{GetPruneHeight(blockman, chain)};
+ BOOST_REQUIRE(prune_height.has_value());
+ BOOST_CHECK_EQUAL(*prune_height, height);
+}
+
+BOOST_FIXTURE_TEST_CASE(get_prune_height, TestChain100Setup)
+{
+ LOCK(::cs_main);
+ auto& chain = m_node.chainman->ActiveChain();
+ auto& blockman = m_node.chainman->m_blockman;
+
+ // Fresh chain of 100 blocks without any pruned blocks, so std::nullopt should be returned
+ BOOST_CHECK(!GetPruneHeight(blockman, chain).has_value());
+
+ // Start pruning
+ CheckGetPruneHeight(blockman, chain, 1);
+ CheckGetPruneHeight(blockman, chain, 99);
+ CheckGetPruneHeight(blockman, chain, 100);
+}
+
+BOOST_AUTO_TEST_CASE(num_chain_tx_max)
+{
+ CBlockIndex block_index{};
+ block_index.m_chain_tx_count = std::numeric_limits<uint64_t>::max();
+ BOOST_CHECK_EQUAL(block_index.m_chain_tx_count, std::numeric_limits<uint64_t>::max());
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/blockencodings_tests.cpp b/src/test/blockencodings_tests.cpp
index b0749c851c..3a33bdb7ec 100644
--- a/src/test/blockencodings_tests.cpp
+++ b/src/test/blockencodings_tests.cpp
@@ -356,7 +356,7 @@ BOOST_AUTO_TEST_CASE(ReceiveWithExtraTransactions) {
BOOST_AUTO_TEST_CASE(TransactionsRequestSerializationTest) {
BlockTransactionsRequest req1;
- req1.blockhash = InsecureRand256();
+ req1.blockhash = m_rng.rand256();
req1.indexes.resize(4);
req1.indexes[0] = 0;
req1.indexes[1] = 1;
@@ -380,7 +380,7 @@ BOOST_AUTO_TEST_CASE(TransactionsRequestSerializationTest) {
BOOST_AUTO_TEST_CASE(TransactionsRequestDeserializationMaxTest) {
// Check that the highest legal index is decoded correctly
BlockTransactionsRequest req0;
- req0.blockhash = InsecureRand256();
+ req0.blockhash = m_rng.rand256();
req0.indexes.resize(1);
req0.indexes[0] = 0xffff;
DataStream stream{};
@@ -398,7 +398,7 @@ BOOST_AUTO_TEST_CASE(TransactionsRequestDeserializationOverflowTest) {
// a request cannot be created by serializing a real BlockTransactionsRequest
// due to the overflow, so here we'll serialize from raw deltas.
BlockTransactionsRequest req0;
- req0.blockhash = InsecureRand256();
+ req0.blockhash = m_rng.rand256();
req0.indexes.resize(3);
req0.indexes[0] = 0x7000;
req0.indexes[1] = 0x10000 - 0x7000 - 2;
diff --git a/src/test/blockfilter_index_tests.cpp b/src/test/blockfilter_index_tests.cpp
index 067a32d6a4..f6024f1ef3 100644
--- a/src/test/blockfilter_index_tests.cpp
+++ b/src/test/blockfilter_index_tests.cpp
@@ -103,7 +103,7 @@ bool BuildChainTestingSetup::BuildChain(const CBlockIndex* pindex,
CBlockHeader header = block->GetBlockHeader();
BlockValidationState state;
- if (!Assert(m_node.chainman)->ProcessNewBlockHeaders({header}, true, state, &pindex)) {
+ if (!Assert(m_node.chainman)->ProcessNewBlockHeaders({{header}}, true, state, &pindex)) {
return false;
}
}
diff --git a/src/test/blockfilter_tests.cpp b/src/test/blockfilter_tests.cpp
index b372f25ea9..470fdde30a 100644
--- a/src/test/blockfilter_tests.cpp
+++ b/src/test/blockfilter_tests.cpp
@@ -149,8 +149,7 @@ BOOST_AUTO_TEST_CASE(blockfilters_json_test)
unsigned int pos = 0;
/*int block_height =*/ test[pos++].getInt<int>();
- uint256 block_hash;
- BOOST_CHECK(ParseHashStr(test[pos++].get_str(), block_hash));
+ BOOST_CHECK(uint256::FromHex(test[pos++].get_str()));
CBlock block;
BOOST_REQUIRE(DecodeHexBlk(block, test[pos++].get_str()));
@@ -165,11 +164,9 @@ BOOST_AUTO_TEST_CASE(blockfilters_json_test)
tx_undo.vprevout.emplace_back(txout, 0, false);
}
- uint256 prev_filter_header_basic;
- BOOST_CHECK(ParseHashStr(test[pos++].get_str(), prev_filter_header_basic));
+ uint256 prev_filter_header_basic{*Assert(uint256::FromHex(test[pos++].get_str()))};
std::vector<unsigned char> filter_basic = ParseHex(test[pos++].get_str());
- uint256 filter_header_basic;
- BOOST_CHECK(ParseHashStr(test[pos++].get_str(), filter_header_basic));
+ uint256 filter_header_basic{*Assert(uint256::FromHex(test[pos++].get_str()))};
BlockFilter computed_filter_basic(BlockFilterType::BASIC, block, block_undo);
BOOST_CHECK(computed_filter_basic.GetFilter().GetEncoded() == filter_basic);
diff --git a/src/test/blockmanager_tests.cpp b/src/test/blockmanager_tests.cpp
index 9eb7acc3ca..121f00bd25 100644
--- a/src/test/blockmanager_tests.cpp
+++ b/src/test/blockmanager_tests.cpp
@@ -2,6 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <chain.h>
#include <chainparams.h>
#include <clientversion.h>
#include <node/blockstorage.h>
@@ -113,7 +114,7 @@ BOOST_FIXTURE_TEST_CASE(blockmanager_block_data_availability, TestChain100Setup)
};
// 1) Return genesis block when all blocks are available
- BOOST_CHECK_EQUAL(blockman.GetFirstStoredBlock(tip), chainman->ActiveChain()[0]);
+ BOOST_CHECK_EQUAL(blockman.GetFirstBlock(tip, BLOCK_HAVE_DATA), chainman->ActiveChain()[0]);
BOOST_CHECK(blockman.CheckBlockDataAvailability(tip, *chainman->ActiveChain()[0]));
// 2) Check lower_block when all blocks are available
@@ -127,7 +128,7 @@ BOOST_FIXTURE_TEST_CASE(blockmanager_block_data_availability, TestChain100Setup)
func_prune_blocks(last_pruned_block);
// 3) The last block not pruned is in-between upper-block and the genesis block
- BOOST_CHECK_EQUAL(blockman.GetFirstStoredBlock(tip), first_available_block);
+ BOOST_CHECK_EQUAL(blockman.GetFirstBlock(tip, BLOCK_HAVE_DATA), first_available_block);
BOOST_CHECK(blockman.CheckBlockDataAvailability(tip, *first_available_block));
BOOST_CHECK(!blockman.CheckBlockDataAvailability(tip, *last_pruned_block));
}
diff --git a/src/test/bloom_tests.cpp b/src/test/bloom_tests.cpp
index cbf85277a8..1c732a8267 100644
--- a/src/test/bloom_tests.cpp
+++ b/src/test/bloom_tests.cpp
@@ -22,33 +22,39 @@
#include <boost/test/unit_test.hpp>
-BOOST_FIXTURE_TEST_SUITE(bloom_tests, BasicTestingSetup)
+using namespace util::hex_literals;
+
+namespace bloom_tests {
+struct BloomTest : public BasicTestingSetup {
+ std::vector<unsigned char> RandomData();
+};
+} // namespace bloom_tests
+
+BOOST_FIXTURE_TEST_SUITE(bloom_tests, BloomTest)
BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize)
{
CBloomFilter filter(3, 0.01, 0, BLOOM_UPDATE_ALL);
- BOOST_CHECK_MESSAGE( !filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter should be empty!");
- filter.insert(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8"));
- BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
+ BOOST_CHECK_MESSAGE( !filter.contains("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter should be empty!");
+ filter.insert("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8);
+ BOOST_CHECK_MESSAGE( filter.contains("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter doesn't contain just-inserted object!");
// One bit different in first byte
- BOOST_CHECK_MESSAGE(!filter.contains(ParseHex("19108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter contains something it shouldn't!");
+ BOOST_CHECK_MESSAGE(!filter.contains("19108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter contains something it shouldn't!");
- filter.insert(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"));
- BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")), "Bloom filter doesn't contain just-inserted object (2)!");
+ filter.insert("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"_hex_u8);
+ BOOST_CHECK_MESSAGE(filter.contains("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"_hex_u8), "Bloom filter doesn't contain just-inserted object (2)!");
- filter.insert(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5"));
- BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")), "Bloom filter doesn't contain just-inserted object (3)!");
+ filter.insert("b9300670b4c5366e95b2699e8b18bc75e5f729c5"_hex_u8);
+ BOOST_CHECK_MESSAGE(filter.contains("b9300670b4c5366e95b2699e8b18bc75e5f729c5"_hex_u8), "Bloom filter doesn't contain just-inserted object (3)!");
DataStream stream{};
stream << filter;
- std::vector<uint8_t> expected = ParseHex("03614e9b050000000000000001");
- auto result{MakeUCharSpan(stream)};
-
- BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
+ constexpr auto expected{"03614e9b050000000000000001"_hex};
+ BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
- BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
+ BOOST_CHECK_MESSAGE( filter.contains("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter doesn't contain just-inserted object!");
}
BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize_with_tweak)
@@ -56,24 +62,22 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize_with_tweak)
// Same test as bloom_create_insert_serialize, but we add a nTweak of 100
CBloomFilter filter(3, 0.01, 2147483649UL, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8"));
- BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
+ filter.insert("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8);
+ BOOST_CHECK_MESSAGE( filter.contains("99108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter doesn't contain just-inserted object!");
// One bit different in first byte
- BOOST_CHECK_MESSAGE(!filter.contains(ParseHex("19108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter contains something it shouldn't!");
+ BOOST_CHECK_MESSAGE(!filter.contains("19108ad8ed9bb6274d3980bab5a85c048f0950c8"_hex_u8), "Bloom filter contains something it shouldn't!");
- filter.insert(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"));
- BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")), "Bloom filter doesn't contain just-inserted object (2)!");
+ filter.insert("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"_hex_u8);
+ BOOST_CHECK_MESSAGE(filter.contains("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"_hex_u8), "Bloom filter doesn't contain just-inserted object (2)!");
- filter.insert(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5"));
- BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")), "Bloom filter doesn't contain just-inserted object (3)!");
+ filter.insert("b9300670b4c5366e95b2699e8b18bc75e5f729c5"_hex_u8);
+ BOOST_CHECK_MESSAGE(filter.contains("b9300670b4c5366e95b2699e8b18bc75e5f729c5"_hex_u8), "Bloom filter doesn't contain just-inserted object (3)!");
DataStream stream{};
stream << filter;
- std::vector<uint8_t> expected = ParseHex("03ce4299050000000100008001");
- auto result{MakeUCharSpan(stream)};
-
- BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
+ constexpr auto expected{"03ce4299050000000100008001"_hex};
+ BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
}
BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
@@ -91,17 +95,15 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
DataStream stream{};
stream << filter;
- std::vector<unsigned char> expected = ParseHex("038fc16b080000000000000001");
- auto result{MakeUCharSpan(stream)};
-
- BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
+ constexpr auto expected{"038fc16b080000000000000001"_hex};
+ BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
}
BOOST_AUTO_TEST_CASE(bloom_match)
{
// Random real transaction (b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b)
DataStream stream{
- ParseHex("01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"),
+ "01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"_hex,
};
CTransaction tx(deserialize, TX_WITH_WITNESS, stream);
@@ -112,37 +114,37 @@ BOOST_AUTO_TEST_CASE(bloom_match)
CTransaction spendingTx(deserialize, TX_WITH_WITNESS, spendStream);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(uint256S("0xb4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b"));
+ filter.insert(uint256{"b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b"});
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match tx hash");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// byte-reversed tx hash
- filter.insert(ParseHex("6bff7fcd4f8565ef406dd5d63d4ff94f318fe82027fd4dc451b04474019f74b4"));
+ filter.insert("6bff7fcd4f8565ef406dd5d63d4ff94f318fe82027fd4dc451b04474019f74b4"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match manually serialized tx hash");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("30450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a01"));
+ filter.insert("30450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a01"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match input signature");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339"));
+ filter.insert("046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match input pub key");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("04943fdd508053c75000106d3bc6e2754dbcff19"));
+ filter.insert("04943fdd508053c75000106d3bc6e2754dbcff19"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match output address");
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(spendingTx), "Simple Bloom filter didn't add output");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("a266436d2965547608b9e15d9032a7b9d64fa431"));
+ filter.insert("a266436d2965547608b9e15d9032a7b9d64fa431"_hex_u8);
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match output address");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(COutPoint(TxidFromString("0x90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b"), 0));
+ filter.insert(COutPoint(Txid::FromHex("90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b").value(), 0));
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match COutPoint");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- COutPoint prevOutPoint(TxidFromString("0x90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b"), 0);
+ COutPoint prevOutPoint(Txid::FromHex("90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b").value(), 0);
{
std::vector<unsigned char> data(32 + sizeof(unsigned int));
memcpy(data.data(), prevOutPoint.hash.begin(), 32);
@@ -152,19 +154,19 @@ BOOST_AUTO_TEST_CASE(bloom_match)
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match manually serialized COutPoint");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(uint256S("00000009e784f32f62ef849763d4f45b98e07ba658647343b915ff832b110436"));
+ filter.insert(uint256{"00000009e784f32f62ef849763d4f45b98e07ba658647343b915ff832b110436"});
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched random tx hash");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(ParseHex("0000006d2965547608b9e15d9032a7b9d64fa431"));
+ filter.insert("0000006d2965547608b9e15d9032a7b9d64fa431"_hex_u8);
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched random address");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(COutPoint(TxidFromString("0x90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b"), 1));
+ filter.insert(COutPoint(Txid::FromHex("90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b").value(), 1));
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched COutPoint for an output we didn't care about");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
- filter.insert(COutPoint(TxidFromString("0x000000d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b"), 0));
+ filter.insert(COutPoint(Txid::FromHex("000000d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b").value(), 0));
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched COutPoint for an output we didn't care about");
}
@@ -173,7 +175,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_1)
CBlock block = getBlock13b8a();
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// Match the last transaction
- filter.insert(uint256S("0x74d681e0e03bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20"));
+ filter.insert(uint256{"74d681e0e03bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20"});
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK_EQUAL(merkleBlock.header.GetHash().GetHex(), block.GetHash().GetHex());
@@ -181,7 +183,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_1)
BOOST_CHECK_EQUAL(merkleBlock.vMatchedTxn.size(), 1U);
std::pair<unsigned int, uint256> pair = merkleBlock.vMatchedTxn[0];
- BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0x74d681e0e03bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256{"74d681e0e03bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20"});
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 8);
std::vector<uint256> vMatched;
@@ -192,7 +194,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_1)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
// Also match the 8th transaction
- filter.insert(uint256S("0xdd1fd2a6fc16404faf339881a90adbde7f4f728691ac62e8f168809cdfae1053"));
+ filter.insert(uint256{"dd1fd2a6fc16404faf339881a90adbde7f4f728691ac62e8f168809cdfae1053"});
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -200,7 +202,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_1)
BOOST_CHECK(merkleBlock.vMatchedTxn[1] == pair);
- BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0xdd1fd2a6fc16404faf339881a90adbde7f4f728691ac62e8f168809cdfae1053"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256{"dd1fd2a6fc16404faf339881a90adbde7f4f728691ac62e8f168809cdfae1053"});
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 7);
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
@@ -215,13 +217,13 @@ BOOST_AUTO_TEST_CASE(merkle_block_2)
// With 4 txes
CBlock block;
DataStream stream{
- ParseHex("0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000"),
+ "0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// Match the first transaction
- filter.insert(uint256S("0xe980fe9f792d014e73b95203dc1335c5f9ce19ac537a419e6df5b47aecb93b70"));
+ filter.insert(uint256{"e980fe9f792d014e73b95203dc1335c5f9ce19ac537a419e6df5b47aecb93b70"});
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -229,7 +231,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2)
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 1);
std::pair<unsigned int, uint256> pair = merkleBlock.vMatchedTxn[0];
- BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0xe980fe9f792d014e73b95203dc1335c5f9ce19ac537a419e6df5b47aecb93b70"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256{"e980fe9f792d014e73b95203dc1335c5f9ce19ac537a419e6df5b47aecb93b70"});
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
std::vector<uint256> vMatched;
@@ -242,7 +244,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2)
// Match an output from the second transaction (the pubkey for address 1DZTzaBHUDM7T3QvUKBz4qXMRpkg8jsfB5)
// This should match the third transaction because it spends the output matched
// It also matches the fourth transaction, which spends to the pubkey again
- filter.insert(ParseHex("044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45af"));
+ filter.insert("044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45af"_hex_u8);
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -251,13 +253,13 @@ BOOST_AUTO_TEST_CASE(merkle_block_2)
BOOST_CHECK(pair == merkleBlock.vMatchedTxn[0]);
- BOOST_CHECK(merkleBlock.vMatchedTxn[1].second == uint256S("0x28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[1].second == uint256{"28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f"});
BOOST_CHECK(merkleBlock.vMatchedTxn[1].first == 1);
- BOOST_CHECK(merkleBlock.vMatchedTxn[2].second == uint256S("0x6b0f8a73a56c04b519f1883e8aafda643ba61a30bd1439969df21bea5f4e27e2"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[2].second == uint256{"6b0f8a73a56c04b519f1883e8aafda643ba61a30bd1439969df21bea5f4e27e2"});
BOOST_CHECK(merkleBlock.vMatchedTxn[2].first == 2);
- BOOST_CHECK(merkleBlock.vMatchedTxn[3].second == uint256S("0x3c1d7e82342158e4109df2e0b6348b6e84e403d8b4046d7007663ace63cddb23"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[3].second == uint256{"3c1d7e82342158e4109df2e0b6348b6e84e403d8b4046d7007663ace63cddb23"});
BOOST_CHECK(merkleBlock.vMatchedTxn[3].first == 3);
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
@@ -272,13 +274,13 @@ BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
// With 4 txes
CBlock block;
DataStream stream{
- ParseHex("0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000"),
+ "0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_NONE);
// Match the first transaction
- filter.insert(uint256S("0xe980fe9f792d014e73b95203dc1335c5f9ce19ac537a419e6df5b47aecb93b70"));
+ filter.insert(uint256{"e980fe9f792d014e73b95203dc1335c5f9ce19ac537a419e6df5b47aecb93b70"});
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -286,7 +288,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 1);
std::pair<unsigned int, uint256> pair = merkleBlock.vMatchedTxn[0];
- BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0xe980fe9f792d014e73b95203dc1335c5f9ce19ac537a419e6df5b47aecb93b70"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256{"e980fe9f792d014e73b95203dc1335c5f9ce19ac537a419e6df5b47aecb93b70"});
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
std::vector<uint256> vMatched;
@@ -299,7 +301,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
// Match an output from the second transaction (the pubkey for address 1DZTzaBHUDM7T3QvUKBz4qXMRpkg8jsfB5)
// This should not match the third transaction though it spends the output matched
// It will match the fourth transaction, which has another pay-to-pubkey output to the same address
- filter.insert(ParseHex("044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45af"));
+ filter.insert("044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45af"_hex_u8);
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -308,10 +310,10 @@ BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
BOOST_CHECK(pair == merkleBlock.vMatchedTxn[0]);
- BOOST_CHECK(merkleBlock.vMatchedTxn[1].second == uint256S("0x28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[1].second == uint256{"28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f"});
BOOST_CHECK(merkleBlock.vMatchedTxn[1].first == 1);
- BOOST_CHECK(merkleBlock.vMatchedTxn[2].second == uint256S("0x3c1d7e82342158e4109df2e0b6348b6e84e403d8b4046d7007663ace63cddb23"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[2].second == uint256{"3c1d7e82342158e4109df2e0b6348b6e84e403d8b4046d7007663ace63cddb23"});
BOOST_CHECK(merkleBlock.vMatchedTxn[2].first == 3);
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
@@ -326,20 +328,20 @@ BOOST_AUTO_TEST_CASE(merkle_block_3_and_serialize)
// With one tx
CBlock block;
DataStream stream{
- ParseHex("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020a02ffffffff0100f2052a01000000434104ecd3229b0571c3be876feaac0442a9f13c5a572742927af1dc623353ecf8c202225f64868137a18cdd85cbbb4c74fbccfd4f49639cf1bdc94a5672bb15ad5d4cac00000000"),
+ "0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020a02ffffffff0100f2052a01000000434104ecd3229b0571c3be876feaac0442a9f13c5a572742927af1dc623353ecf8c202225f64868137a18cdd85cbbb4c74fbccfd4f49639cf1bdc94a5672bb15ad5d4cac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// Match the only transaction
- filter.insert(uint256S("0x63194f18be0af63f2c6bc9dc0f777cbefed3d9415c4af83f3ee3a3d669c00cb5"));
+ filter.insert(uint256{"63194f18be0af63f2c6bc9dc0f777cbefed3d9415c4af83f3ee3a3d669c00cb5"});
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 1);
- BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0x63194f18be0af63f2c6bc9dc0f777cbefed3d9415c4af83f3ee3a3d669c00cb5"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256{"63194f18be0af63f2c6bc9dc0f777cbefed3d9415c4af83f3ee3a3d669c00cb5"});
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
std::vector<uint256> vMatched;
@@ -352,10 +354,8 @@ BOOST_AUTO_TEST_CASE(merkle_block_3_and_serialize)
DataStream merkleStream{};
merkleStream << merkleBlock;
- std::vector<uint8_t> expected = ParseHex("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101");
- auto result{MakeUCharSpan(merkleStream)};
-
- BOOST_CHECK_EQUAL_COLLECTIONS(expected.begin(), expected.end(), result.begin(), result.end());
+ constexpr auto expected{"0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101"_hex};
+ BOOST_CHECK_EQUAL_COLLECTIONS(merkleStream.begin(), merkleStream.end(), expected.begin(), expected.end());
}
BOOST_AUTO_TEST_CASE(merkle_block_4)
@@ -364,13 +364,13 @@ BOOST_AUTO_TEST_CASE(merkle_block_4)
// With 7 txes
CBlock block;
DataStream stream{
- ParseHex("0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"),
+ "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// Match the last transaction
- filter.insert(uint256S("0x0a2a92f0bda4727d0a13eaddf4dd9ac6b5c61a1429e6b2b818f19b15df0ac154"));
+ filter.insert(uint256{"0a2a92f0bda4727d0a13eaddf4dd9ac6b5c61a1429e6b2b818f19b15df0ac154"});
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
@@ -378,7 +378,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_4)
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 1);
std::pair<unsigned int, uint256> pair = merkleBlock.vMatchedTxn[0];
- BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0x0a2a92f0bda4727d0a13eaddf4dd9ac6b5c61a1429e6b2b818f19b15df0ac154"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256{"0a2a92f0bda4727d0a13eaddf4dd9ac6b5c61a1429e6b2b818f19b15df0ac154"});
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 6);
std::vector<uint256> vMatched;
@@ -389,13 +389,13 @@ BOOST_AUTO_TEST_CASE(merkle_block_4)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
// Also match the 4th transaction
- filter.insert(uint256S("0x02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"));
+ filter.insert(uint256{"02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"});
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 2);
- BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0x02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"));
+ BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256{"02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"});
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 3);
BOOST_CHECK(merkleBlock.vMatchedTxn[1] == pair);
@@ -412,23 +412,23 @@ BOOST_AUTO_TEST_CASE(merkle_block_4_test_p2pubkey_only)
// With 7 txes
CBlock block;
DataStream stream{
- ParseHex("0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"),
+ "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_P2PUBKEY_ONLY);
// Match the generation pubkey
- filter.insert(ParseHex("04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91"));
+ filter.insert("04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91"_hex_u8);
// ...and the output address of the 4th transaction
- filter.insert(ParseHex("b6efd80d99179f4f4ff6f4dd0a007d018c385d21"));
+ filter.insert("b6efd80d99179f4f4ff6f4dd0a007d018c385d21"_hex_u8);
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
// We should match the generation outpoint
- BOOST_CHECK(filter.contains(COutPoint(TxidFromString("0x147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b"), 0)));
+ BOOST_CHECK(filter.contains(COutPoint(Txid::FromHex("147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b").value(), 0)));
// ... but not the 4th transaction's output (its not pay-2-pubkey)
- BOOST_CHECK(!filter.contains(COutPoint(TxidFromString("0x02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"), 0)));
+ BOOST_CHECK(!filter.contains(COutPoint(Txid::FromHex("02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041").value(), 0)));
}
BOOST_AUTO_TEST_CASE(merkle_block_4_test_update_none)
@@ -437,34 +437,33 @@ BOOST_AUTO_TEST_CASE(merkle_block_4_test_update_none)
// With 7 txes
CBlock block;
DataStream stream{
- ParseHex("0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"),
+ "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_NONE);
// Match the generation pubkey
- filter.insert(ParseHex("04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91"));
+ filter.insert("04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91"_hex_u8);
// ...and the output address of the 4th transaction
- filter.insert(ParseHex("b6efd80d99179f4f4ff6f4dd0a007d018c385d21"));
+ filter.insert("b6efd80d99179f4f4ff6f4dd0a007d018c385d21"_hex_u8);
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
// We shouldn't match any outpoints (UPDATE_NONE)
- BOOST_CHECK(!filter.contains(COutPoint(TxidFromString("0x147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b"), 0)));
- BOOST_CHECK(!filter.contains(COutPoint(TxidFromString("0x02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"), 0)));
+ BOOST_CHECK(!filter.contains(COutPoint(Txid::FromHex("147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b").value(), 0)));
+ BOOST_CHECK(!filter.contains(COutPoint(Txid::FromHex("02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041").value(), 0)));
}
-static std::vector<unsigned char> RandomData()
+std::vector<unsigned char> BloomTest::RandomData()
{
- uint256 r = InsecureRand256();
+ uint256 r = m_rng.rand256();
return std::vector<unsigned char>(r.begin(), r.end());
}
BOOST_AUTO_TEST_CASE(rolling_bloom)
{
- SeedInsecureRand(SeedRand::ZEROS);
- g_mock_deterministic_tests = true;
+ SeedRandomForTest(SeedRand::ZEROS);
// last-100-entry, 1% false positive:
CRollingBloomFilter rb1(100, 0.01);
@@ -491,7 +490,7 @@ BOOST_AUTO_TEST_CASE(rolling_bloom)
++nHits;
}
// Expect about 100 hits
- BOOST_CHECK_EQUAL(nHits, 75U);
+ BOOST_CHECK_EQUAL(nHits, 71U);
BOOST_CHECK(rb1.contains(data[DATASIZE-1]));
rb1.reset();
@@ -519,7 +518,7 @@ BOOST_AUTO_TEST_CASE(rolling_bloom)
++nHits;
}
// Expect about 5 false positives
- BOOST_CHECK_EQUAL(nHits, 6U);
+ BOOST_CHECK_EQUAL(nHits, 3U);
// last-1000-entry, 0.01% false positive:
CRollingBloomFilter rb2(1000, 0.001);
@@ -530,7 +529,6 @@ BOOST_AUTO_TEST_CASE(rolling_bloom)
for (int i = 0; i < DATASIZE; i++) {
BOOST_CHECK(rb2.contains(data[i]));
}
- g_mock_deterministic_tests = false;
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/checkqueue_tests.cpp b/src/test/checkqueue_tests.cpp
index 023a5e8e70..a9a1e47070 100644
--- a/src/test/checkqueue_tests.cpp
+++ b/src/test/checkqueue_tests.cpp
@@ -28,13 +28,15 @@
struct NoLockLoggingTestingSetup : public TestingSetup {
NoLockLoggingTestingSetup()
#ifdef DEBUG_LOCKCONTENTION
- : TestingSetup{ChainType::MAIN, /*extra_args=*/{"-debugexclude=lock"}} {}
+ : TestingSetup{ChainType::MAIN, {.extra_args = { "-debugexclude=lock" } }} {}
#else
: TestingSetup{ChainType::MAIN} {}
#endif
};
-BOOST_FIXTURE_TEST_SUITE(checkqueue_tests, NoLockLoggingTestingSetup)
+struct CheckQueueTest : NoLockLoggingTestingSetup {
+ void Correct_Queue_range(std::vector<size_t> range);
+};
static const unsigned int QUEUE_BATCH_SIZE = 128;
static const int SCRIPT_CHECK_THREADS = 3;
@@ -156,7 +158,7 @@ typedef CCheckQueue<FrozenCleanupCheck> FrozenCleanup_Queue;
/** This test case checks that the CCheckQueue works properly
* with each specified size_t Checks pushed.
*/
-static void Correct_Queue_range(std::vector<size_t> range)
+void CheckQueueTest::Correct_Queue_range(std::vector<size_t> range)
{
auto small_queue = std::make_unique<Correct_Queue>(QUEUE_BATCH_SIZE, SCRIPT_CHECK_THREADS);
// Make vChecks here to save on malloc (this test can be slow...)
@@ -168,7 +170,7 @@ static void Correct_Queue_range(std::vector<size_t> range)
CCheckQueueControl<FakeCheckCheckCompletion> control(small_queue.get());
while (total) {
vChecks.clear();
- vChecks.resize(std::min<size_t>(total, InsecureRandRange(10)));
+ vChecks.resize(std::min<size_t>(total, m_rng.randrange(10)));
total -= vChecks.size();
control.Add(std::move(vChecks));
}
@@ -177,6 +179,8 @@ static void Correct_Queue_range(std::vector<size_t> range)
}
}
+BOOST_FIXTURE_TEST_SUITE(checkqueue_tests, CheckQueueTest)
+
/** Test that 0 checks is correct
*/
BOOST_AUTO_TEST_CASE(test_CheckQueue_Correct_Zero)
@@ -207,7 +211,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Correct_Random)
{
std::vector<size_t> range;
range.reserve(100000/1000);
- for (size_t i = 2; i < 100000; i += std::max((size_t)1, (size_t)InsecureRandRange(std::min((size_t)1000, ((size_t)100000) - i))))
+ for (size_t i = 2; i < 100000; i += std::max((size_t)1, (size_t)m_rng.randrange(std::min((size_t)1000, ((size_t)100000) - i))))
range.push_back(i);
Correct_Queue_range(range);
}
@@ -221,7 +225,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Catches_Failure)
CCheckQueueControl<FailingCheck> control(fail_queue.get());
size_t remaining = i;
while (remaining) {
- size_t r = InsecureRandRange(10);
+ size_t r = m_rng.randrange(10);
std::vector<FailingCheck> vChecks;
vChecks.reserve(r);
@@ -268,7 +272,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_UniqueCheck)
{
CCheckQueueControl<UniqueCheck> control(queue.get());
while (total) {
- size_t r = InsecureRandRange(10);
+ size_t r = m_rng.randrange(10);
std::vector<UniqueCheck> vChecks;
for (size_t k = 0; k < r && total; k++)
vChecks.emplace_back(--total);
@@ -300,7 +304,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Memory)
{
CCheckQueueControl<MemoryCheck> control(queue.get());
while (total) {
- size_t r = InsecureRandRange(10);
+ size_t r = m_rng.randrange(10);
std::vector<MemoryCheck> vChecks;
for (size_t k = 0; k < r && total; k++) {
total--;
diff --git a/src/test/cluster_linearize_tests.cpp b/src/test/cluster_linearize_tests.cpp
new file mode 100644
index 0000000000..d15e783ea1
--- /dev/null
+++ b/src/test/cluster_linearize_tests.cpp
@@ -0,0 +1,138 @@
+// 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.
+
+#include <cluster_linearize.h>
+#include <test/util/cluster_linearize.h>
+#include <test/util/setup_common.h>
+#include <util/bitset.h>
+#include <util/strencodings.h>
+
+#include <vector>
+
+#include <boost/test/unit_test.hpp>
+
+BOOST_FIXTURE_TEST_SUITE(cluster_linearize_tests, BasicTestingSetup)
+
+using namespace cluster_linearize;
+
+namespace {
+
+template<typename SetType>
+void TestDepGraphSerialization(const Cluster<SetType>& cluster, const std::string& hexenc)
+{
+ DepGraph depgraph(cluster);
+
+ // Run normal sanity and correspondence checks, which includes a round-trip test.
+ VerifyDepGraphFromCluster(cluster, depgraph);
+
+ // There may be multiple serializations of the same graph, but DepGraphFormatter's serializer
+ // only produces one of those. Verify that hexenc matches that canonical serialization.
+ std::vector<unsigned char> encoding;
+ VectorWriter writer(encoding, 0);
+ writer << Using<DepGraphFormatter>(depgraph);
+ BOOST_CHECK_EQUAL(HexStr(encoding), hexenc);
+
+ // Test that deserializing that encoding yields depgraph. This is effectively already implied
+ // by the round-trip test above (if depgraph is acyclic), but verify it explicitly again here.
+ SpanReader reader(encoding);
+ DepGraph<SetType> depgraph_read;
+ reader >> Using<DepGraphFormatter>(depgraph_read);
+ BOOST_CHECK(depgraph == depgraph_read);
+}
+
+} // namespace
+
+BOOST_AUTO_TEST_CASE(depgraph_ser_tests)
+{
+ // Empty cluster.
+ TestDepGraphSerialization<TestBitSet>(
+ {},
+ "00" /* end of graph */);
+
+ // Transactions: A(fee=0,size=1).
+ TestDepGraphSerialization<TestBitSet>(
+ {{{0, 1}, {}}},
+ "01" /* A size */
+ "00" /* A fee */
+ "00" /* A insertion position (no skips): A */
+ "00" /* end of graph */);
+
+ // Transactions: A(fee=42,size=11), B(fee=-13,size=7), B depends on A.
+ TestDepGraphSerialization<TestBitSet>(
+ {{{42, 11}, {}}, {{-13, 7}, {0}}},
+ "0b" /* A size */
+ "54" /* A fee */
+ "00" /* A insertion position (no skips): A */
+ "07" /* B size */
+ "19" /* B fee */
+ "00" /* B->A dependency (no skips) */
+ "00" /* B insertion position (no skips): A,B */
+ "00" /* end of graph */);
+
+ // Transactions: A(64,128), B(128,256), C(1,1), C depends on A and B.
+ TestDepGraphSerialization<TestBitSet>(
+ {{{64, 128}, {}}, {{128, 256}, {}}, {{1, 1}, {0, 1}}},
+ "8000" /* A size */
+ "8000" /* A fee */
+ "00" /* A insertion position (no skips): A */
+ "8100" /* B size */
+ "8100" /* B fee */
+ "01" /* B insertion position (skip B->A dependency): A,B */
+ "01" /* C size */
+ "02" /* C fee */
+ "00" /* C->B dependency (no skips) */
+ "00" /* C->A dependency (no skips) */
+ "00" /* C insertion position (no skips): A,B,C */
+ "00" /* end of graph */);
+
+ // Transactions: A(-57,113), B(57,114), C(-58,115), D(58,116). Deps: B->A, C->A, D->C, in order
+ // [B,A,C,D]. This exercises non-topological ordering (internally serialized as A,B,C,D).
+ TestDepGraphSerialization<TestBitSet>(
+ {{{57, 114}, {1}}, {{-57, 113}, {}}, {{-58, 115}, {1}}, {{58, 116}, {2}}},
+ "71" /* A size */
+ "71" /* A fee */
+ "00" /* A insertion position (no skips): A */
+ "72" /* B size */
+ "72" /* B fee */
+ "00" /* B->A dependency (no skips) */
+ "01" /* B insertion position (skip A): B,A */
+ "73" /* C size */
+ "73" /* C fee */
+ "01" /* C->A dependency (skip C->B dependency) */
+ "00" /* C insertion position (no skips): B,A,C */
+ "74" /* D size */
+ "74" /* D fee */
+ "00" /* D->C dependency (no skips) */
+ "01" /* D insertion position (skip D->B dependency, D->A is implied): B,A,C,D */
+ "00" /* end of graph */);
+
+ // Transactions: A(1,2), B(3,1), C(2,1), D(1,3), E(1,1). Deps: C->A, D->A, D->B, E->D.
+ // In order: [D,A,B,E,C]. Internally serialized in order A,B,C,D,E.
+ TestDepGraphSerialization<TestBitSet>(
+ {{{1, 3}, {1, 2}}, {{1, 2}, {}}, {{3, 1}, {}}, {{1, 1}, {0}}, {{2, 1}, {1}}},
+ "02" /* A size */
+ "02" /* A fee */
+ "00" /* A insertion position (no skips): A */
+ "01" /* B size */
+ "06" /* B fee */
+ "01" /* B insertion position (skip B->A dependency): A,B */
+ "01" /* C size */
+ "04" /* C fee */
+ "01" /* C->A dependency (skip C->B dependency) */
+ "00" /* C insertion position (no skips): A,B,C */
+ "03" /* D size */
+ "02" /* D fee */
+ "01" /* D->B dependency (skip D->C dependency) */
+ "00" /* D->A dependency (no skips) */
+ "03" /* D insertion position (skip C,B,A): D,A,B,C */
+ "01" /* E size */
+ "02" /* E fee */
+ "00" /* E->D dependency (no skips) */
+ "02" /* E insertion position (skip E->C dependency, E->B and E->A are implied,
+ skip insertion C): D,A,B,E,C */
+ "00" /* end of graph */
+ );
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp
index b6d3e7d567..0d18cd0c2b 100644
--- a/src/test/coins_tests.cpp
+++ b/src/test/coins_tests.cpp
@@ -19,6 +19,8 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
+
int ApplyTxInUndo(Coin&& undo, CCoinsViewCache& view, const COutPoint& out);
void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, CTxUndo &txundo, int nHeight);
@@ -35,10 +37,13 @@ bool operator==(const Coin &a, const Coin &b) {
class CCoinsViewTest : public CCoinsView
{
+ FastRandomContext& m_rng;
uint256 hashBestBlock_;
std::map<COutPoint, Coin> map_;
public:
+ CCoinsViewTest(FastRandomContext& rng) : m_rng{rng} {}
+
[[nodiscard]] bool GetCoin(const COutPoint& outpoint, Coin& coin) const override
{
std::map<COutPoint, Coin>::const_iterator it = map_.find(outpoint);
@@ -46,7 +51,7 @@ public:
return false;
}
coin = it->second;
- if (coin.IsSpent() && InsecureRandBool() == 0) {
+ if (coin.IsSpent() && m_rng.randbool() == 0) {
// Randomly return false in case of an empty entry.
return false;
}
@@ -55,13 +60,13 @@ public:
uint256 GetBestBlock() const override { return hashBestBlock_; }
- bool BatchWrite(CCoinsMap& mapCoins, const uint256& hashBlock, bool erase = true) override
+ bool BatchWrite(CoinsViewCacheCursor& cursor, const uint256& hashBlock) override
{
- for (CCoinsMap::iterator it = mapCoins.begin(); it != mapCoins.end(); it = erase ? mapCoins.erase(it) : std::next(it)) {
- if (it->second.flags & CCoinsCacheEntry::DIRTY) {
+ for (auto it{cursor.Begin()}; it != cursor.End(); it = cursor.NextAndMaybeErase(*it)){
+ if (it->second.IsDirty()) {
// Same optimization used in CCoinsViewDB is to only write dirty entries.
map_[it->first] = it->second.coin;
- if (it->second.coin.IsSpent() && InsecureRandRange(3) == 0) {
+ if (it->second.coin.IsSpent() && m_rng.randrange(3) == 0) {
// Randomly delete empty entries on write.
map_.erase(it->first);
}
@@ -78,7 +83,7 @@ class CCoinsViewCacheTest : public CCoinsViewCache
public:
explicit CCoinsViewCacheTest(CCoinsView* _base) : CCoinsViewCache(_base) {}
- void SelfTest() const
+ void SelfTest(bool sanity_check = true) const
{
// Manually recompute the dynamic usage of the whole data, and compare it.
size_t ret = memusage::DynamicUsage(cacheCoins);
@@ -89,9 +94,13 @@ public:
}
BOOST_CHECK_EQUAL(GetCacheSize(), count);
BOOST_CHECK_EQUAL(DynamicMemoryUsage(), ret);
+ if (sanity_check) {
+ SanityCheck();
+ }
}
CCoinsMap& map() const { return cacheCoins; }
+ CoinsCachePair& sentinel() const { return m_sentinel; }
size_t& usage() const { return cachedCoinsUsage; }
};
@@ -101,6 +110,7 @@ BOOST_FIXTURE_TEST_SUITE(coins_tests, BasicTestingSetup)
static const unsigned int NUM_SIMULATION_ITERATIONS = 40000;
+struct CacheTest : BasicTestingSetup {
// This is a large randomized insert/remove simulation test on a variable-size
// stack of caches on top of CCoinsViewTest.
//
@@ -140,26 +150,26 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
std::vector<Txid> txids;
txids.resize(NUM_SIMULATION_ITERATIONS / 8);
for (unsigned int i = 0; i < txids.size(); i++) {
- txids[i] = Txid::FromUint256(InsecureRand256());
+ txids[i] = Txid::FromUint256(m_rng.rand256());
}
for (unsigned int i = 0; i < NUM_SIMULATION_ITERATIONS; i++) {
// Do a random modification.
{
- auto txid = txids[InsecureRandRange(txids.size())]; // txid we're going to modify in this iteration.
+ auto txid = txids[m_rng.randrange(txids.size())]; // txid we're going to modify in this iteration.
Coin& coin = result[COutPoint(txid, 0)];
// Determine whether to test HaveCoin before or after Access* (or both). As these functions
// can influence each other's behaviour by pulling things into the cache, all combinations
// are tested.
- bool test_havecoin_before = InsecureRandBits(2) == 0;
- bool test_havecoin_after = InsecureRandBits(2) == 0;
+ bool test_havecoin_before = m_rng.randbits(2) == 0;
+ bool test_havecoin_after = m_rng.randbits(2) == 0;
bool result_havecoin = test_havecoin_before ? stack.back()->HaveCoin(COutPoint(txid, 0)) : false;
// Infrequently, test usage of AccessByTxid instead of AccessCoin - the
// former just delegates to the latter and returns the first unspent in a txn.
- const Coin& entry = (InsecureRandRange(500) == 0) ?
+ const Coin& entry = (m_rng.randrange(500) == 0) ?
AccessByTxid(*stack.back(), txid) : stack.back()->AccessCoin(COutPoint(txid, 0));
BOOST_CHECK(coin == entry);
@@ -172,23 +182,23 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
BOOST_CHECK(ret == !entry.IsSpent());
}
- if (InsecureRandRange(5) == 0 || coin.IsSpent()) {
+ if (m_rng.randrange(5) == 0 || coin.IsSpent()) {
Coin newcoin;
- newcoin.out.nValue = InsecureRandMoneyAmount();
+ newcoin.out.nValue = RandMoney(m_rng);
newcoin.nHeight = 1;
// Infrequently test adding unspendable coins.
- if (InsecureRandRange(16) == 0 && coin.IsSpent()) {
- newcoin.out.scriptPubKey.assign(1 + InsecureRandBits(6), OP_RETURN);
+ if (m_rng.randrange(16) == 0 && coin.IsSpent()) {
+ newcoin.out.scriptPubKey.assign(1 + m_rng.randbits(6), OP_RETURN);
BOOST_CHECK(newcoin.out.scriptPubKey.IsUnspendable());
added_an_unspendable_entry = true;
} else {
// Random sizes so we can test memory usage accounting
- newcoin.out.scriptPubKey.assign(InsecureRandBits(6), 0);
+ newcoin.out.scriptPubKey.assign(m_rng.randbits(6), 0);
(coin.IsSpent() ? added_an_entry : updated_an_entry) = true;
coin = newcoin;
}
- bool is_overwrite = !coin.IsSpent() || InsecureRand32() & 1;
+ bool is_overwrite = !coin.IsSpent() || m_rng.rand32() & 1;
stack.back()->AddCoin(COutPoint(txid, 0), std::move(newcoin), is_overwrite);
} else {
// Spend the coin.
@@ -199,15 +209,15 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
}
// Once every 10 iterations, remove a random entry from the cache
- if (InsecureRandRange(10) == 0) {
- COutPoint out(txids[InsecureRand32() % txids.size()], 0);
- int cacheid = InsecureRand32() % stack.size();
+ if (m_rng.randrange(10) == 0) {
+ COutPoint out(txids[m_rng.rand32() % txids.size()], 0);
+ int cacheid = m_rng.rand32() % stack.size();
stack[cacheid]->Uncache(out);
uncached_an_entry |= !stack[cacheid]->HaveCoinInCache(out);
}
// Once every 1000 iterations and at the end, verify the full cache.
- if (InsecureRandRange(1000) == 1 || i == NUM_SIMULATION_ITERATIONS - 1) {
+ if (m_rng.randrange(1000) == 1 || i == NUM_SIMULATION_ITERATIONS - 1) {
for (const auto& entry : result) {
bool have = stack.back()->HaveCoin(entry.first);
const Coin& coin = stack.back()->AccessCoin(entry.first);
@@ -225,27 +235,27 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
}
}
- if (InsecureRandRange(100) == 0) {
+ if (m_rng.randrange(100) == 0) {
// Every 100 iterations, flush an intermediate cache
- if (stack.size() > 1 && InsecureRandBool() == 0) {
- unsigned int flushIndex = InsecureRandRange(stack.size() - 1);
- if (fake_best_block) stack[flushIndex]->SetBestBlock(InsecureRand256());
- bool should_erase = InsecureRandRange(4) < 3;
+ if (stack.size() > 1 && m_rng.randbool() == 0) {
+ unsigned int flushIndex = m_rng.randrange(stack.size() - 1);
+ if (fake_best_block) stack[flushIndex]->SetBestBlock(m_rng.rand256());
+ bool should_erase = m_rng.randrange(4) < 3;
BOOST_CHECK(should_erase ? stack[flushIndex]->Flush() : stack[flushIndex]->Sync());
flushed_without_erase |= !should_erase;
}
}
- if (InsecureRandRange(100) == 0) {
+ if (m_rng.randrange(100) == 0) {
// Every 100 iterations, change the cache stack.
- if (stack.size() > 0 && InsecureRandBool() == 0) {
+ if (stack.size() > 0 && m_rng.randbool() == 0) {
//Remove the top cache
- if (fake_best_block) stack.back()->SetBestBlock(InsecureRand256());
- bool should_erase = InsecureRandRange(4) < 3;
+ if (fake_best_block) stack.back()->SetBestBlock(m_rng.rand256());
+ bool should_erase = m_rng.randrange(4) < 3;
BOOST_CHECK(should_erase ? stack.back()->Flush() : stack.back()->Sync());
flushed_without_erase |= !should_erase;
stack.pop_back();
}
- if (stack.size() == 0 || (stack.size() < 4 && InsecureRandBool())) {
+ if (stack.size() == 0 || (stack.size() < 4 && m_rng.randbool())) {
//Add a new cache
CCoinsView* tip = base;
if (stack.size() > 0) {
@@ -273,24 +283,26 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
BOOST_CHECK(uncached_an_entry);
BOOST_CHECK(flushed_without_erase);
}
+}; // struct CacheTest
// Run the above simulation for multiple base types.
-BOOST_AUTO_TEST_CASE(coins_cache_simulation_test)
+BOOST_FIXTURE_TEST_CASE(coins_cache_simulation_test, CacheTest)
{
- CCoinsViewTest base;
+ CCoinsViewTest base{m_rng};
SimulationTest(&base, false);
CCoinsViewDB db_base{{.path = "test", .cache_bytes = 1 << 23, .memory_only = true}, {}};
SimulationTest(&db_base, true);
}
+struct UpdateTest : BasicTestingSetup {
// Store of all necessary tx and undo data for next test
typedef std::map<COutPoint, std::tuple<CTransaction,CTxUndo,Coin>> UtxoData;
UtxoData utxoData;
UtxoData::iterator FindRandomFrom(const std::set<COutPoint> &utxoSet) {
assert(utxoSet.size());
- auto utxoSetIt = utxoSet.lower_bound(COutPoint(Txid::FromUint256(InsecureRand256()), 0));
+ auto utxoSetIt = utxoSet.lower_bound(COutPoint(Txid::FromUint256(m_rng.rand256()), 0));
if (utxoSetIt == utxoSet.end()) {
utxoSetIt = utxoSet.begin();
}
@@ -298,6 +310,7 @@ UtxoData::iterator FindRandomFrom(const std::set<COutPoint> &utxoSet) {
assert(utxoDataIt != utxoData.end());
return utxoDataIt;
}
+}; // struct UpdateTest
// This test is similar to the previous test
@@ -305,17 +318,16 @@ UtxoData::iterator FindRandomFrom(const std::set<COutPoint> &utxoSet) {
// random txs are created and UpdateCoins is used to update the cache stack
// In particular it is tested that spending a duplicate coinbase tx
// has the expected effect (the other duplicate is overwritten at all cache levels)
-BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
+BOOST_FIXTURE_TEST_CASE(updatecoins_simulation_test, UpdateTest)
{
- SeedInsecureRand(SeedRand::ZEROS);
- g_mock_deterministic_tests = true;
+ SeedRandomForTest(SeedRand::ZEROS);
bool spent_a_duplicate_coinbase = false;
// A simple map to track what we expect the cache stack to represent.
std::map<COutPoint, Coin> result;
// The cache stack.
- CCoinsViewTest base; // A CCoinsViewTest at the bottom.
+ CCoinsViewTest base{m_rng}; // A CCoinsViewTest at the bottom.
std::vector<std::unique_ptr<CCoinsViewCacheTest>> stack; // A stack of CCoinsViewCaches on top.
stack.push_back(std::make_unique<CCoinsViewCacheTest>(&base)); // Start with one cache.
@@ -326,7 +338,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
std::set<COutPoint> utxoset;
for (unsigned int i = 0; i < NUM_SIMULATION_ITERATIONS; i++) {
- uint32_t randiter = InsecureRand32();
+ uint32_t randiter = m_rng.rand32();
// 19/20 txs add a new transaction
if (randiter % 20 < 19) {
@@ -334,14 +346,14 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
tx.vin.resize(1);
tx.vout.resize(1);
tx.vout[0].nValue = i; //Keep txs unique unless intended to duplicate
- tx.vout[0].scriptPubKey.assign(InsecureRand32() & 0x3F, 0); // Random sizes so we can test memory usage accounting
- const int height{int(InsecureRand32() >> 1)};
+ tx.vout[0].scriptPubKey.assign(m_rng.rand32() & 0x3F, 0); // Random sizes so we can test memory usage accounting
+ const int height{int(m_rng.rand32() >> 1)};
Coin old_coin;
// 2/20 times create a new coinbase
if (randiter % 20 < 2 || coinbase_coins.size() < 10) {
// 1/10 of those times create a duplicate coinbase
- if (InsecureRandRange(10) == 0 && coinbase_coins.size()) {
+ if (m_rng.randrange(10) == 0 && coinbase_coins.size()) {
auto utxod = FindRandomFrom(coinbase_coins);
// Reuse the exact same coinbase
tx = CMutableTransaction{std::get<0>(utxod->second)};
@@ -451,7 +463,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
}
// Once every 1000 iterations and at the end, verify the full cache.
- if (InsecureRandRange(1000) == 1 || i == NUM_SIMULATION_ITERATIONS - 1) {
+ if (m_rng.randrange(1000) == 1 || i == NUM_SIMULATION_ITERATIONS - 1) {
for (const auto& entry : result) {
bool have = stack.back()->HaveCoin(entry.first);
const Coin& coin = stack.back()->AccessCoin(entry.first);
@@ -461,30 +473,30 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
}
// One every 10 iterations, remove a random entry from the cache
- if (utxoset.size() > 1 && InsecureRandRange(30) == 0) {
- stack[InsecureRand32() % stack.size()]->Uncache(FindRandomFrom(utxoset)->first);
+ if (utxoset.size() > 1 && m_rng.randrange(30) == 0) {
+ stack[m_rng.rand32() % stack.size()]->Uncache(FindRandomFrom(utxoset)->first);
}
- if (disconnected_coins.size() > 1 && InsecureRandRange(30) == 0) {
- stack[InsecureRand32() % stack.size()]->Uncache(FindRandomFrom(disconnected_coins)->first);
+ if (disconnected_coins.size() > 1 && m_rng.randrange(30) == 0) {
+ stack[m_rng.rand32() % stack.size()]->Uncache(FindRandomFrom(disconnected_coins)->first);
}
- if (duplicate_coins.size() > 1 && InsecureRandRange(30) == 0) {
- stack[InsecureRand32() % stack.size()]->Uncache(FindRandomFrom(duplicate_coins)->first);
+ if (duplicate_coins.size() > 1 && m_rng.randrange(30) == 0) {
+ stack[m_rng.rand32() % stack.size()]->Uncache(FindRandomFrom(duplicate_coins)->first);
}
- if (InsecureRandRange(100) == 0) {
+ if (m_rng.randrange(100) == 0) {
// Every 100 iterations, flush an intermediate cache
- if (stack.size() > 1 && InsecureRandBool() == 0) {
- unsigned int flushIndex = InsecureRandRange(stack.size() - 1);
+ if (stack.size() > 1 && m_rng.randbool() == 0) {
+ unsigned int flushIndex = m_rng.randrange(stack.size() - 1);
BOOST_CHECK(stack[flushIndex]->Flush());
}
}
- if (InsecureRandRange(100) == 0) {
+ if (m_rng.randrange(100) == 0) {
// Every 100 iterations, change the cache stack.
- if (stack.size() > 0 && InsecureRandBool() == 0) {
+ if (stack.size() > 0 && m_rng.randbool() == 0) {
BOOST_CHECK(stack.back()->Flush());
stack.pop_back();
}
- if (stack.size() == 0 || (stack.size() < 4 && InsecureRandBool())) {
+ if (stack.size() == 0 || (stack.size() < 4 && m_rng.randbool())) {
CCoinsView* tip = &base;
if (stack.size() > 0) {
tip = stack.back().get();
@@ -496,32 +508,30 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
// Verify coverage.
BOOST_CHECK(spent_a_duplicate_coinbase);
-
- g_mock_deterministic_tests = false;
}
BOOST_AUTO_TEST_CASE(ccoins_serialization)
{
// Good example
- DataStream ss1{ParseHex("97f23c835800816115944e077fe7c803cfa57f29b36bf87c1d35")};
+ DataStream ss1{"97f23c835800816115944e077fe7c803cfa57f29b36bf87c1d35"_hex};
Coin cc1;
ss1 >> cc1;
BOOST_CHECK_EQUAL(cc1.fCoinBase, false);
BOOST_CHECK_EQUAL(cc1.nHeight, 203998U);
BOOST_CHECK_EQUAL(cc1.out.nValue, CAmount{60000000000});
- BOOST_CHECK_EQUAL(HexStr(cc1.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160(ParseHex("816115944e077fe7c803cfa57f29b36bf87c1d35"))))));
+ BOOST_CHECK_EQUAL(HexStr(cc1.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160("816115944e077fe7c803cfa57f29b36bf87c1d35"_hex_u8)))));
// Good example
- DataStream ss2{ParseHex("8ddf77bbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa4")};
+ DataStream ss2{"8ddf77bbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa4"_hex};
Coin cc2;
ss2 >> cc2;
BOOST_CHECK_EQUAL(cc2.fCoinBase, true);
BOOST_CHECK_EQUAL(cc2.nHeight, 120891U);
BOOST_CHECK_EQUAL(cc2.out.nValue, 110397);
- BOOST_CHECK_EQUAL(HexStr(cc2.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160(ParseHex("8c988f1a4a4de2161e0f50aac7f17e7f9555caa4"))))));
+ BOOST_CHECK_EQUAL(HexStr(cc2.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160("8c988f1a4a4de2161e0f50aac7f17e7f9555caa4"_hex_u8)))));
// Smallest possible example
- DataStream ss3{ParseHex("000006")};
+ DataStream ss3{"000006"_hex};
Coin cc3;
ss3 >> cc3;
BOOST_CHECK_EQUAL(cc3.fCoinBase, false);
@@ -530,7 +540,7 @@ BOOST_AUTO_TEST_CASE(ccoins_serialization)
BOOST_CHECK_EQUAL(cc3.out.scriptPubKey.size(), 0U);
// scriptPubKey that ends beyond the end of the stream
- DataStream ss4{ParseHex("000007")};
+ DataStream ss4{"000007"_hex};
try {
Coin cc4;
ss4 >> cc4;
@@ -543,7 +553,7 @@ BOOST_AUTO_TEST_CASE(ccoins_serialization)
uint64_t x = 3000000000ULL;
tmp << VARINT(x);
BOOST_CHECK_EQUAL(HexStr(tmp), "8a95c0bb00");
- DataStream ss5{ParseHex("00008a95c0bb00")};
+ DataStream ss5{"00008a95c0bb00"_hex};
try {
Coin cc5;
ss5 >> cc5;
@@ -579,7 +589,7 @@ static void SetCoinsValue(CAmount value, Coin& coin)
}
}
-static size_t InsertCoinsMapEntry(CCoinsMap& map, CAmount value, char flags)
+static size_t InsertCoinsMapEntry(CCoinsMap& map, CoinsCachePair& sentinel, CAmount value, char flags)
{
if (value == ABSENT) {
assert(flags == NO_ENTRY);
@@ -587,10 +597,10 @@ static size_t InsertCoinsMapEntry(CCoinsMap& map, CAmount value, char flags)
}
assert(flags != NO_ENTRY);
CCoinsCacheEntry entry;
- entry.flags = flags;
SetCoinsValue(value, entry.coin);
auto inserted = map.emplace(OUTPOINT, std::move(entry));
assert(inserted.second);
+ inserted.first->second.AddFlags(flags, *inserted.first, sentinel);
return inserted.first->second.coin.DynamicMemoryUsage();
}
@@ -606,17 +616,20 @@ void GetCoinsMapEntry(const CCoinsMap& map, CAmount& value, char& flags, const C
} else {
value = it->second.coin.out.nValue;
}
- flags = it->second.flags;
+ flags = it->second.GetFlags();
assert(flags != NO_ENTRY);
}
}
void WriteCoinsViewEntry(CCoinsView& view, CAmount value, char flags)
{
+ CoinsCachePair sentinel{};
+ sentinel.second.SelfRef(sentinel);
CCoinsMapMemoryResource resource;
CCoinsMap map{0, CCoinsMap::hasher{}, CCoinsMap::key_equal{}, &resource};
- InsertCoinsMapEntry(map, value, flags);
- BOOST_CHECK(view.BatchWrite(map, {}));
+ auto usage{InsertCoinsMapEntry(map, sentinel, value, flags)};
+ auto cursor{CoinsViewCacheCursor(usage, sentinel, map, /*will_erase=*/true)};
+ BOOST_CHECK(view.BatchWrite(cursor, {}));
}
class SingleEntryCacheTest
@@ -625,7 +638,7 @@ public:
SingleEntryCacheTest(CAmount base_value, CAmount cache_value, char cache_flags)
{
WriteCoinsViewEntry(base, base_value, base_value == ABSENT ? NO_ENTRY : DIRTY);
- cache.usage() += InsertCoinsMapEntry(cache.map(), cache_value, cache_flags);
+ cache.usage() += InsertCoinsMapEntry(cache.map(), cache.sentinel(), cache_value, cache_flags);
}
CCoinsView root;
@@ -637,7 +650,7 @@ static void CheckAccessCoin(CAmount base_value, CAmount cache_value, CAmount exp
{
SingleEntryCacheTest test(base_value, cache_value, cache_flags);
test.cache.AccessCoin(OUTPOINT);
- test.cache.SelfTest();
+ test.cache.SelfTest(/*sanity_check=*/false);
CAmount result_value;
char result_flags;
@@ -806,7 +819,7 @@ void CheckWriteCoins(CAmount parent_value, CAmount child_value, CAmount expected
char result_flags;
try {
WriteCoinsViewEntry(test.cache, child_value, child_flags);
- test.cache.SelfTest();
+ test.cache.SelfTest(/*sanity_check=*/false);
GetCoinsMapEntry(test.cache.map(), result_value, result_flags);
} catch (std::logic_error&) {
result_value = FAIL;
@@ -884,11 +897,12 @@ BOOST_AUTO_TEST_CASE(ccoins_write)
}
+struct FlushTest : BasicTestingSetup {
Coin MakeCoin()
{
Coin coin;
- coin.out.nValue = InsecureRand32();
- coin.nHeight = InsecureRandRange(4096);
+ coin.out.nValue = m_rng.rand32();
+ coin.nHeight = m_rng.randrange(4096);
coin.fCoinBase = 0;
return coin;
}
@@ -915,18 +929,19 @@ void TestFlushBehavior(
size_t cache_usage;
size_t cache_size;
- auto flush_all = [&all_caches](bool erase) {
+ auto flush_all = [this, &all_caches](bool erase) {
// Flush in reverse order to ensure that flushes happen from children up.
for (auto i = all_caches.rbegin(); i != all_caches.rend(); ++i) {
auto& cache = *i;
+ cache->SanityCheck();
// hashBlock must be filled before flushing to disk; value is
// unimportant here. This is normally done during connect/disconnect block.
- cache->SetBestBlock(InsecureRand256());
+ cache->SetBestBlock(m_rng.rand256());
erase ? cache->Flush() : cache->Sync();
}
};
- Txid txid = Txid::FromUint256(InsecureRand256());
+ Txid txid = Txid::FromUint256(m_rng.rand256());
COutPoint outp = COutPoint(txid, 0);
Coin coin = MakeCoin();
// Ensure the coins views haven't seen this coin before.
@@ -1017,7 +1032,7 @@ void TestFlushBehavior(
// --- Bonus check: ensure that a coin added to the base view via one cache
// can be spent by another cache which has never seen it.
//
- txid = Txid::FromUint256(InsecureRand256());
+ txid = Txid::FromUint256(m_rng.rand256());
outp = COutPoint(txid, 0);
coin = MakeCoin();
BOOST_CHECK(!base.HaveCoin(outp));
@@ -1040,7 +1055,7 @@ void TestFlushBehavior(
// --- Bonus check 2: ensure that a FRESH, spent coin is deleted by Sync()
//
- txid = Txid::FromUint256(InsecureRand256());
+ txid = Txid::FromUint256(m_rng.rand256());
outp = COutPoint(txid, 0);
coin = MakeCoin();
CAmount coin_val = coin.out.nValue;
@@ -1069,8 +1084,9 @@ void TestFlushBehavior(
BOOST_CHECK(!all_caches[0]->HaveCoinInCache(outp));
BOOST_CHECK(!base.HaveCoin(outp));
}
+}; // struct FlushTest
-BOOST_AUTO_TEST_CASE(ccoins_flush_behavior)
+BOOST_FIXTURE_TEST_CASE(ccoins_flush_behavior, FlushTest)
{
// Create two in-memory caches atop a leveldb view.
CCoinsViewDB base{{.path = "test", .cache_bytes = 1 << 23, .memory_only = true}, {}};
diff --git a/src/test/coinscachepair_tests.cpp b/src/test/coinscachepair_tests.cpp
new file mode 100644
index 0000000000..61840f1f09
--- /dev/null
+++ b/src/test/coinscachepair_tests.cpp
@@ -0,0 +1,219 @@
+// 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.
+
+#include <coins.h>
+
+#include <boost/test/unit_test.hpp>
+
+#include <list>
+
+BOOST_AUTO_TEST_SUITE(coinscachepair_tests)
+
+static constexpr auto NUM_NODES{4};
+
+std::list<CoinsCachePair> CreatePairs(CoinsCachePair& sentinel)
+{
+ std::list<CoinsCachePair> nodes;
+ for (auto i{0}; i < NUM_NODES; ++i) {
+ nodes.emplace_back();
+
+ auto node{std::prev(nodes.end())};
+ node->second.AddFlags(CCoinsCacheEntry::DIRTY, *node, sentinel);
+
+ BOOST_CHECK_EQUAL(node->second.GetFlags(), CCoinsCacheEntry::DIRTY);
+ BOOST_CHECK_EQUAL(node->second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &(*node));
+
+ if (i > 0) {
+ BOOST_CHECK_EQUAL(std::prev(node)->second.Next(), &(*node));
+ BOOST_CHECK_EQUAL(node->second.Prev(), &(*std::prev(node)));
+ }
+ }
+ return nodes;
+}
+
+BOOST_AUTO_TEST_CASE(linked_list_iteration)
+{
+ CoinsCachePair sentinel;
+ sentinel.second.SelfRef(sentinel);
+ auto nodes{CreatePairs(sentinel)};
+
+ // Check iterating through pairs is identical to iterating through a list
+ auto node{sentinel.second.Next()};
+ for (const auto& expected : nodes) {
+ BOOST_CHECK_EQUAL(&expected, node);
+ node = node->second.Next();
+ }
+ BOOST_CHECK_EQUAL(node, &sentinel);
+
+ // Check iterating through pairs is identical to iterating through a list
+ // Clear the flags during iteration
+ node = sentinel.second.Next();
+ for (const auto& expected : nodes) {
+ BOOST_CHECK_EQUAL(&expected, node);
+ auto next = node->second.Next();
+ node->second.ClearFlags();
+ node = next;
+ }
+ BOOST_CHECK_EQUAL(node, &sentinel);
+ // Check that sentinel's next and prev are itself
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &sentinel);
+
+ // Delete the nodes from the list to make sure there are no dangling pointers
+ for (auto it{nodes.begin()}; it != nodes.end(); it = nodes.erase(it)) {
+ BOOST_CHECK_EQUAL(it->second.GetFlags(), 0);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(linked_list_iterate_erase)
+{
+ CoinsCachePair sentinel;
+ sentinel.second.SelfRef(sentinel);
+ auto nodes{CreatePairs(sentinel)};
+
+ // Check iterating through pairs is identical to iterating through a list
+ // Erase the nodes as we iterate through, but don't clear flags
+ // The flags will be cleared by the CCoinsCacheEntry's destructor
+ auto node{sentinel.second.Next()};
+ for (auto expected{nodes.begin()}; expected != nodes.end(); expected = nodes.erase(expected)) {
+ BOOST_CHECK_EQUAL(&(*expected), node);
+ node = node->second.Next();
+ }
+ BOOST_CHECK_EQUAL(node, &sentinel);
+
+ // Check that sentinel's next and prev are itself
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &sentinel);
+}
+
+BOOST_AUTO_TEST_CASE(linked_list_random_deletion)
+{
+ CoinsCachePair sentinel;
+ sentinel.second.SelfRef(sentinel);
+ auto nodes{CreatePairs(sentinel)};
+
+ // Create linked list sentinel->n1->n2->n3->n4->sentinel
+ auto n1{nodes.begin()};
+ auto n2{std::next(n1)};
+ auto n3{std::next(n2)};
+ auto n4{std::next(n3)};
+
+ // Delete n2
+ // sentinel->n1->n3->n4->sentinel
+ nodes.erase(n2);
+ // Check that n1 now points to n3, and n3 still points to n4
+ // Also check that flags were not altered
+ BOOST_CHECK_EQUAL(n1->second.GetFlags(), CCoinsCacheEntry::DIRTY);
+ BOOST_CHECK_EQUAL(n1->second.Next(), &(*n3));
+ BOOST_CHECK_EQUAL(n3->second.GetFlags(), CCoinsCacheEntry::DIRTY);
+ BOOST_CHECK_EQUAL(n3->second.Next(), &(*n4));
+ BOOST_CHECK_EQUAL(n3->second.Prev(), &(*n1));
+
+ // Delete n1
+ // sentinel->n3->n4->sentinel
+ nodes.erase(n1);
+ // Check that sentinel now points to n3, and n3 still points to n4
+ // Also check that flags were not altered
+ BOOST_CHECK_EQUAL(n3->second.GetFlags(), CCoinsCacheEntry::DIRTY);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &(*n3));
+ BOOST_CHECK_EQUAL(n3->second.Next(), &(*n4));
+ BOOST_CHECK_EQUAL(n3->second.Prev(), &sentinel);
+
+ // Delete n4
+ // sentinel->n3->sentinel
+ nodes.erase(n4);
+ // Check that sentinel still points to n3, and n3 points to sentinel
+ // Also check that flags were not altered
+ BOOST_CHECK_EQUAL(n3->second.GetFlags(), CCoinsCacheEntry::DIRTY);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &(*n3));
+ BOOST_CHECK_EQUAL(n3->second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &(*n3));
+
+ // Delete n3
+ // sentinel->sentinel
+ nodes.erase(n3);
+ // Check that sentinel's next and prev are itself
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &sentinel);
+}
+
+BOOST_AUTO_TEST_CASE(linked_list_add_flags)
+{
+ CoinsCachePair sentinel;
+ sentinel.second.SelfRef(sentinel);
+ CoinsCachePair n1;
+ CoinsCachePair n2;
+
+ // Check that adding 0 flag has no effect
+ n1.second.AddFlags(0, n1, sentinel);
+ BOOST_CHECK_EQUAL(n1.second.GetFlags(), 0);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &sentinel);
+
+ // Check that adding DIRTY flag inserts it into linked list and sets flags
+ n1.second.AddFlags(CCoinsCacheEntry::DIRTY, n1, sentinel);
+ BOOST_CHECK_EQUAL(n1.second.GetFlags(), CCoinsCacheEntry::DIRTY);
+ BOOST_CHECK_EQUAL(n1.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(n1.second.Prev(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &n1);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &n1);
+
+ // Check that adding FRESH flag on new node inserts it after n1
+ n2.second.AddFlags(CCoinsCacheEntry::FRESH, n2, sentinel);
+ BOOST_CHECK_EQUAL(n2.second.GetFlags(), CCoinsCacheEntry::FRESH);
+ BOOST_CHECK_EQUAL(n2.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(n2.second.Prev(), &n1);
+ BOOST_CHECK_EQUAL(n1.second.Next(), &n2);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &n2);
+
+ // Check that adding 0 flag has no effect, and doesn't change position
+ n1.second.AddFlags(0, n1, sentinel);
+ BOOST_CHECK_EQUAL(n1.second.GetFlags(), CCoinsCacheEntry::DIRTY);
+ BOOST_CHECK_EQUAL(n1.second.Next(), &n2);
+ BOOST_CHECK_EQUAL(n1.second.Prev(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &n1);
+ BOOST_CHECK_EQUAL(n2.second.Prev(), &n1);
+
+ // Check that we can add extra flags, but they don't change our position
+ n1.second.AddFlags(CCoinsCacheEntry::FRESH, n1, sentinel);
+ BOOST_CHECK_EQUAL(n1.second.GetFlags(), CCoinsCacheEntry::DIRTY | CCoinsCacheEntry::FRESH);
+ BOOST_CHECK_EQUAL(n1.second.Next(), &n2);
+ BOOST_CHECK_EQUAL(n1.second.Prev(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &n1);
+ BOOST_CHECK_EQUAL(n2.second.Prev(), &n1);
+
+ // Check that we can clear flags then re-add them
+ n1.second.ClearFlags();
+ BOOST_CHECK_EQUAL(n1.second.GetFlags(), 0);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &n2);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &n2);
+ BOOST_CHECK_EQUAL(n2.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(n2.second.Prev(), &sentinel);
+
+ // Check that calling `ClearFlags` with 0 flags has no effect
+ n1.second.ClearFlags();
+ BOOST_CHECK_EQUAL(n1.second.GetFlags(), 0);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &n2);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &n2);
+ BOOST_CHECK_EQUAL(n2.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(n2.second.Prev(), &sentinel);
+
+ // Adding 0 still has no effect
+ n1.second.AddFlags(0, n1, sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Next(), &n2);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &n2);
+ BOOST_CHECK_EQUAL(n2.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(n2.second.Prev(), &sentinel);
+
+ // But adding DIRTY re-inserts it after n2
+ n1.second.AddFlags(CCoinsCacheEntry::DIRTY, n1, sentinel);
+ BOOST_CHECK_EQUAL(n1.second.GetFlags(), CCoinsCacheEntry::DIRTY);
+ BOOST_CHECK_EQUAL(n2.second.Next(), &n1);
+ BOOST_CHECK_EQUAL(n1.second.Prev(), &n2);
+ BOOST_CHECK_EQUAL(n1.second.Next(), &sentinel);
+ BOOST_CHECK_EQUAL(sentinel.second.Prev(), &n1);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/compress_tests.cpp b/src/test/compress_tests.cpp
index 13c2740553..7e17e6ef93 100644
--- a/src/test/compress_tests.cpp
+++ b/src/test/compress_tests.cpp
@@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(compress_p2pk_scripts_not_on_curve)
{
XOnlyPubKey x_not_on_curve;
do {
- x_not_on_curve = XOnlyPubKey(g_insecure_rand_ctx.randbytes(32));
+ x_not_on_curve = XOnlyPubKey(m_rng.randbytes(32));
} while (x_not_on_curve.IsFullyValid());
// Check that P2PK script with uncompressed pubkey [=> OP_PUSH65 <0x04 .....> OP_CHECKSIG]
diff --git a/src/test/crypto_tests.cpp b/src/test/crypto_tests.cpp
index 46acc6fc9f..e2ea7ed5fd 100644
--- a/src/test/crypto_tests.cpp
+++ b/src/test/crypto_tests.cpp
@@ -21,14 +21,18 @@
#include <test/util/setup_common.h>
#include <util/strencodings.h>
+#include <algorithm>
#include <vector>
#include <boost/test/unit_test.hpp>
-BOOST_FIXTURE_TEST_SUITE(crypto_tests, BasicTestingSetup)
+using namespace util::hex_literals;
+
+namespace crypto_tests {
+struct CryptoTest : BasicTestingSetup {
template<typename Hasher, typename In, typename Out>
-static void TestVector(const Hasher &h, const In &in, const Out &out) {
+void TestVector(const Hasher &h, const In &in, const Out &out) {
Out hash;
BOOST_CHECK(out.size() == h.OUTPUT_SIZE);
hash.resize(out.size());
@@ -42,7 +46,7 @@ static void TestVector(const Hasher &h, const In &in, const Out &out) {
Hasher hasher(h);
size_t pos = 0;
while (pos < in.size()) {
- size_t len = InsecureRandRange((in.size() - pos + 1) / 2 + 1);
+ size_t len = m_rng.randrange((in.size() - pos + 1) / 2 + 1);
hasher.Write((const uint8_t*)in.data() + pos, len);
pos += len;
if (pos > 0 && pos + 2 * out.size() > in.size() && pos < in.size()) {
@@ -56,22 +60,22 @@ static void TestVector(const Hasher &h, const In &in, const Out &out) {
}
}
-static void TestSHA1(const std::string &in, const std::string &hexout) { TestVector(CSHA1(), in, ParseHex(hexout));}
-static void TestSHA256(const std::string &in, const std::string &hexout) { TestVector(CSHA256(), in, ParseHex(hexout));}
-static void TestSHA512(const std::string &in, const std::string &hexout) { TestVector(CSHA512(), in, ParseHex(hexout));}
-static void TestRIPEMD160(const std::string &in, const std::string &hexout) { TestVector(CRIPEMD160(), in, ParseHex(hexout));}
+void TestSHA1(const std::string &in, const std::string &hexout) { TestVector(CSHA1(), in, ParseHex(hexout));}
+void TestSHA256(const std::string &in, const std::string &hexout) { TestVector(CSHA256(), in, ParseHex(hexout));}
+void TestSHA512(const std::string &in, const std::string &hexout) { TestVector(CSHA512(), in, ParseHex(hexout));}
+void TestRIPEMD160(const std::string &in, const std::string &hexout) { TestVector(CRIPEMD160(), in, ParseHex(hexout));}
-static void TestHMACSHA256(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
+void TestHMACSHA256(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
std::vector<unsigned char> key = ParseHex(hexkey);
TestVector(CHMAC_SHA256(key.data(), key.size()), ParseHex(hexin), ParseHex(hexout));
}
-static void TestHMACSHA512(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
+void TestHMACSHA512(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
std::vector<unsigned char> key = ParseHex(hexkey);
TestVector(CHMAC_SHA512(key.data(), key.size()), ParseHex(hexin), ParseHex(hexout));
}
-static void TestAES256(const std::string &hexkey, const std::string &hexin, const std::string &hexout)
+void TestAES256(const std::string &hexkey, const std::string &hexin, const std::string &hexout)
{
std::vector<unsigned char> key = ParseHex(hexkey);
std::vector<unsigned char> in = ParseHex(hexin);
@@ -90,7 +94,7 @@ static void TestAES256(const std::string &hexkey, const std::string &hexin, cons
BOOST_CHECK(buf == in);
}
-static void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, bool pad, const std::string &hexin, const std::string &hexout)
+void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, bool pad, const std::string &hexin, const std::string &hexout)
{
std::vector<unsigned char> key = ParseHex(hexkey);
std::vector<unsigned char> iv = ParseHex(hexiv);
@@ -131,7 +135,7 @@ static void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, b
}
}
-static void TestChaCha20(const std::string &hex_message, const std::string &hexkey, ChaCha20::Nonce96 nonce, uint32_t seek, const std::string& hexout)
+void TestChaCha20(const std::string &hex_message, const std::string &hexkey, ChaCha20::Nonce96 nonce, uint32_t seek, const std::string& hexout)
{
auto key = ParseHex<std::byte>(hexkey);
assert(key.size() == 32);
@@ -163,8 +167,8 @@ static void TestChaCha20(const std::string &hex_message, const std::string &hexk
// Repeat 10x, but fragmented into 3 chunks, to exercise the ChaCha20 class's caching.
for (int i = 0; i < 10; ++i) {
size_t lens[3];
- lens[0] = InsecureRandRange(hexout.size() / 2U + 1U);
- lens[1] = InsecureRandRange(hexout.size() / 2U + 1U - lens[0]);
+ lens[0] = m_rng.randrange(hexout.size() / 2U + 1U);
+ lens[1] = m_rng.randrange(hexout.size() / 2U + 1U - lens[0]);
lens[2] = hexout.size() / 2U - lens[0] - lens[1];
rng.Seek(nonce, seek);
@@ -182,7 +186,7 @@ static void TestChaCha20(const std::string &hex_message, const std::string &hexk
}
}
-static void TestFSChaCha20(const std::string& hex_plaintext, const std::string& hexkey, uint32_t rekey_interval, const std::string& ciphertext_after_rotation)
+void TestFSChaCha20(const std::string& hex_plaintext, const std::string& hexkey, uint32_t rekey_interval, const std::string& ciphertext_after_rotation)
{
auto key = ParseHex<std::byte>(hexkey);
BOOST_CHECK_EQUAL(FSChaCha20::KEYLEN, key.size());
@@ -222,7 +226,7 @@ static void TestFSChaCha20(const std::string& hex_plaintext, const std::string&
BOOST_CHECK_EQUAL(HexStr(fsc20_output), ciphertext_after_rotation);
}
-static void TestPoly1305(const std::string &hexmessage, const std::string &hexkey, const std::string& hextag)
+void TestPoly1305(const std::string &hexmessage, const std::string &hexkey, const std::string& hextag)
{
auto key = ParseHex<std::byte>(hexkey);
auto m = ParseHex<std::byte>(hexmessage);
@@ -236,7 +240,7 @@ static void TestPoly1305(const std::string &hexmessage, const std::string &hexke
auto data = Span{m};
Poly1305 poly1305{key};
for (int chunk = 0; chunk < splits; ++chunk) {
- size_t now = InsecureRandRange(data.size() + 1);
+ size_t now = m_rng.randrange(data.size() + 1);
poly1305.Update(data.first(now));
data = data.subspan(now);
}
@@ -247,7 +251,7 @@ static void TestPoly1305(const std::string &hexmessage, const std::string &hexke
}
}
-static void TestChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, ChaCha20::Nonce96 nonce, const std::string& cipher_hex)
+void TestChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, ChaCha20::Nonce96 nonce, const std::string& cipher_hex)
{
auto plain = ParseHex<std::byte>(plain_hex);
auto aad = ParseHex<std::byte>(aad_hex);
@@ -256,7 +260,7 @@ static void TestChaCha20Poly1305(const std::string& plain_hex, const std::string
for (int i = 0; i < 10; ++i) {
// During i=0, use single-plain Encrypt/Decrypt; others use a split at prefix.
- size_t prefix = i ? InsecureRandRange(plain.size() + 1) : plain.size();
+ size_t prefix = i ? m_rng.randrange(plain.size() + 1) : plain.size();
// Encrypt.
std::vector<std::byte> cipher(plain.size() + AEADChaCha20Poly1305::EXPANSION);
AEADChaCha20Poly1305 aead{key};
@@ -288,7 +292,7 @@ static void TestChaCha20Poly1305(const std::string& plain_hex, const std::string
}
}
-static void TestFSChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, uint64_t msg_idx, const std::string& cipher_hex)
+void TestFSChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, uint64_t msg_idx, const std::string& cipher_hex)
{
auto plain = ParseHex<std::byte>(plain_hex);
auto aad = ParseHex<std::byte>(aad_hex);
@@ -298,7 +302,7 @@ static void TestFSChaCha20Poly1305(const std::string& plain_hex, const std::stri
for (int it = 0; it < 10; ++it) {
// During it==0 we use the single-plain Encrypt/Decrypt; others use a split at prefix.
- size_t prefix = it ? InsecureRandRange(plain.size() + 1) : plain.size();
+ size_t prefix = it ? m_rng.randrange(plain.size() + 1) : plain.size();
std::byte dummy_tag[FSChaCha20Poly1305::EXPANSION] = {{}};
// Do msg_idx dummy encryptions to seek to the correct packet.
@@ -334,7 +338,7 @@ static void TestFSChaCha20Poly1305(const std::string& plain_hex, const std::stri
}
}
-static void TestHKDF_SHA256_32(const std::string &ikm_hex, const std::string &salt_hex, const std::string &info_hex, const std::string &okm_check_hex) {
+void TestHKDF_SHA256_32(const std::string &ikm_hex, const std::string &salt_hex, const std::string &info_hex, const std::string &okm_check_hex) {
std::vector<unsigned char> initial_key_material = ParseHex(ikm_hex);
std::vector<unsigned char> salt = ParseHex(salt_hex);
std::vector<unsigned char> info = ParseHex(info_hex);
@@ -350,6 +354,10 @@ static void TestHKDF_SHA256_32(const std::string &ikm_hex, const std::string &sa
BOOST_CHECK(HexStr(out) == okm_check_hex);
}
+void TestSHA3_256(const std::string& input, const std::string& output);
+}; // struct CryptoTests
+} // namespace crypto_tests
+
static std::string LongTestString()
{
std::string ret;
@@ -365,6 +373,8 @@ static std::string LongTestString()
const std::string test1 = LongTestString();
+BOOST_FIXTURE_TEST_SUITE(crypto_tests, CryptoTest)
+
BOOST_AUTO_TEST_CASE(ripemd160_testvectors) {
TestRIPEMD160("", "9c1185a5c5e9fc54612808977ee8f548b2258d31");
TestRIPEMD160("abc", "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc");
@@ -822,7 +832,7 @@ BOOST_AUTO_TEST_CASE(chacha20_testvector)
BOOST_AUTO_TEST_CASE(chacha20_midblock)
{
- auto key = ParseHex<std::byte>("0000000000000000000000000000000000000000000000000000000000000000");
+ auto key = "0000000000000000000000000000000000000000000000000000000000000000"_hex;
ChaCha20 c20{key};
// get one block of keystream
std::byte block[64];
@@ -833,9 +843,9 @@ BOOST_AUTO_TEST_CASE(chacha20_midblock)
c20.Keystream(b2);
c20.Keystream(b3);
- BOOST_CHECK(Span{block}.first(5) == Span{b1});
- BOOST_CHECK(Span{block}.subspan(5, 7) == Span{b2});
- BOOST_CHECK(Span{block}.last(52) == Span{b3});
+ BOOST_CHECK(std::ranges::equal(Span{block}.first(5), b1));
+ BOOST_CHECK(std::ranges::equal(Span{block}.subspan(5, 7), b2));
+ BOOST_CHECK(std::ranges::equal(Span{block}.last(52), b3));
}
BOOST_AUTO_TEST_CASE(poly1305_testvector)
@@ -918,7 +928,7 @@ BOOST_AUTO_TEST_CASE(poly1305_testvector)
{
// mac of the macs of messages of length 0 to 256, where the key and messages have all
// their values set to the length.
- auto total_key = ParseHex<std::byte>("01020304050607fffefdfcfbfaf9ffffffffffffffffffffffffffff00000000");
+ auto total_key = "01020304050607fffefdfcfbfaf9ffffffffffffffffffffffffffff00000000"_hex;
Poly1305 total_ctx(total_key);
for (unsigned i = 0; i < 256; ++i) {
std::vector<std::byte> key(32, std::byte{uint8_t(i)});
@@ -1066,7 +1076,7 @@ BOOST_AUTO_TEST_CASE(sha256d64)
unsigned char in[64 * 32];
unsigned char out1[32 * 32], out2[32 * 32];
for (int j = 0; j < 64 * i; ++j) {
- in[j] = InsecureRandBits(8);
+ in[j] = m_rng.randbits(8);
}
for (int j = 0; j < i; ++j) {
CHash256().Write({in + 64 * j, 64}).Finalize({out1 + 32 * j, 32});
@@ -1076,7 +1086,7 @@ BOOST_AUTO_TEST_CASE(sha256d64)
}
}
-static void TestSHA3_256(const std::string& input, const std::string& output)
+void CryptoTest::TestSHA3_256(const std::string& input, const std::string& output)
{
const auto in_bytes = ParseHex(input);
const auto out_bytes = ParseHex(output);
@@ -1090,8 +1100,8 @@ static void TestSHA3_256(const std::string& input, const std::string& output)
// Reset and split randomly in 3
sha.Reset();
- int s1 = InsecureRandRange(in_bytes.size() + 1);
- int s2 = InsecureRandRange(in_bytes.size() + 1 - s1);
+ int s1 = m_rng.randrange(in_bytes.size() + 1);
+ int s2 = m_rng.randrange(in_bytes.size() + 1 - s1);
int s3 = in_bytes.size() - s1 - s2;
sha.Write(Span{in_bytes}.first(s1)).Write(Span{in_bytes}.subspan(s1, s2));
sha.Write(Span{in_bytes}.last(s3)).Finalize(out);
@@ -1195,7 +1205,7 @@ BOOST_AUTO_TEST_CASE(muhash_tests)
uint256 res;
int table[4];
for (int i = 0; i < 4; ++i) {
- table[i] = g_insecure_rand_ctx.randbits(3);
+ table[i] = m_rng.randbits<3>();
}
for (int order = 0; order < 4; ++order) {
MuHash3072 acc;
@@ -1215,8 +1225,8 @@ BOOST_AUTO_TEST_CASE(muhash_tests)
}
}
- MuHash3072 x = FromInt(g_insecure_rand_ctx.randbits(4)); // x=X
- MuHash3072 y = FromInt(g_insecure_rand_ctx.randbits(4)); // x=X, y=Y
+ MuHash3072 x = FromInt(m_rng.randbits<4>()); // x=X
+ MuHash3072 y = FromInt(m_rng.randbits<4>()); // x=X, y=Y
MuHash3072 z; // x=X, y=Y, z=1
z *= x; // x=X, y=Y, z=X
z *= y; // x=X, y=Y, z=X*Y
@@ -1235,7 +1245,7 @@ BOOST_AUTO_TEST_CASE(muhash_tests)
acc *= FromInt(1);
acc /= FromInt(2);
acc.Finalize(out);
- BOOST_CHECK_EQUAL(out, uint256S("10d312b100cbd32ada024a6646e40d3482fcff103668d2625f10002a607d5863"));
+ BOOST_CHECK_EQUAL(out, uint256{"10d312b100cbd32ada024a6646e40d3482fcff103668d2625f10002a607d5863"});
MuHash3072 acc2 = FromInt(0);
unsigned char tmp[32] = {1, 0};
@@ -1243,7 +1253,7 @@ BOOST_AUTO_TEST_CASE(muhash_tests)
unsigned char tmp2[32] = {2, 0};
acc2.Remove(tmp2);
acc2.Finalize(out);
- BOOST_CHECK_EQUAL(out, uint256S("10d312b100cbd32ada024a6646e40d3482fcff103668d2625f10002a607d5863"));
+ BOOST_CHECK_EQUAL(out, uint256{"10d312b100cbd32ada024a6646e40d3482fcff103668d2625f10002a607d5863"});
// Test MuHash3072 serialization
MuHash3072 serchk = FromInt(1); serchk *= FromInt(2);
@@ -1261,7 +1271,7 @@ BOOST_AUTO_TEST_CASE(muhash_tests)
BOOST_CHECK_EQUAL(HexStr(out), HexStr(out3));
// Test MuHash3072 overflow, meaning the internal data is larger than the modulus.
- DataStream ss_max{ParseHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")};
+ DataStream ss_max{"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"_hex};
MuHash3072 overflowchk;
ss_max >> overflowchk;
diff --git a/src/test/cuckoocache_tests.cpp b/src/test/cuckoocache_tests.cpp
index eafbcf5681..bb4c8c7093 100644
--- a/src/test/cuckoocache_tests.cpp
+++ b/src/test/cuckoocache_tests.cpp
@@ -29,33 +29,34 @@
* using BOOST_CHECK_CLOSE to fail.
*
*/
-BOOST_AUTO_TEST_SUITE(cuckoocache_tests);
+BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup);
/* Test that no values not inserted into the cache are read out of it.
*
- * There are no repeats in the first 200000 insecure_GetRandHash calls
+ * There are no repeats in the first 200000 m_rng.rand256() calls
*/
BOOST_AUTO_TEST_CASE(test_cuckoocache_no_fakes)
{
- SeedInsecureRand(SeedRand::ZEROS);
+ SeedRandomForTest(SeedRand::ZEROS);
CuckooCache::cache<uint256, SignatureCacheHasher> cc{};
size_t megabytes = 4;
cc.setup_bytes(megabytes << 20);
for (int x = 0; x < 100000; ++x) {
- cc.insert(InsecureRand256());
+ cc.insert(m_rng.rand256());
}
for (int x = 0; x < 100000; ++x) {
- BOOST_CHECK(!cc.contains(InsecureRand256(), false));
+ BOOST_CHECK(!cc.contains(m_rng.rand256(), false));
}
};
+struct HitRateTest : BasicTestingSetup {
/** This helper returns the hit rate when megabytes*load worth of entries are
* inserted into a megabytes sized cache
*/
template <typename Cache>
-static double test_cache(size_t megabytes, double load)
+double test_cache(size_t megabytes, double load)
{
- SeedInsecureRand(SeedRand::ZEROS);
+ SeedRandomForTest(SeedRand::ZEROS);
std::vector<uint256> hashes;
Cache set{};
size_t bytes = megabytes * (1 << 20);
@@ -65,7 +66,7 @@ static double test_cache(size_t megabytes, double load)
for (uint32_t i = 0; i < n_insert; ++i) {
uint32_t* ptr = (uint32_t*)hashes[i].begin();
for (uint8_t j = 0; j < 8; ++j)
- *(ptr++) = InsecureRand32();
+ *(ptr++) = m_rng.rand32();
}
/** We make a copy of the hashes because future optimizations of the
* cuckoocache may overwrite the inserted element, so the test is
@@ -104,9 +105,10 @@ static double normalize_hit_rate(double hits, double load)
{
return hits * std::max(load, 1.0);
}
+}; // struct HitRateTest
/** Check the hit rate on loads ranging from 0.1 to 1.6 */
-BOOST_AUTO_TEST_CASE(cuckoocache_hit_rate_ok)
+BOOST_FIXTURE_TEST_CASE(cuckoocache_hit_rate_ok, HitRateTest)
{
/** Arbitrarily selected Hit Rate threshold that happens to work for this test
* as a lower bound on performance.
@@ -120,13 +122,14 @@ BOOST_AUTO_TEST_CASE(cuckoocache_hit_rate_ok)
}
+struct EraseTest : BasicTestingSetup {
/** This helper checks that erased elements are preferentially inserted onto and
* that the hit rate of "fresher" keys is reasonable*/
template <typename Cache>
-static void test_cache_erase(size_t megabytes)
+void test_cache_erase(size_t megabytes)
{
double load = 1;
- SeedInsecureRand(SeedRand::ZEROS);
+ SeedRandomForTest(SeedRand::ZEROS);
std::vector<uint256> hashes;
Cache set{};
size_t bytes = megabytes * (1 << 20);
@@ -136,7 +139,7 @@ static void test_cache_erase(size_t megabytes)
for (uint32_t i = 0; i < n_insert; ++i) {
uint32_t* ptr = (uint32_t*)hashes[i].begin();
for (uint8_t j = 0; j < 8; ++j)
- *(ptr++) = InsecureRand32();
+ *(ptr++) = m_rng.rand32();
}
/** We make a copy of the hashes because future optimizations of the
* cuckoocache may overwrite the inserted element, so the test is
@@ -178,18 +181,20 @@ static void test_cache_erase(size_t megabytes)
// erased elements.
BOOST_CHECK(hit_rate_stale > 2 * hit_rate_erased_but_contained);
}
+}; // struct EraseTest
-BOOST_AUTO_TEST_CASE(cuckoocache_erase_ok)
+BOOST_FIXTURE_TEST_CASE(cuckoocache_erase_ok, EraseTest)
{
size_t megabytes = 4;
test_cache_erase<CuckooCache::cache<uint256, SignatureCacheHasher>>(megabytes);
}
+struct EraseParallelTest : BasicTestingSetup {
template <typename Cache>
-static void test_cache_erase_parallel(size_t megabytes)
+void test_cache_erase_parallel(size_t megabytes)
{
double load = 1;
- SeedInsecureRand(SeedRand::ZEROS);
+ SeedRandomForTest(SeedRand::ZEROS);
std::vector<uint256> hashes;
Cache set{};
size_t bytes = megabytes * (1 << 20);
@@ -199,7 +204,7 @@ static void test_cache_erase_parallel(size_t megabytes)
for (uint32_t i = 0; i < n_insert; ++i) {
uint32_t* ptr = (uint32_t*)hashes[i].begin();
for (uint8_t j = 0; j < 8; ++j)
- *(ptr++) = InsecureRand32();
+ *(ptr++) = m_rng.rand32();
}
/** We make a copy of the hashes because future optimizations of the
* cuckoocache may overwrite the inserted element, so the test is
@@ -268,15 +273,17 @@ static void test_cache_erase_parallel(size_t megabytes)
// erased elements.
BOOST_CHECK(hit_rate_stale > 2 * hit_rate_erased_but_contained);
}
-BOOST_AUTO_TEST_CASE(cuckoocache_erase_parallel_ok)
+}; // struct EraseParallelTest
+BOOST_FIXTURE_TEST_CASE(cuckoocache_erase_parallel_ok, EraseParallelTest)
{
size_t megabytes = 4;
test_cache_erase_parallel<CuckooCache::cache<uint256, SignatureCacheHasher>>(megabytes);
}
+struct GenerationsTest : BasicTestingSetup {
template <typename Cache>
-static void test_cache_generations()
+void test_cache_generations()
{
// This test checks that for a simulation of network activity, the fresh hit
// rate is never below 99%, and the number of times that it is worse than
@@ -293,7 +300,7 @@ static void test_cache_generations()
// iterations with non-deterministic values, so it isn't "overfit" to the
// specific entropy in FastRandomContext(true) and implementation of the
// cache.
- SeedInsecureRand(SeedRand::ZEROS);
+ SeedRandomForTest(SeedRand::ZEROS);
// block_activity models a chunk of network activity. n_insert elements are
// added to the cache. The first and last n/4 are stored for removal later
@@ -302,7 +309,7 @@ static void test_cache_generations()
// immediately and never uses the other half.
struct block_activity {
std::vector<uint256> reads;
- block_activity(uint32_t n_insert, Cache& c) : reads()
+ block_activity(uint32_t n_insert, FastRandomContext& rng, Cache& c)
{
std::vector<uint256> inserts;
inserts.resize(n_insert);
@@ -310,7 +317,7 @@ static void test_cache_generations()
for (uint32_t i = 0; i < n_insert; ++i) {
uint32_t* ptr = (uint32_t*)inserts[i].begin();
for (uint8_t j = 0; j < 8; ++j)
- *(ptr++) = InsecureRand32();
+ *(ptr++) = rng.rand32();
}
for (uint32_t i = 0; i < n_insert / 4; ++i)
reads.push_back(inserts[i]);
@@ -344,7 +351,7 @@ static void test_cache_generations()
for (uint32_t i = 0; i < total; ++i) {
if (last_few.size() == WINDOW_SIZE)
last_few.pop_front();
- last_few.emplace_back(BLOCK_SIZE, set);
+ last_few.emplace_back(BLOCK_SIZE, m_rng, set);
uint32_t count = 0;
for (auto& act : last_few)
for (uint32_t k = 0; k < POP_AMOUNT; ++k) {
@@ -365,7 +372,8 @@ static void test_cache_generations()
// max_rate_less_than_tight_hit_rate of the time
BOOST_CHECK(double(out_of_tight_tolerance) / double(total) < max_rate_less_than_tight_hit_rate);
}
-BOOST_AUTO_TEST_CASE(cuckoocache_generations)
+}; // struct GenerationsTest
+BOOST_FIXTURE_TEST_CASE(cuckoocache_generations, GenerationsTest)
{
test_cache_generations<CuckooCache::cache<uint256, SignatureCacheHasher>>();
}
diff --git a/src/test/dbwrapper_tests.cpp b/src/test/dbwrapper_tests.cpp
index 167e4be288..3a86036327 100644
--- a/src/test/dbwrapper_tests.cpp
+++ b/src/test/dbwrapper_tests.cpp
@@ -33,7 +33,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper)
fs::path ph = m_args.GetDataDirBase() / (obfuscate ? "dbwrapper_obfuscate_true" : "dbwrapper_obfuscate_false");
CDBWrapper dbw({.path = ph, .cache_bytes = 1 << 20, .memory_only = true, .wipe_data = false, .obfuscate = obfuscate});
uint8_t key{'k'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
uint256 res;
// Ensure that we're doing real obfuscation when obfuscate=true
@@ -60,65 +60,65 @@ BOOST_AUTO_TEST_CASE(dbwrapper_basic_data)
BOOST_CHECK(obfuscate != is_null_key(dbwrapper_private::GetObfuscateKey(dbw)));
//Simulate block raw data - "b + block hash"
- std::string key_block = "b" + InsecureRand256().ToString();
+ std::string key_block = "b" + m_rng.rand256().ToString();
- uint256 in_block = InsecureRand256();
+ uint256 in_block = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_block, in_block));
BOOST_CHECK(dbw.Read(key_block, res));
BOOST_CHECK_EQUAL(res.ToString(), in_block.ToString());
//Simulate file raw data - "f + file_number"
- std::string key_file = strprintf("f%04x", InsecureRand32());
+ std::string key_file = strprintf("f%04x", m_rng.rand32());
- uint256 in_file_info = InsecureRand256();
+ uint256 in_file_info = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_file, in_file_info));
BOOST_CHECK(dbw.Read(key_file, res));
BOOST_CHECK_EQUAL(res.ToString(), in_file_info.ToString());
//Simulate transaction raw data - "t + transaction hash"
- std::string key_transaction = "t" + InsecureRand256().ToString();
+ std::string key_transaction = "t" + m_rng.rand256().ToString();
- uint256 in_transaction = InsecureRand256();
+ uint256 in_transaction = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_transaction, in_transaction));
BOOST_CHECK(dbw.Read(key_transaction, res));
BOOST_CHECK_EQUAL(res.ToString(), in_transaction.ToString());
//Simulate UTXO raw data - "c + transaction hash"
- std::string key_utxo = "c" + InsecureRand256().ToString();
+ std::string key_utxo = "c" + m_rng.rand256().ToString();
- uint256 in_utxo = InsecureRand256();
+ uint256 in_utxo = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_utxo, in_utxo));
BOOST_CHECK(dbw.Read(key_utxo, res));
BOOST_CHECK_EQUAL(res.ToString(), in_utxo.ToString());
//Simulate last block file number - "l"
uint8_t key_last_blockfile_number{'l'};
- uint32_t lastblockfilenumber = InsecureRand32();
+ uint32_t lastblockfilenumber = m_rng.rand32();
BOOST_CHECK(dbw.Write(key_last_blockfile_number, lastblockfilenumber));
BOOST_CHECK(dbw.Read(key_last_blockfile_number, res_uint_32));
BOOST_CHECK_EQUAL(lastblockfilenumber, res_uint_32);
//Simulate Is Reindexing - "R"
uint8_t key_IsReindexing{'R'};
- bool isInReindexing = InsecureRandBool();
+ bool isInReindexing = m_rng.randbool();
BOOST_CHECK(dbw.Write(key_IsReindexing, isInReindexing));
BOOST_CHECK(dbw.Read(key_IsReindexing, res_bool));
BOOST_CHECK_EQUAL(isInReindexing, res_bool);
//Simulate last block hash up to which UXTO covers - 'B'
uint8_t key_lastblockhash_uxto{'B'};
- uint256 lastblock_hash = InsecureRand256();
+ uint256 lastblock_hash = m_rng.rand256();
BOOST_CHECK(dbw.Write(key_lastblockhash_uxto, lastblock_hash));
BOOST_CHECK(dbw.Read(key_lastblockhash_uxto, res));
BOOST_CHECK_EQUAL(lastblock_hash, res);
//Simulate file raw data - "F + filename_number + filename"
std::string file_option_tag = "F";
- uint8_t filename_length = InsecureRandBits(8);
+ uint8_t filename_length = m_rng.randbits(8);
std::string filename = "randomfilename";
std::string key_file_option = strprintf("%s%01x%s", file_option_tag,filename_length,filename);
- bool in_file_bool = InsecureRandBool();
+ bool in_file_bool = m_rng.randbool();
BOOST_CHECK(dbw.Write(key_file_option, in_file_bool));
BOOST_CHECK(dbw.Read(key_file_option, res_bool));
BOOST_CHECK_EQUAL(res_bool, in_file_bool);
@@ -134,11 +134,11 @@ BOOST_AUTO_TEST_CASE(dbwrapper_batch)
CDBWrapper dbw({.path = ph, .cache_bytes = 1 << 20, .memory_only = true, .wipe_data = false, .obfuscate = obfuscate});
uint8_t key{'i'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
uint8_t key2{'j'};
- uint256 in2 = InsecureRand256();
+ uint256 in2 = m_rng.rand256();
uint8_t key3{'k'};
- uint256 in3 = InsecureRand256();
+ uint256 in3 = m_rng.rand256();
uint256 res;
CDBBatch batch(dbw);
@@ -171,10 +171,10 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
// The two keys are intentionally chosen for ordering
uint8_t key{'j'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
BOOST_CHECK(dbw.Write(key, in));
uint8_t key2{'k'};
- uint256 in2 = InsecureRand256();
+ uint256 in2 = m_rng.rand256();
BOOST_CHECK(dbw.Write(key2, in2));
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper&>(dbw).NewIterator());
@@ -212,7 +212,7 @@ BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
// Set up a non-obfuscated wrapper to write some initial data.
std::unique_ptr<CDBWrapper> dbw = std::make_unique<CDBWrapper>(DBParams{.path = ph, .cache_bytes = 1 << 10, .memory_only = false, .wipe_data = false, .obfuscate = false});
uint8_t key{'k'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
uint256 res;
BOOST_CHECK(dbw->Write(key, in));
@@ -234,7 +234,7 @@ BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
BOOST_CHECK(!odbw.IsEmpty()); // There should be existing data
BOOST_CHECK(is_null_key(dbwrapper_private::GetObfuscateKey(odbw))); // The key should be an empty string
- uint256 in2 = InsecureRand256();
+ uint256 in2 = m_rng.rand256();
uint256 res3;
// Check that we can write successfully
@@ -253,7 +253,7 @@ BOOST_AUTO_TEST_CASE(existing_data_reindex)
// Set up a non-obfuscated wrapper to write some initial data.
std::unique_ptr<CDBWrapper> dbw = std::make_unique<CDBWrapper>(DBParams{.path = ph, .cache_bytes = 1 << 10, .memory_only = false, .wipe_data = false, .obfuscate = false});
uint8_t key{'k'};
- uint256 in = InsecureRand256();
+ uint256 in = m_rng.rand256();
uint256 res;
BOOST_CHECK(dbw->Write(key, in));
@@ -271,7 +271,7 @@ BOOST_AUTO_TEST_CASE(existing_data_reindex)
BOOST_CHECK(!odbw.Read(key, res2));
BOOST_CHECK(!is_null_key(dbwrapper_private::GetObfuscateKey(odbw)));
- uint256 in2 = InsecureRand256();
+ uint256 in2 = m_rng.rand256();
uint256 res3;
// Check that we can write successfully
diff --git a/src/test/denialofservice_tests.cpp b/src/test/denialofservice_tests.cpp
index 42db28daf5..9ee7e9c9fe 100644
--- a/src/test/denialofservice_tests.cpp
+++ b/src/test/denialofservice_tests.cpp
@@ -106,17 +106,18 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
peerman.FinalizeNode(dummyNode1);
}
-static void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman, ConnectionType connType, bool onion_peer = false)
+struct OutboundTest : TestingSetup {
+void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman, ConnectionType connType, bool onion_peer = false)
{
CAddress addr;
if (onion_peer) {
- auto tor_addr{g_insecure_rand_ctx.randbytes(ADDR_TORV3_SIZE)};
+ auto tor_addr{m_rng.randbytes(ADDR_TORV3_SIZE)};
BOOST_REQUIRE(addr.SetSpecial(OnionToString(tor_addr)));
}
while (!addr.IsRoutable()) {
- addr = CAddress(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE);
+ addr = CAddress(ip(m_rng.randbits(32)), NODE_NONE);
}
vNodes.emplace_back(new CNode{id++,
@@ -136,8 +137,9 @@ static void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerM
connman.AddTestNode(node);
}
+}; // struct OutboundTest
-BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
+BOOST_FIXTURE_TEST_CASE(stale_tip_peer_management, OutboundTest)
{
NodeId id{0};
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman, Params());
@@ -235,7 +237,7 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
connman->ClearTestNodes();
}
-BOOST_AUTO_TEST_CASE(block_relay_only_eviction)
+BOOST_FIXTURE_TEST_CASE(block_relay_only_eviction, OutboundTest)
{
NodeId id{0};
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman, Params());
diff --git a/src/test/descriptor_tests.cpp b/src/test/descriptor_tests.cpp
index e6821dd321..24b8f2f793 100644
--- a/src/test/descriptor_tests.cpp
+++ b/src/test/descriptor_tests.cpp
@@ -15,6 +15,7 @@
#include <string>
#include <vector>
+using namespace util::hex_literals;
using util::Split;
namespace {
@@ -25,8 +26,8 @@ void CheckUnparsable(const std::string& prv, const std::string& pub, const std::
std::string error;
auto parse_priv = Parse(prv, keys_priv, error);
auto parse_pub = Parse(pub, keys_pub, error);
- BOOST_CHECK_MESSAGE(!parse_priv, prv);
- BOOST_CHECK_MESSAGE(!parse_pub, pub);
+ BOOST_CHECK_MESSAGE(parse_priv.empty(), prv);
+ BOOST_CHECK_MESSAGE(parse_pub.empty(), pub);
BOOST_CHECK_EQUAL(error, expected_error);
}
@@ -133,25 +134,29 @@ void DoCheck(std::string prv, std::string pub, const std::string& norm_pub, int
const std::vector<std::vector<std::string>>& scripts, const std::optional<OutputType>& type, std::optional<uint256> op_desc_id = std::nullopt,
const std::set<std::vector<uint32_t>>& paths = ONLY_EMPTY, bool replace_apostrophe_with_h_in_prv=false,
bool replace_apostrophe_with_h_in_pub=false, uint32_t spender_nlocktime=0, uint32_t spender_nsequence=CTxIn::SEQUENCE_FINAL,
- std::map<std::vector<uint8_t>, std::vector<uint8_t>> preimages={})
+ std::map<std::vector<uint8_t>, std::vector<uint8_t>> preimages={},
+ std::optional<std::string> expected_prv = std::nullopt, std::optional<std::string> expected_pub = std::nullopt, int desc_index = 0)
{
FlatSigningProvider keys_priv, keys_pub;
std::set<std::vector<uint32_t>> left_paths = paths;
std::string error;
- std::unique_ptr<Descriptor> parse_priv;
- std::unique_ptr<Descriptor> parse_pub;
+ std::vector<std::unique_ptr<Descriptor>> parse_privs;
+ std::vector<std::unique_ptr<Descriptor>> parse_pubs;
// Check that parsing succeeds.
if (replace_apostrophe_with_h_in_prv) {
prv = UseHInsteadOfApostrophe(prv);
}
- parse_priv = Parse(prv, keys_priv, error);
- BOOST_CHECK_MESSAGE(parse_priv, error);
+ parse_privs = Parse(prv, keys_priv, error);
+ BOOST_CHECK_MESSAGE(!parse_privs.empty(), error);
if (replace_apostrophe_with_h_in_pub) {
pub = UseHInsteadOfApostrophe(pub);
}
- parse_pub = Parse(pub, keys_pub, error);
- BOOST_CHECK_MESSAGE(parse_pub, error);
+ parse_pubs = Parse(pub, keys_pub, error);
+ BOOST_CHECK_MESSAGE(!parse_pubs.empty(), error);
+
+ auto& parse_priv = parse_privs.at(desc_index);
+ auto& parse_pub = parse_pubs.at(desc_index);
// We must be able to estimate the max satisfaction size for any solvable descriptor top descriptor (but combo).
const bool is_nontop_or_nonsolvable{!parse_priv->IsSolvable() || !parse_priv->GetOutputType()};
@@ -173,11 +178,17 @@ void DoCheck(std::string prv, std::string pub, const std::string& norm_pub, int
BOOST_CHECK(keys_priv.keys.size());
BOOST_CHECK(!keys_pub.keys.size());
- // Check that both versions serialize back to the public version.
+ // If expected_pub is provided, check that the serialize matches that.
+ // Otherwise check that they serialize back to the public version.
std::string pub1 = parse_priv->ToString();
std::string pub2 = parse_pub->ToString();
- BOOST_CHECK_MESSAGE(EqualDescriptor(pub, pub1), "Private ser: " + pub1 + " Public desc: " + pub);
- BOOST_CHECK_MESSAGE(EqualDescriptor(pub, pub2), "Public ser: " + pub2 + " Public desc: " + pub);
+ if (expected_pub) {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(*expected_pub, pub1), "Private ser: " + pub1 + " Public desc: " + *expected_pub);
+ BOOST_CHECK_MESSAGE(EqualDescriptor(*expected_pub, pub2), "Public ser: " + pub2 + " Public desc: " + *expected_pub);
+ } else {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(pub, pub1), "Private ser: " + pub1 + " Public desc: " + pub);
+ BOOST_CHECK_MESSAGE(EqualDescriptor(pub, pub2), "Public ser: " + pub2 + " Public desc: " + pub);
+ }
// Check that the COMPAT identifier did not change
if (op_desc_id) {
@@ -188,10 +199,19 @@ void DoCheck(std::string prv, std::string pub, const std::string& norm_pub, int
if (!(flags & MISSING_PRIVKEYS)) {
std::string prv1;
BOOST_CHECK(parse_priv->ToPrivateString(keys_priv, prv1));
- BOOST_CHECK_MESSAGE(EqualDescriptor(prv, prv1), "Private ser: " + prv1 + " Private desc: " + prv);
+ if (expected_prv) {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(*expected_prv, prv1), "Private ser: " + prv1 + "Private desc: " + *expected_prv);
+ } else {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(prv, prv1), "Private ser: " + prv1 + " Private desc: " + prv);
+ }
BOOST_CHECK(!parse_priv->ToPrivateString(keys_pub, prv1));
BOOST_CHECK(parse_pub->ToPrivateString(keys_priv, prv1));
- BOOST_CHECK_MESSAGE(EqualDescriptor(prv, prv1), "Private ser: " + prv1 + " Private desc: " + prv);
+ if (expected_prv) {
+ BOOST_CHECK(EqualDescriptor(*expected_prv, prv1));
+ BOOST_CHECK_MESSAGE(EqualDescriptor(*expected_prv, prv1), "Private ser: " + prv1 + " Private desc: " + *expected_prv);
+ } else {
+ BOOST_CHECK_MESSAGE(EqualDescriptor(prv, prv1), "Private ser: " + prv1 + " Private desc: " + prv);
+ }
BOOST_CHECK(!parse_pub->ToPrivateString(keys_pub, prv1));
}
@@ -372,18 +392,42 @@ void DoCheck(std::string prv, std::string pub, const std::string& norm_pub, int
void Check(const std::string& prv, const std::string& pub, const std::string& norm_pub, int flags,
const std::vector<std::vector<std::string>>& scripts, const std::optional<OutputType>& type, std::optional<uint256> op_desc_id = std::nullopt,
const std::set<std::vector<uint32_t>>& paths = ONLY_EMPTY, uint32_t spender_nlocktime=0,
- uint32_t spender_nsequence=CTxIn::SEQUENCE_FINAL, std::map<std::vector<uint8_t>, std::vector<uint8_t>> preimages={})
+ uint32_t spender_nsequence=CTxIn::SEQUENCE_FINAL, std::map<std::vector<uint8_t>, std::vector<uint8_t>> preimages={},
+ std::optional<std::string> expected_prv = std::nullopt, std::optional<std::string> expected_pub = std::nullopt, int desc_index = 0)
{
// Do not replace apostrophes with 'h' in prv and pub
DoCheck(prv, pub, norm_pub, flags, scripts, type, op_desc_id, paths, /*replace_apostrophe_with_h_in_prv=*/false,
/*replace_apostrophe_with_h_in_pub=*/false, /*spender_nlocktime=*/spender_nlocktime,
- /*spender_nsequence=*/spender_nsequence, /*preimages=*/preimages);
+ /*spender_nsequence=*/spender_nsequence, /*preimages=*/preimages,
+ expected_prv, expected_pub, desc_index);
// Replace apostrophes with 'h' both in prv and in pub, if apostrophes are found in both
if (prv.find('\'') != std::string::npos && pub.find('\'') != std::string::npos) {
DoCheck(prv, pub, norm_pub, flags, scripts, type, op_desc_id, paths, /*replace_apostrophe_with_h_in_prv=*/true,
/*replace_apostrophe_with_h_in_pub=*/true, /*spender_nlocktime=*/spender_nlocktime,
- /*spender_nsequence=*/spender_nsequence, /*preimages=*/preimages);
+ /*spender_nsequence=*/spender_nsequence, /*preimages=*/preimages,
+ expected_prv, expected_pub, desc_index);
+ }
+}
+
+void CheckMultipath(const std::string& prv,
+ const std::string& pub,
+ const std::vector<std::string>& expanded_prvs,
+ const std::vector<std::string>& expanded_pubs,
+ const std::vector<std::string>& expanded_norm_pubs,
+ int flags,
+ const std::vector<std::vector<std::vector<std::string>>>& scripts,
+ const std::optional<OutputType>& type,
+ const std::vector<std::set<std::vector<uint32_t>>>& paths)
+{
+ assert(expanded_prvs.size() == expanded_pubs.size());
+ assert(expanded_prvs.size() == expanded_norm_pubs.size());
+ assert(expanded_prvs.size() == scripts.size());
+ assert(expanded_prvs.size() == paths.size());
+ for (size_t i = 0; i < expanded_prvs.size(); ++i) {
+ Check(prv, pub, expanded_norm_pubs.at(i), flags, scripts.at(i), type, std::nullopt, paths.at(i),
+ /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, /*preimages=*/{},
+ expanded_prvs.at(i), expanded_pubs.at(i), i);
}
}
@@ -441,20 +485,20 @@ BOOST_FIXTURE_TEST_SUITE(descriptor_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(descriptor_test)
{
// Basic single-key compressed
- Check("combo(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "combo(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "combo(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"2103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bdac","76a9149a1c78a507689f6f54b847ad1cef1e614ee23f1e88ac","00149a1c78a507689f6f54b847ad1cef1e614ee23f1e","a91484ab21b1b2fd065d4504ff693d832434b6108d7b87"}}, std::nullopt, /*op_desc_id=*/uint256S("8ef71f7b6ac0918663f6706be469d6109f6922e21f484009d7ab49d77da36e8b"));
- Check("pk(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"2103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bdac"}}, std::nullopt, /*op_desc_id=*/uint256S("5fe175b43c58ac2cdde40521dc7d1dbc607f3dd795d00770206f4fdefb42229e"));
- Check("pkh([deadbeef/1/2'/3/4']L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "pkh([deadbeef/1/2'/3/4']03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "pkh([deadbeef/1/2h/3/4h]03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"76a9149a1c78a507689f6f54b847ad1cef1e614ee23f1e88ac"}}, OutputType::LEGACY, /*op_desc_id=*/uint256S("628130ae0530f2b24faf1ad2744a83568ac0ffac43e703e30c00d5f137869b84"), {{1,0x80000002UL,3,0x80000004UL}});
- Check("wpkh(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"00149a1c78a507689f6f54b847ad1cef1e614ee23f1e"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("4a47b7f497721bf3fc48c69a5d22bc1f3617238649a8ba7cb96fbd92fec84a7e"));
- Check("sh(wpkh(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1))", "sh(wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", "sh(wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", SIGNABLE, {{"a91484ab21b1b2fd065d4504ff693d832434b6108d7b87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256S("a13112753066b5c59473a87c5771b1694a10531944a60e0ab2d7ad66ecb65bcd"));
- Check("tr(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE | XONLY_KEYS, {{"512077aab6e066f8a7419c5ab714c12c67d25007ed55a43cadcacb4d7a970a093f11"}}, OutputType::BECH32M, /*op_desc_id=*/uint256S("4290f3d017b270be53b91abc56d9d2f23a3ff361d5b1d39550ba011e6cae0da5"));
+ Check("combo(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "combo(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "combo(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"2103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bdac","76a9149a1c78a507689f6f54b847ad1cef1e614ee23f1e88ac","00149a1c78a507689f6f54b847ad1cef1e614ee23f1e","a91484ab21b1b2fd065d4504ff693d832434b6108d7b87"}}, std::nullopt, /*op_desc_id=*/uint256{"8ef71f7b6ac0918663f6706be469d6109f6922e21f484009d7ab49d77da36e8b"});
+ Check("pk(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"2103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bdac"}}, std::nullopt, /*op_desc_id=*/uint256{"5fe175b43c58ac2cdde40521dc7d1dbc607f3dd795d00770206f4fdefb42229e"});
+ Check("pkh([deadbeef/1/2'/3/4']L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "pkh([deadbeef/1/2'/3/4']03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "pkh([deadbeef/1/2h/3/4h]03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"76a9149a1c78a507689f6f54b847ad1cef1e614ee23f1e88ac"}}, OutputType::LEGACY, /*op_desc_id=*/uint256{"628130ae0530f2b24faf1ad2744a83568ac0ffac43e703e30c00d5f137869b84"}, {{1,0x80000002UL,3,0x80000004UL}});
+ Check("wpkh(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"00149a1c78a507689f6f54b847ad1cef1e614ee23f1e"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"4a47b7f497721bf3fc48c69a5d22bc1f3617238649a8ba7cb96fbd92fec84a7e"});
+ Check("sh(wpkh(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1))", "sh(wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", "sh(wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", SIGNABLE, {{"a91484ab21b1b2fd065d4504ff693d832434b6108d7b87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256{"a13112753066b5c59473a87c5771b1694a10531944a60e0ab2d7ad66ecb65bcd"});
+ Check("tr(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE | XONLY_KEYS, {{"512077aab6e066f8a7419c5ab714c12c67d25007ed55a43cadcacb4d7a970a093f11"}}, OutputType::BECH32M, /*op_desc_id=*/uint256{"4290f3d017b270be53b91abc56d9d2f23a3ff361d5b1d39550ba011e6cae0da5"});
CheckUnparsable("sh(wpkh(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY2))", "sh(wpkh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5))", "wpkh(): Pubkey '03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5' is invalid"); // Invalid pubkey
CheckUnparsable("pkh(deadbeef/1/2'/3/4']L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "pkh(deadbeef/1/2h/3/4h]03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "pkh(): Key origin start '[ character expected but not found, got 'd' instead"); // Missing start bracket in key origin
CheckUnparsable("pkh([deadbeef]/1/2'/3/4']L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "pkh([deadbeef]/1/2'/3/4']03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "pkh(): Multiple ']' characters found for a single pubkey"); // Multiple end brackets in key origin
// Basic single-key uncompressed
- Check("combo(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "combo(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "combo(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)",SIGNABLE, {{"4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235ac","76a914b5bd079c4d57cc7fc28ecf8213a6b791625b818388ac"}}, std::nullopt, /*op_desc_id=*/uint256S("33f6bb5d32c04e9d9e5466a8212836743bd5466aa0b8d5331ce8aa0812371ffd"));
- Check("pk(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "pk(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "pk(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235ac"}}, std::nullopt, /*op_desc_id=*/uint256S("52306fc1f5d0cb78aacea9d3933092be9252adc27b146f97c16a94d6fcdb652e"));
- Check("pkh(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "pkh(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "pkh(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"76a914b5bd079c4d57cc7fc28ecf8213a6b791625b818388ac"}}, OutputType::LEGACY, /*op_desc_id=*/uint256S("36657e8690d4015032da1a8c1e37b315c3f7ccb010e6ada12967878711962991"));
+ Check("combo(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "combo(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "combo(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)",SIGNABLE, {{"4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235ac","76a914b5bd079c4d57cc7fc28ecf8213a6b791625b818388ac"}}, std::nullopt, /*op_desc_id=*/uint256{"33f6bb5d32c04e9d9e5466a8212836743bd5466aa0b8d5331ce8aa0812371ffd"});
+ Check("pk(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "pk(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "pk(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235ac"}}, std::nullopt, /*op_desc_id=*/uint256{"52306fc1f5d0cb78aacea9d3933092be9252adc27b146f97c16a94d6fcdb652e"});
+ Check("pkh(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "pkh(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "pkh(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"76a914b5bd079c4d57cc7fc28ecf8213a6b791625b818388ac"}}, OutputType::LEGACY, /*op_desc_id=*/uint256{"36657e8690d4015032da1a8c1e37b315c3f7ccb010e6ada12967878711962991"});
CheckUnparsable("wpkh(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "wpkh(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "wpkh(): Uncompressed keys are not allowed"); // No uncompressed keys in witness
CheckUnparsable("wsh(pk(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss))", "wsh(pk(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235))", "pk(): Uncompressed keys are not allowed"); // No uncompressed keys in witness
CheckUnparsable("sh(wpkh(5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss))", "sh(wpkh(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235))", "wpkh(): Uncompressed keys are not allowed"); // No uncompressed keys in witness
@@ -474,16 +518,16 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
Check("tr(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5,{pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5),{pk(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1),pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5)}})", "tr(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5,{pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5),{pk(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd),pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5)}})", "tr(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5,{pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5),{pk(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd),pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5)}})", XONLY_KEYS | SIGNABLE | MISSING_PRIVKEYS, {{"51201497ae16f30dacb88523ed9301bff17773b609e8a90518a3f96ea328a47d1500"}}, OutputType::BECH32M);
// Versions with BIP32 derivations
- Check("combo([01234567]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)", "combo([01234567]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)", "combo([01234567]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)", SIGNABLE, {{"2102d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0ac","76a91431a507b815593dfc51ffc7245ae7e5aee304246e88ac","001431a507b815593dfc51ffc7245ae7e5aee304246e","a9142aafb926eb247cb18240a7f4c07983ad1f37922687"}}, std::nullopt, /*op_desc_id=*/uint256S("7f127f7861594e3ede449eb47a7cc623c753acc0b0f0fc03fbb2dac636c20d6f"));
- Check("pk(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0)", "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)", "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)", DEFAULT, {{"210379e45b3cf75f9c5f9befd8e9506fb962f6a9d185ac87001ec44a8d3df8d4a9e3ac"}}, std::nullopt, /*op_desc_id=*/uint256S("0e54cf04f2bb8d607e2241d611d169c6f7d78f0ab1f15a80642192a19fbdb7cc"), {{0}});
- Check("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647'/0)", "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647'/0)", "pkh([bd16bee5/2147483647h]xpub69H7F5dQzmVd3vPuLKtcXJziMEQByuDidnX3YdwgtNsecY5HRGtAAQC5mXTt4dsv9RzyjgDjAQs9VGVV6ydYCHnprc9vvaA5YtqWyL6hyds/0)", HARDENED, {{"76a914ebdc90806a9c4356c1c88e42216611e1cb4c1c1788ac"}}, OutputType::LEGACY, /*op_desc_id=*/uint256S("35a5cf511e941a35b9cb0cf515d3ef887aa4246db87d6af463265a386ad856fe"), {{0xFFFFFFFFUL,0}});
+ Check("combo([01234567]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)", "combo([01234567]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)", "combo([01234567]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)", SIGNABLE, {{"2102d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0ac","76a91431a507b815593dfc51ffc7245ae7e5aee304246e88ac","001431a507b815593dfc51ffc7245ae7e5aee304246e","a9142aafb926eb247cb18240a7f4c07983ad1f37922687"}}, std::nullopt, /*op_desc_id=*/uint256{"7f127f7861594e3ede449eb47a7cc623c753acc0b0f0fc03fbb2dac636c20d6f"});
+ Check("pk(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0)", "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)", "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)", DEFAULT, {{"210379e45b3cf75f9c5f9befd8e9506fb962f6a9d185ac87001ec44a8d3df8d4a9e3ac"}}, std::nullopt, /*op_desc_id=*/uint256{"0e54cf04f2bb8d607e2241d611d169c6f7d78f0ab1f15a80642192a19fbdb7cc"}, {{0}});
+ Check("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647'/0)", "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647'/0)", "pkh([bd16bee5/2147483647h]xpub69H7F5dQzmVd3vPuLKtcXJziMEQByuDidnX3YdwgtNsecY5HRGtAAQC5mXTt4dsv9RzyjgDjAQs9VGVV6ydYCHnprc9vvaA5YtqWyL6hyds/0)", HARDENED, {{"76a914ebdc90806a9c4356c1c88e42216611e1cb4c1c1788ac"}}, OutputType::LEGACY, /*op_desc_id=*/uint256{"35a5cf511e941a35b9cb0cf515d3ef887aa4246db87d6af463265a386ad856fe"}, {{0xFFFFFFFFUL,0}});
Check("wpkh([ffffffff/13']xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/1/2/*)", "wpkh([ffffffff/13']xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*)", "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*)", RANGE, {{"0014326b2249e3a25d5dc60935f044ee835d090ba859"},{"0014af0bd98abc2f2cae66e36896a39ffe2d32984fb7"},{"00141fa798efd1cbf95cebf912c031b8a4a6e9fb9f27"}}, OutputType::BECH32, /*op_desc_id=*/std::nullopt, {{0x8000000DUL, 1, 2, 0}, {0x8000000DUL, 1, 2, 1}, {0x8000000DUL, 1, 2, 2}});
Check("sh(wpkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*'))", "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*'))", "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*h))", RANGE | HARDENED | DERIVE_HARDENED, {{"a9149a4d9901d6af519b2a23d4a2f51650fcba87ce7b87"},{"a914bed59fc0024fae941d6e20a3b44a109ae740129287"},{"a9148483aa1116eb9c05c482a72bada4b1db24af654387"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/std::nullopt, {{10, 20, 30, 40, 0x80000000UL}, {10, 20, 30, 40, 0x80000001UL}, {10, 20, 30, 40, 0x80000002UL}});
Check("combo(xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334/*)", "combo(xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV/*)", "combo(xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV/*)", RANGE, {{"2102df12b7035bdac8e3bab862a3a83d06ea6b17b6753d52edecba9be46f5d09e076ac","76a914f90e3178ca25f2c808dc76624032d352fdbdfaf288ac","0014f90e3178ca25f2c808dc76624032d352fdbdfaf2","a91408f3ea8c68d4a7585bf9e8bda226723f70e445f087"},{"21032869a233c9adff9a994e4966e5b821fd5bac066da6c3112488dc52383b4a98ecac","76a914a8409d1b6dfb1ed2a3e8aa5e0ef2ff26b15b75b788ac","0014a8409d1b6dfb1ed2a3e8aa5e0ef2ff26b15b75b7","a91473e39884cb71ae4e5ac9739e9225026c99763e6687"}}, std::nullopt, /*op_desc_id=*/std::nullopt, {{0}, {1}});
Check("tr(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/0/*,pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/*))", "tr(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/0/*,pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/*))", "tr(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/0/*,pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/*))", XONLY_KEYS | RANGE, {{"512078bc707124daa551b65af74de2ec128b7525e10f374dc67b64e00ce0ab8b3e12"}, {"512001f0a02a17808c20134b78faab80ef93ffba82261ccef0a2314f5d62b6438f11"}, {"512021024954fcec88237a9386fce80ef2ced5f1e91b422b26c59ccfc174c8d1ad25"}}, OutputType::BECH32M, /*op_desc_id=*/std::nullopt, {{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}});
// Mixed xpubs and const pubkeys
- Check("wsh(multi(1,xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334/0,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1))","wsh(multi(1,xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV/0,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))","wsh(multi(1,xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV/0,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", MIXED_PUBKEYS, {{"0020cb155486048b23a6da976d4c6fe071a2dbc8a7b57aaf225b8955f2e2a27b5f00"}},OutputType::BECH32, /*op_desc_id=*/uint256S("88af8e5951779aa054dfe1071ef0f7266ba1c5558487bfd8525c95010fc0aba2"),{{0},{}});
+ Check("wsh(multi(1,xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334/0,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1))","wsh(multi(1,xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV/0,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))","wsh(multi(1,xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV/0,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", MIXED_PUBKEYS, {{"0020cb155486048b23a6da976d4c6fe071a2dbc8a7b57aaf225b8955f2e2a27b5f00"}},OutputType::BECH32, /*op_desc_id=*/uint256{"88af8e5951779aa054dfe1071ef0f7266ba1c5558487bfd8525c95010fc0aba2"},{{0},{}});
// Mixed range xpubs and const pubkeys
Check("multi(1,xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334/*,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)","multi(1,xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV/*,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)","multi(1,xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV/*,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", RANGE | MIXED_PUBKEYS, {{"512102df12b7035bdac8e3bab862a3a83d06ea6b17b6753d52edecba9be46f5d09e0762103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd52ae"},{"5121032869a233c9adff9a994e4966e5b821fd5bac066da6c3112488dc52383b4a98ec2103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd52ae"},{"5121035d30b6c66dc1e036c45369da8287518cf7e0d6ed1e2b905171c605708f14ca032103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd52ae"}}, std::nullopt, /*op_desc_id=*/std::nullopt,{{2},{1},{0},{}});
@@ -492,15 +536,302 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
CheckUnparsable("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/1aa)", "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1aa)", "pkh(): Key path value '1aa' is not a valid uint32"); // Path is not valid uint
Check("pkh([01234567/10/20]xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647'/0)", "pkh([01234567/10/20]xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647'/0)", "pkh([01234567/10/20/2147483647h]xpub69H7F5dQzmVd3vPuLKtcXJziMEQByuDidnX3YdwgtNsecY5HRGtAAQC5mXTt4dsv9RzyjgDjAQs9VGVV6ydYCHnprc9vvaA5YtqWyL6hyds/0)", HARDENED, {{"76a914ebdc90806a9c4356c1c88e42216611e1cb4c1c1788ac"}}, OutputType::LEGACY, /*op_desc_id=*/std::nullopt, {{10, 20, 0xFFFFFFFFUL, 0}});
+ // Multipath versions with BIP32 derivations
+ CheckMultipath("pk(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/<0;1>)",
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/<0;1>)",
+ {
+ "pk(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0)",
+ "pk(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/1)",
+ },
+ {
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)",
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/1)",
+ },
+ {
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)",
+ "pk(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/1)",
+ },
+ DEFAULT,
+ {
+ {{"210379e45b3cf75f9c5f9befd8e9506fb962f6a9d185ac87001ec44a8d3df8d4a9e3ac"}},
+ {{"21034f8d02282ac6786737d0f37f0df7655f49daa24843bc7de3f4ea88603d26d10aac"}},
+ },
+ std::nullopt,
+ {
+ {{0}},
+ {{1}},
+ }
+ );
+ CheckMultipath("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<2147483647h;0>/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<2147483647h;0>/0)",
+ {
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647h/0)",
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/0/0)",
+ },
+ {
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647h/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0/0)",
+ },
+ {
+ "pkh([bd16bee5/2147483647h]xpub69H7F5dQzmVd3vPuLKtcXJziMEQByuDidnX3YdwgtNsecY5HRGtAAQC5mXTt4dsv9RzyjgDjAQs9VGVV6ydYCHnprc9vvaA5YtqWyL6hyds/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0/0)",
+ },
+ HARDENED,
+ {
+ {{"76a914ebdc90806a9c4356c1c88e42216611e1cb4c1c1788ac"}},
+ {{"76a914f103317b9f0b758a62cb3879281d23e3b1deb90d88ac"}},
+ },
+ OutputType::LEGACY,
+ {
+ {{0xFFFFFFFFUL,0}},
+ {{0,0}},
+ }
+ );
+ CheckMultipath("wpkh([ffffffff/13h]xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/<1;3>/2/*)",
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/<1;3>/2/*)",
+ {
+ "wpkh([ffffffff/13h]xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/1/2/*)",
+ "wpkh([ffffffff/13h]xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/3/2/*)",
+ },
+ {
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*)",
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/3/2/*)",
+ },
+ {
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*)",
+ "wpkh([ffffffff/13h]xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/3/2/*)",
+ },
+ RANGE,
+ {
+ {{"0014326b2249e3a25d5dc60935f044ee835d090ba859"},{"0014af0bd98abc2f2cae66e36896a39ffe2d32984fb7"},{"00141fa798efd1cbf95cebf912c031b8a4a6e9fb9f27"}},
+ {{"001426183882ef9c76b9a44386e9b387f33cee7c3a2d"},{"001447c1b9dc215c3f8b47e572981eb97528768cde4e"},{"00146e92cbaa397f9caeccf9a049460258af6ccd67e2"}},
+ },
+ OutputType::BECH32,
+ {
+ {{0x8000000DUL, 1, 2, 0}, {0x8000000DUL, 1, 2, 1}, {0x8000000DUL, 1, 2, 2}},
+ {{0x8000000DUL, 3, 2, 0}, {0x8000000DUL, 3, 2, 1}, {0x8000000DUL, 3, 2, 2}},
+ }
+ );
+ CheckMultipath("sh(wpkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/<10;100h>/20/30/40/*h))",
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/<10;100h>/20/30/40/*h))",
+ {
+ "sh(wpkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*h))",
+ "sh(wpkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/100h/20/30/40/*h))",
+ },
+ {
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*h))",
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/100h/20/30/40/*h))",
+ },
+ {
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*h))",
+ "sh(wpkh(xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/100h/20/30/40/*h))",
+ },
+ RANGE | HARDENED | DERIVE_HARDENED,
+ {
+ {{"a9149a4d9901d6af519b2a23d4a2f51650fcba87ce7b87"},{"a914bed59fc0024fae941d6e20a3b44a109ae740129287"},{"a9148483aa1116eb9c05c482a72bada4b1db24af654387"}},
+ {{"a91470192039cb9529aadf4e53e46d9ac6a13790865787"},{"a914855859faffabf1e4ed2bb7411ab66f4599b1abd287"},{"a9148f2cfd4b486de247c44684160da164617ccf2c2687"}},
+ },
+ OutputType::P2SH_SEGWIT,
+ {
+ {{10, 20, 30, 40, 0x80000000UL}, {10, 20, 30, 40, 0x80000001UL}, {10, 20, 30, 40, 0x80000002UL}},
+ {{0x80000064UL, 20, 30, 40, 0x80000000UL}, {0x80000064UL, 20, 30, 40, 0x80000001UL}, {0x80000064UL, 20, 30, 40, 0x80000002UL}},
+ }
+ );
+ CheckMultipath("multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2>/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/<3;4>/0/*)",
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2>/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/<3;4>/0/*)",
+ {
+ "multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/3/0/*)",
+ "multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/2/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/4/0/*)",
+ },
+ {
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/3/0/*)",
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/4/0/*)",
+ },
+ {
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/3/0/*)",
+ "multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/4/0/*)",
+ },
+ RANGE,
+ {
+ {{"522103095e95d8c50ae3f3fea93fa8e983f710489f60ff681a658c06eba64622c824b121020443e9e729b42628913f1a69b46b7d43ff87c46e86140e12ee420d7e2e8caf8c52ae"},{"5221027512d6bd74e24eeb1ad752d5be800adc5886ded11c5293a9a701db83658b526a2102371e912dea5fefa56158908fe4c9f66bc925a8939b10f3821e8f8be797b9ca8252ae"},{"522102cc9fd211dc0a1c8bb7a106ff831be0e253bc992f21d08fb8a6fd43fae51b9b892103e43eddc68afc9746c9d09ce0bf8067b4f2416287abbc422ed1ac300673b1104952ae"}},
+ {{"5221031c0517fff3d483f06ca769bd2326bf30aca1c4de278e676e6ef760c3301244c6210316e171ff4f82dc62ad3f0d84c97865034fc5041eaa508b48c1d7af77f301c8bd52ae"},{"52210240f010ccff4202ade2ef87756f6b9af57bbf5ebcb0393b949e6e5d45d30bff36210229057a7e03510b8cb66727fab3f47a52a02ea94eae03e7c2e81b72a26781bfde52ae"},{"5221034052522058a07b647bd08fa1a9eaedae0222eac76ddd122ff8096ec969398de721038cb8180dd4c956848bcf191e45aaf297146207559fb8737881156aadaf13704152ae"}},
+ },
+ std::nullopt,
+ {
+ {{1, 0}, {1, 1}, {1, 2}, {3, 0, 0}, {3, 0, 1}, {3, 0, 2}},
+ {{2, 0}, {2, 1}, {2, 2}, {4, 0, 0}, {4, 0, 1}, {4, 0, 2}},
+ }
+ );
+ CheckMultipath("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0;1;2>)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0;1;2>)",
+ {
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/0)",
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/1)",
+ "pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2)",
+ },
+ {
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2)",
+ },
+ {
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1)",
+ "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2)",
+ },
+ DEFAULT,
+ {
+ {{"76a9145a61ff8eb7aaca3010db97ebda76121610b7809688ac"}},
+ {{"76a9142f792a782cf4adbb321fe646c8e220563649b8fa88ac"}},
+ {{"76a914dcc5b93b52177d78f97b3f2d259b9a86ee1403b188ac"}},
+ },
+ OutputType::LEGACY,
+ {
+ {{0}},
+ {{1}},
+ {{2}},
+ }
+ );
+ CheckMultipath("sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*))",
+ {
+ "sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/3/*))",
+ "sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/2/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/4/*))",
+ "sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/3/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/5/*))",
+ },
+ {
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*))",
+ },
+ {
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*))",
+ "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*))",
+ },
+ RANGE,
+ {
+ {{"a914689cdf7de5836ec04fb971d128cc84858f73e11487"},{"a9142ea7dbaf0a77ee19f080cdacb3e13560e3cd9cf587"},{"a9143da854021f58f5e2d3ff6bb4fcd0ced877deb34987"}},
+ {{"a9143dd613d162e89b83369bbf08e5f1977cfdc9b02787"},{"a91449eef5d3df5c465b20a630c66058fe689082d8e187"},{"a91492be56babf54ea2109c577f799ba6d73948e8c3287"}},
+ {{"a9140093ca92097bdf557fbb0570bb77e1efd2e7529c87"},{"a914e4d0419d3d2ce8f921a800796811ff5462bb151887"},{"a914997bf69841ac444190dc02f5e6031dd6f8feab4587"}},
+ },
+ OutputType::LEGACY,
+ {
+ {{1, 0, 0}, {1, 0, 1}, {1, 0, 2}, {0, 0}, {0, 1}, {0, 2}, {0, 0, 3, 0}, {0, 0, 3, 1}, {0, 0, 3, 2}},
+ {{2, 0, 0}, {2, 0, 1}, {2, 0, 2}, {0, 0}, {0, 1}, {0, 2}, {0, 0, 4, 0}, {0, 0, 4, 1}, {0, 0, 4, 2}},
+ {{3, 0, 0}, {3, 0, 1}, {3, 0, 2}, {0, 0}, {0, 1}, {0, 2}, {0, 0, 5, 0}, {0, 0, 5, 1}, {0, 0, 5, 2}},
+ }
+ );
+ CheckMultipath("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/<6;7;8>/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/<6;7;8>/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*)})",
+ {
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/3/*)})",
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/7/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/2/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/4/*)})",
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/8/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/3/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/5/*)})",
+ },
+ {
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/7/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/8/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*)})",
+ },
+ {
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/7/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/8/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*)})",
+ },
+ XONLY_KEYS | RANGE,
+ {
+ {{"5120993e5b1d71d14cbb0a90c57ea0fed1d5bf77d5804cee206c3dbd7e4d2c67d869"},{"51207b8f629f6d406b92ffa6284f5545085eafb837c469018b715755f619b587163b"},{"512061f52925826e51e4615007557ddbea55b22c817909d7ebcfd3c454c634643ece"}},
+ {{"5120633808b2156d0a6597e8b07f59c387bb4c2d5c02c4cb98f1802748e64c6abf5f"},{"5120fc5f06ded29328c170bf7e49e71c9cc8699befa2bf0a2a80802a1f32ab72d291"},{"5120fd05e2227e0dac972dff9941e332db8461bedc320c2a74def44e469ddbad9d21"}},
+ {{"51205d19538c7c0901520eb712d079ae6eebed4f691021da466dc24e9575d9815ad0"},{"5120b9fc348ede2b7b9fb1f84c21741bb36bb3fa0905d0bc9417e07145d3142673f7"},{"51203a655bc5181b12efac82a5a5d1d0969b2ceb92c6fc37f505fdf00ee8afa09b33"}},
+ },
+ OutputType::BECH32M,
+ {
+ {{6, 0}, {6, 1}, {6, 2}, {1, 0, 0}, {1, 0, 1}, {1, 0, 2}, {0, 0, 3, 0}, {0, 0, 3, 1}, {0, 0, 3, 2}},
+ {{7, 0}, {7, 1}, {7, 2}, {2, 0, 0}, {2, 0, 1}, {2, 0, 2}, {0, 0, 4, 0}, {0, 0, 4, 1}, {0, 0, 4, 2}},
+ {{8, 0}, {8, 1}, {8, 2}, {3, 0, 0}, {3, 0, 1}, {3, 0, 2}, {0, 0, 5, 0}, {0, 0, 5, 1}, {0, 0, 5, 2}},
+ }
+ );
+ CheckMultipath("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*)})",
+ {
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/1/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/3/*)})",
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/2/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/4/*)})",
+ "tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/3/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/5/*)})",
+ },
+ {
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*)})",
+ },
+ {
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/3/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/2/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/4/*)})",
+ "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/3/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/5/*)})",
+ },
+ XONLY_KEYS | RANGE,
+ {
+ {{"5120993e5b1d71d14cbb0a90c57ea0fed1d5bf77d5804cee206c3dbd7e4d2c67d869"},{"51207b8f629f6d406b92ffa6284f5545085eafb837c469018b715755f619b587163b"},{"512061f52925826e51e4615007557ddbea55b22c817909d7ebcfd3c454c634643ece"}},
+ {{"5120c481a8ada38d1070094f62af526d4f8aae2eb1e44d1fd961be6a25198b4da77b"},{"512034a2d31c091905e62def62b575b88beff41723d83acb02dfada2e73d9c529b40"},{"5120e0ecc278655b092962ded92a5781bd8e86e8408055de05f121e107fa211e5dfb"}},
+ {{"51206052cff5efc848e4b38a947803943eb1eb0076523eec1041969851ebcd265555"},{"512009ed83d758c0bdd36e225c961810761c7a360533434a41a17bba709e331e6cd1"},{"5120fcd77851ebaac37564b87e9b351c54492a8fbb1d6afdf7f3a9317703a002b22b"}},
+ },
+ OutputType::BECH32M,
+ {
+ {{6, 0}, {6, 1}, {6, 2}, {1, 0, 0}, {1, 0, 1}, {1, 0, 2}, {0, 0, 3, 0}, {0, 0, 3, 1}, {0, 0, 3, 2}},
+ {{6, 0}, {6, 1}, {6, 2}, {2, 0, 0}, {2, 0, 1}, {2, 0, 2}, {0, 0, 4, 0}, {0, 0, 4, 1}, {0, 0, 4, 2}},
+ {{6, 0}, {6, 1}, {6, 2}, {3, 0, 0}, {3, 0, 1}, {3, 0, 2}, {0, 0, 5, 0}, {0, 0, 5, 1}, {0, 0, 5, 2}},
+ }
+ );
+ CheckMultipath("wsh(or_d(pk([2557c640/48h/1h/0h/2h]xprv9ws7hGFQPbDga6QrETbFM7Gqc7m15UNoJ7KF5kkDhyZCBcANAqRMUCytQ4JM1nLSYvGyFjg6TvBEfNrN3znaFdb67jQoQ7z9kFnd4BUUJiE/<0;1>/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xprv9ws7hGFQPbDgbCvNcYVfGeGK8UTSFmAho4iAXZf13yQVJmHuKHN9oMXCv7zsJn8Dcqvqy2iugFWAhDdUUX6r5VLNWkRTpxVoQJ6DbzY9eYa/<0;1>/*),older(2))))",
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/<0;1>/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/<0;1>/*),older(2))))",
+ {
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xprv9ws7hGFQPbDga6QrETbFM7Gqc7m15UNoJ7KF5kkDhyZCBcANAqRMUCytQ4JM1nLSYvGyFjg6TvBEfNrN3znaFdb67jQoQ7z9kFnd4BUUJiE/0/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xprv9ws7hGFQPbDgbCvNcYVfGeGK8UTSFmAho4iAXZf13yQVJmHuKHN9oMXCv7zsJn8Dcqvqy2iugFWAhDdUUX6r5VLNWkRTpxVoQJ6DbzY9eYa/0/*),older(2))))",
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xprv9ws7hGFQPbDga6QrETbFM7Gqc7m15UNoJ7KF5kkDhyZCBcANAqRMUCytQ4JM1nLSYvGyFjg6TvBEfNrN3znaFdb67jQoQ7z9kFnd4BUUJiE/1/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xprv9ws7hGFQPbDgbCvNcYVfGeGK8UTSFmAho4iAXZf13yQVJmHuKHN9oMXCv7zsJn8Dcqvqy2iugFWAhDdUUX6r5VLNWkRTpxVoQJ6DbzY9eYa/1/*),older(2))))",
+ },
+ {
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/0/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/0/*),older(2))))",
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/1/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/1/*),older(2))))"
+ },
+ {
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/0/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/0/*),older(2))))",
+ "wsh(or_d(pk([2557c640/48h/1h/0h/2h]xpub6ArU6mnJDxmynaVKLV8FiFDaA9bVUw6efLEqt99qGK6B4QVWiNjc21JNFKkXNjgT8NCUmpFpSSBrYFtWEAqGirbqT4J1bRFpWyAnYdzmZUm/1/*),and_v(v:pkh([00aabb22/48h/1h/0h/2h]xpub6ArU6mnJDxmyogzqia2fdnD3gWHvfDtZAHdmKx4ccJwUBZd3rpgQM9qgmPAn1mqT2yh81uvGGohMkg3fNLoXZzn7sRo4a1X3KnCAVot2yuS/1/*),older(2))))"
+ },
+ RANGE,
+ {
+ {{"0020538436a60f2a638ea9e1e1342e9b93374aa7ec559ff0a805b3a185d4ba855d7f"},{"00203a588d107d604b6913201c7c1e1722f07a0f8fb3a382744f17b9ae5f6ccfcdd7"},{"0020d30fb375f7c491a208e77c7b5d0996ca14cf4a770c2ab5981f915c0e4565c74a"}},
+ {{"002072b5fc3a691c48fdbaf485f27e787b4094055d4b434c90c81ed1090f3d48733b"},{"0020a9ccdf4496e5d60db4704b27494d9d74f54a16c180ff954a43ce5e3aa465113a"},{"0020d17e21820a0069ca87049513eca763f08a74b586724441e7d76fc5142bcc327c"}},
+ },
+ OutputType::BECH32,
+ {
+ {{0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 0, 0}, {0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 0, 1}, {0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 0, 2}},
+ {{0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 1, 0}, {0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 1, 1}, {0x80000000UL + 48, 0x80000000UL + 1, 0x80000000UL, 0x80000000UL + 2, 1, 2}},
+ }
+ );
+ CheckUnparsable("pkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0;1>/<2;3>)", "pkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0;1>/<2;3>)", "pkh(): Multiple multipath key path specifiers found");
+ CheckUnparsable("pkh([deadbeef/<0;1>]xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/0)", "pkh([deadbeef/<0;1>]xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0)", "pkh(): Key path value \'<0;1>\' specifies multipath in a section where multipath is not allowed");
+ CheckUnparsable("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/6/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4>/*)})", "tr(xpub6B4sSbNr8XFYXqqKB7PeUemqgEaVtCLjgd5Lf2VYtezSHozC7ffCvVNCyu9TCgHntRQdimjV3tHbxmNfocxtuh6saNtZEw91gjXLRhQ3Yar/6/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub6AhFhZJJGt9YB8i85RfrJ8jT3T2FF5EejDCXqXfm1DAczFEXkk8HD3CXTg2TmKM8wTbSnSw3wPg5JuyLitUrpRmkjn2BQXyZnqJx16AGy94/0/0/<3;4>/*)})", "tr(): Multipath subscripts have mismatched lengths");
+ CheckUnparsable("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/<6;7;8;9>/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*)})", "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/<6;7;8;9>/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*)})", "tr(): Multipath subscripts have mismatched lengths");
+ CheckUnparsable("tr(xprv9s21ZrQH143K2Zu2kTVKcQi9nKhfgJUkYqG73wXsHuhATm1wkt6kcSZeTYEw2PL7krZtJopEYDvBdYWdAai3n3TWUTCVfHvPHqTYJv7smYe/<6;7>/*,{pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*),pk(xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4;5>/*)})", "tr(xpub661MyMwAqRbcF3yVrV2KyYetLMYA5mCbv4BhrKwUrFE9LZM6JRR1AEt8Jq4V4C8LwtTke6YEEdCZqgXp85YRk2j74EfJKhe3QybQ9kcUjs4/<6;7>/*,{pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*),pk(xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4;5>/*)})", "tr(): Multipath internal key mismatches multipath subscripts lengths");
+ CheckUnparsable("sh(multi(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/<1;2;3>/0/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/*,xprv9s21ZrQH143K3jUwNHoqQNrtzJnJmx4Yup8NkNLdVQCymYbPbJXnPhwkfTfxZfptcs3rLAPUXS39oDLgrNKQGwbGsEmJJ8BU3RzQuvShEG4/0/0/<3;4>/*))", "sh(multi(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/<1;2;3>/0/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/*,xpub661MyMwAqRbcGDZQUKLqmWodYLcoBQnQH33yYkkF3jjxeLvY8qr2wWGEWkiKFaaQfJCoi3HeEq3Dc5DptfbCyjD38fNhSqtKc1UHaP4ba3t/0/0/<3;4>/*))", "multi(): Multipath derivation paths have mismatched lengths");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0>/*)", "wpkh(): Multipath key path specifiers must have at least two items");
+ CheckUnparsable("wsh(andor(pk(xprv9xGFvhWa1Koc8dmeEG5JXVfMaNBkioYscFGmn7yx8YnhFQYeydFfudxdKRzR5p7v1kip85ohB6eUQbPpAee9cFZu9M85G9X4ovPP4xw4xbM/0'/<0;1;2;3>/*),older(10000),pk(xprv9x9bas78RYwopceXTStT8vDuTiu6g1u91L6sG3DhHfDDXKPrYdcHcDuDw4Hv1kjZBWKoZnobUHrdoFxBPUMBTMruUs8HwzL8GxGA95MmZ7v/8/<0;1;2>/*)))", "wsh(andor(pk(xpub6BFcLD3TqhMuM7r7LHcJtdc68Q2F8GGiyUCNaWPZgtKg8CsoXAZvTSH7AhaCPnuuewjwzA2gbAm1y6uaDNNxa7JqTiL76cdioT5rxjgxWXF/0'/<0;1;2;3>/*),older(10000),pk(xpub6B8wzNe2FvW736izZURTW4Ae1kjb5UczNZ2U4RdJqzkCQ7j16AvYA2DhnL8Kb5FeWAZJ43NnGPdjpeSKvAeM8YGaqhCzpD743Uv6S87hfAt/8/<0;1;2>/*)))", "Miniscript: Multipath derivation paths have mismatched lengths");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<>/*)", "wpkh(): Multipath key path specifiers must have at least two items");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0/*)", "wpkh(): Key path value '<0' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/0>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/0>/*)", "wpkh(): Key path value '0>' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0;>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0;>/*)", "wpkh(): Key path value '' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<;1>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<;1>/*)", "wpkh(): Key path value '' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<0;1;>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<0;1;>/*)", "wpkh(): Key path value '' is not a valid uint32");
+ CheckUnparsable("wpkh(xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/<1;1>/*)", "wpkh(xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/<1;1>/*)", "wpkh(): Duplicated key path value 1 in multipath specifier");
+
// Multisig constructions
- Check("multi(1,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "multi(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "multi(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"512103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea23552ae"}}, std::nullopt, /*op_desc_id=*/uint256S("b147e25eb4a9d3da4e86ed8e970d817563ae2cb9c71a756b11cfdeb4dc11b70c"));
- Check("sortedmulti(1,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "sortedmulti(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "sortedmulti(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"512103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea23552ae"}}, std::nullopt, /*op_desc_id=*/uint256S("62b59d1e32a62176ef7a17538f3b80c7d1afc53e5644eb753525bdb5d556486c"));
+ Check("multi(1,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "multi(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "multi(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"512103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea23552ae"}}, std::nullopt, /*op_desc_id=*/uint256{"b147e25eb4a9d3da4e86ed8e970d817563ae2cb9c71a756b11cfdeb4dc11b70c"});
+ Check("sortedmulti(1,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "sortedmulti(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "sortedmulti(1,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", SIGNABLE, {{"512103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea23552ae"}}, std::nullopt, /*op_desc_id=*/uint256{"62b59d1e32a62176ef7a17538f3b80c7d1afc53e5644eb753525bdb5d556486c"});
Check("sortedmulti(1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "sortedmulti(1,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "sortedmulti(1,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", SIGNABLE, {{"512103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea23552ae"}}, std::nullopt);
Check("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))", "sh(multi(2,[00000000/111'/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))", "sh(multi(2,[00000000/111h/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))", DEFAULT, {{"a91445a9a622a8b0a1269944be477640eedc447bbd8487"}}, OutputType::LEGACY, /*op_desc_id=*/std::nullopt, {{0x8000006FUL,222},{0}});
Check("sortedmulti(2,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc/*,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0/0/*)", "sortedmulti(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/0/*)", "sortedmulti(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/0/*)", RANGE, {{"5221025d5fc65ebb8d44a5274b53bac21ff8307fec2334a32df05553459f8b1f7fe1b62102fbd47cc8034098f0e6a94c6aeee8528abf0a2153a5d8e46d325b7284c046784652ae"}, {"52210264fd4d1f5dea8ded94c61e9641309349b62f27fbffe807291f664e286bfbe6472103f4ece6dfccfa37b211eb3d0af4d0c61dba9ef698622dc17eecdf764beeb005a652ae"}, {"5221022ccabda84c30bad578b13c89eb3b9544ce149787e5b538175b1d1ba259cbb83321024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c52ae"}}, std::nullopt, /*op_desc_id=*/std::nullopt, {{0}, {1}, {2}, {0, 0, 0}, {0, 0, 1}, {0, 0, 2}});
Check("wsh(multi(2,xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647'/0,xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/1/2/*,xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*'))", "wsh(multi(2,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647'/0,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*,xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*'))", "wsh(multi(2,[bd16bee5/2147483647h]xpub69H7F5dQzmVd3vPuLKtcXJziMEQByuDidnX3YdwgtNsecY5HRGtAAQC5mXTt4dsv9RzyjgDjAQs9VGVV6ydYCHnprc9vvaA5YtqWyL6hyds/0,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*,xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*h))", HARDENED | RANGE | DERIVE_HARDENED, {{"0020b92623201f3bb7c3771d45b2ad1d0351ea8fbf8cfe0a0e570264e1075fa1948f"},{"002036a08bbe4923af41cf4316817c93b8d37e2f635dd25cfff06bd50df6ae7ea203"},{"0020a96e7ab4607ca6b261bfe3245ffda9c746b28d3f59e83d34820ec0e2b36c139c"}}, OutputType::BECH32, /*op_desc_id=*/std::nullopt, {{0xFFFFFFFFUL,0}, {1,2,0}, {1,2,1}, {1,2,2}, {10, 20, 30, 40, 0x80000000UL}, {10, 20, 30, 40, 0x80000001UL}, {10, 20, 30, 40, 0x80000002UL}});
Check("sh(wsh(multi(16,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy,KwGNz6YCCQtYvFzMtrC6D3tKTKdBBboMrLTsjr2NYVBwapCkn7Mr,KxogYhiNfwxuswvXV66eFyKcCpm7dZ7TqHVqujHAVUjJxyivxQ9X,L2BUNduTSyZwZjwNHynQTF14mv2uz2NRq5n5sYWTb4FkkmqgEE9f,L1okJGHGn1kFjdXHKxXjwVVtmCMR2JA5QsbKCSpSb7ReQjezKeoD,KxDCNSST75HFPaW5QKpzHtAyaCQC7p9Vo3FYfi2u4dXD1vgMiboK,L5edQjFtnkcf5UWURn6UuuoFrabgDQUHdheKCziwN42aLwS3KizU,KzF8UWFcEC7BYTq8Go1xVimMkDmyNYVmXV5PV7RuDicvAocoPB8i,L3nHUboKG2w4VSJ5jYZ5CBM97oeK6YuKvfZxrefdShECcjEYKMWZ,KyjHo36dWkYhimKmVVmQTq3gERv3pnqA4xFCpvUgbGDJad7eS8WE,KwsfyHKRUTZPQtysN7M3tZ4GXTnuov5XRgjdF2XCG8faAPmFruRF,KzCUbGhN9LJhdeFfL9zQgTJMjqxdBKEekRGZX24hXdgCNCijkkap,KzgpMBwwsDLwkaC5UrmBgCYaBD2WgZ7PBoGYXR8KT7gCA9UTN5a3,KyBXTPy4T7YG4q9tcAM3LkvfRpD1ybHMvcJ2ehaWXaSqeGUxEdkP,KzJDe9iwJRPtKP2F2AoN6zBgzS7uiuAwhWCfGdNeYJ3PC1HNJ8M8,L1xbHrxynrqLKkoYc4qtoQPx6uy5qYXR5ZDYVYBSRmCV5piU3JG9)))","sh(wsh(multi(16,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232)))", "sh(wsh(multi(16,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232)))", SIGNABLE, {{"a9147fc63e13dc25e8a95a3cee3d9a714ac3afd96f1e87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/std::nullopt);
- Check("tr(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,pk(KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,pk(669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,pk(669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))", SIGNABLE | XONLY_KEYS, {{"512017cf18db381d836d8923b1bdb246cfcd818da1a9f0e6e7907f187f0b2f937754"}}, OutputType::BECH32M, /*op_desc_id=*/uint256S("af482b44c10b737b678e1091584818372e169e2dc5219e2877fabe1b83ae467b"));
+ Check("tr(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,pk(KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,pk(669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,pk(669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))", SIGNABLE | XONLY_KEYS, {{"512017cf18db381d836d8923b1bdb246cfcd818da1a9f0e6e7907f187f0b2f937754"}}, OutputType::BECH32M, /*op_desc_id=*/uint256{"af482b44c10b737b678e1091584818372e169e2dc5219e2877fabe1b83ae467b"});
Check("tr(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,multi_a(1,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,multi_a(1,669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,multi_a(1,669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))", SIGNABLE | XONLY_KEYS, {{"5120eb5bd3894327d75093891cc3a62506df7d58ec137fcd104cdd285d67816074f3"}}, OutputType::BECH32M);
CheckUnparsable("sh(multi(16,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy,KwGNz6YCCQtYvFzMtrC6D3tKTKdBBboMrLTsjr2NYVBwapCkn7Mr,KxogYhiNfwxuswvXV66eFyKcCpm7dZ7TqHVqujHAVUjJxyivxQ9X,L2BUNduTSyZwZjwNHynQTF14mv2uz2NRq5n5sYWTb4FkkmqgEE9f,L1okJGHGn1kFjdXHKxXjwVVtmCMR2JA5QsbKCSpSb7ReQjezKeoD,KxDCNSST75HFPaW5QKpzHtAyaCQC7p9Vo3FYfi2u4dXD1vgMiboK,L5edQjFtnkcf5UWURn6UuuoFrabgDQUHdheKCziwN42aLwS3KizU,KzF8UWFcEC7BYTq8Go1xVimMkDmyNYVmXV5PV7RuDicvAocoPB8i,L3nHUboKG2w4VSJ5jYZ5CBM97oeK6YuKvfZxrefdShECcjEYKMWZ,KyjHo36dWkYhimKmVVmQTq3gERv3pnqA4xFCpvUgbGDJad7eS8WE,KwsfyHKRUTZPQtysN7M3tZ4GXTnuov5XRgjdF2XCG8faAPmFruRF,KzCUbGhN9LJhdeFfL9zQgTJMjqxdBKEekRGZX24hXdgCNCijkkap,KzgpMBwwsDLwkaC5UrmBgCYaBD2WgZ7PBoGYXR8KT7gCA9UTN5a3,KyBXTPy4T7YG4q9tcAM3LkvfRpD1ybHMvcJ2ehaWXaSqeGUxEdkP,KzJDe9iwJRPtKP2F2AoN6zBgzS7uiuAwhWCfGdNeYJ3PC1HNJ8M8,L1xbHrxynrqLKkoYc4qtoQPx6uy5qYXR5ZDYVYBSRmCV5piU3JG9))","sh(multi(16,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232))", "P2SH script is too large, 547 bytes is larger than 520 bytes"); // P2SH does not fit 16 compressed pubkeys in a redeemscript
CheckUnparsable("wsh(multi(2,[aaaaaaaa][aaaaaaaa]xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647'/0,xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/1/2/*,xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*'))", "wsh(multi(2,[aaaaaaaa][aaaaaaaa]xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/2147483647h/0,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/1/2/*,xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/10/20/30/40/*h))", "Multi: Multiple ']' characters found for a single pubkey"); // Double key origin descriptor
@@ -513,8 +844,8 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
CheckUnparsable("multi(3,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", "multi(3,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", "Multisig threshold cannot be larger than the number of keys; threshold is 3 but only 2 keys specified"); // Threshold larger than number of keys
CheckUnparsable("multi(3,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy,KwGNz6YCCQtYvFzMtrC6D3tKTKdBBboMrLTsjr2NYVBwapCkn7Mr,KxogYhiNfwxuswvXV66eFyKcCpm7dZ7TqHVqujHAVUjJxyivxQ9X,L2BUNduTSyZwZjwNHynQTF14mv2uz2NRq5n5sYWTb4FkkmqgEE9f)", "multi(3,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8)", "Cannot have 4 pubkeys in bare multisig; only at most 3 pubkeys"); // Threshold larger than number of keys
CheckUnparsable("sh(multi(16,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy,KwGNz6YCCQtYvFzMtrC6D3tKTKdBBboMrLTsjr2NYVBwapCkn7Mr,KxogYhiNfwxuswvXV66eFyKcCpm7dZ7TqHVqujHAVUjJxyivxQ9X,L2BUNduTSyZwZjwNHynQTF14mv2uz2NRq5n5sYWTb4FkkmqgEE9f,L1okJGHGn1kFjdXHKxXjwVVtmCMR2JA5QsbKCSpSb7ReQjezKeoD,KxDCNSST75HFPaW5QKpzHtAyaCQC7p9Vo3FYfi2u4dXD1vgMiboK,L5edQjFtnkcf5UWURn6UuuoFrabgDQUHdheKCziwN42aLwS3KizU,KzF8UWFcEC7BYTq8Go1xVimMkDmyNYVmXV5PV7RuDicvAocoPB8i,L3nHUboKG2w4VSJ5jYZ5CBM97oeK6YuKvfZxrefdShECcjEYKMWZ,KyjHo36dWkYhimKmVVmQTq3gERv3pnqA4xFCpvUgbGDJad7eS8WE,KwsfyHKRUTZPQtysN7M3tZ4GXTnuov5XRgjdF2XCG8faAPmFruRF,KzCUbGhN9LJhdeFfL9zQgTJMjqxdBKEekRGZX24hXdgCNCijkkap,KzgpMBwwsDLwkaC5UrmBgCYaBD2WgZ7PBoGYXR8KT7gCA9UTN5a3,KyBXTPy4T7YG4q9tcAM3LkvfRpD1ybHMvcJ2ehaWXaSqeGUxEdkP,KzJDe9iwJRPtKP2F2AoN6zBgzS7uiuAwhWCfGdNeYJ3PC1HNJ8M8,L1xbHrxynrqLKkoYc4qtoQPx6uy5qYXR5ZDYVYBSRmCV5piU3JG9,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1))","sh(multi(16,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", "P2SH script is too large, 581 bytes is larger than 520 bytes"); // Cannot have more than 15 keys in a P2SH multisig, or we exceed maximum push size
- Check("wsh(multi(20,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy,KwGNz6YCCQtYvFzMtrC6D3tKTKdBBboMrLTsjr2NYVBwapCkn7Mr,KxogYhiNfwxuswvXV66eFyKcCpm7dZ7TqHVqujHAVUjJxyivxQ9X,L2BUNduTSyZwZjwNHynQTF14mv2uz2NRq5n5sYWTb4FkkmqgEE9f,L1okJGHGn1kFjdXHKxXjwVVtmCMR2JA5QsbKCSpSb7ReQjezKeoD,KxDCNSST75HFPaW5QKpzHtAyaCQC7p9Vo3FYfi2u4dXD1vgMiboK,L5edQjFtnkcf5UWURn6UuuoFrabgDQUHdheKCziwN42aLwS3KizU,KzF8UWFcEC7BYTq8Go1xVimMkDmyNYVmXV5PV7RuDicvAocoPB8i,L3nHUboKG2w4VSJ5jYZ5CBM97oeK6YuKvfZxrefdShECcjEYKMWZ,KyjHo36dWkYhimKmVVmQTq3gERv3pnqA4xFCpvUgbGDJad7eS8WE,KwsfyHKRUTZPQtysN7M3tZ4GXTnuov5XRgjdF2XCG8faAPmFruRF,KzCUbGhN9LJhdeFfL9zQgTJMjqxdBKEekRGZX24hXdgCNCijkkap,KzgpMBwwsDLwkaC5UrmBgCYaBD2WgZ7PBoGYXR8KT7gCA9UTN5a3,KyBXTPy4T7YG4q9tcAM3LkvfRpD1ybHMvcJ2ehaWXaSqeGUxEdkP,KzJDe9iwJRPtKP2F2AoN6zBgzS7uiuAwhWCfGdNeYJ3PC1HNJ8M8,L1xbHrxynrqLKkoYc4qtoQPx6uy5qYXR5ZDYVYBSRmCV5piU3JG9,KzRedjSwMggebB3VufhbzpYJnvHfHe9kPJSjCU5QpJdAW3NSZxYS,Kyjtp5858xL7JfeV4PNRCKy2t6XvgqNNepArGY9F9F1SSPqNEMs3,L2D4RLHPiHBidkHS8ftx11jJk1hGFELvxh8LoxNQheaGT58dKenW,KyLPZdwY4td98bKkXqEXTEBX3vwEYTQo1yyLjX2jKXA63GBpmSjv))","wsh(multi(20,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,02bc2feaa536991d269aae46abb8f3772a5b3ad592314945e51543e7da84c4af6e,0318bf32e5217c1eb771a6d5ce1cd39395dff7ff665704f175c9a5451d95a2f2ca,02c681a6243f16208c2004bb81f5a8a67edfdd3e3711534eadeec3dcf0b010c759,0249fdd6b69768b8d84b4893f8ff84b36835c50183de20fcae8f366a45290d01fd))", "wsh(multi(20,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,02bc2feaa536991d269aae46abb8f3772a5b3ad592314945e51543e7da84c4af6e,0318bf32e5217c1eb771a6d5ce1cd39395dff7ff665704f175c9a5451d95a2f2ca,02c681a6243f16208c2004bb81f5a8a67edfdd3e3711534eadeec3dcf0b010c759,0249fdd6b69768b8d84b4893f8ff84b36835c50183de20fcae8f366a45290d01fd))", SIGNABLE, {{"0020376bd8344b8b6ebe504ff85ef743eaa1aa9272178223bcb6887e9378efb341ac"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("2bb9d418ebdc3a75c465383985881527f3e5d6e520fb3efb152d4191b80e8412")); // In P2WSH we can have up to 20 keys
- Check("sh(wsh(multi(20,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy,KwGNz6YCCQtYvFzMtrC6D3tKTKdBBboMrLTsjr2NYVBwapCkn7Mr,KxogYhiNfwxuswvXV66eFyKcCpm7dZ7TqHVqujHAVUjJxyivxQ9X,L2BUNduTSyZwZjwNHynQTF14mv2uz2NRq5n5sYWTb4FkkmqgEE9f,L1okJGHGn1kFjdXHKxXjwVVtmCMR2JA5QsbKCSpSb7ReQjezKeoD,KxDCNSST75HFPaW5QKpzHtAyaCQC7p9Vo3FYfi2u4dXD1vgMiboK,L5edQjFtnkcf5UWURn6UuuoFrabgDQUHdheKCziwN42aLwS3KizU,KzF8UWFcEC7BYTq8Go1xVimMkDmyNYVmXV5PV7RuDicvAocoPB8i,L3nHUboKG2w4VSJ5jYZ5CBM97oeK6YuKvfZxrefdShECcjEYKMWZ,KyjHo36dWkYhimKmVVmQTq3gERv3pnqA4xFCpvUgbGDJad7eS8WE,KwsfyHKRUTZPQtysN7M3tZ4GXTnuov5XRgjdF2XCG8faAPmFruRF,KzCUbGhN9LJhdeFfL9zQgTJMjqxdBKEekRGZX24hXdgCNCijkkap,KzgpMBwwsDLwkaC5UrmBgCYaBD2WgZ7PBoGYXR8KT7gCA9UTN5a3,KyBXTPy4T7YG4q9tcAM3LkvfRpD1ybHMvcJ2ehaWXaSqeGUxEdkP,KzJDe9iwJRPtKP2F2AoN6zBgzS7uiuAwhWCfGdNeYJ3PC1HNJ8M8,L1xbHrxynrqLKkoYc4qtoQPx6uy5qYXR5ZDYVYBSRmCV5piU3JG9,KzRedjSwMggebB3VufhbzpYJnvHfHe9kPJSjCU5QpJdAW3NSZxYS,Kyjtp5858xL7JfeV4PNRCKy2t6XvgqNNepArGY9F9F1SSPqNEMs3,L2D4RLHPiHBidkHS8ftx11jJk1hGFELvxh8LoxNQheaGT58dKenW,KyLPZdwY4td98bKkXqEXTEBX3vwEYTQo1yyLjX2jKXA63GBpmSjv)))","sh(wsh(multi(20,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,02bc2feaa536991d269aae46abb8f3772a5b3ad592314945e51543e7da84c4af6e,0318bf32e5217c1eb771a6d5ce1cd39395dff7ff665704f175c9a5451d95a2f2ca,02c681a6243f16208c2004bb81f5a8a67edfdd3e3711534eadeec3dcf0b010c759,0249fdd6b69768b8d84b4893f8ff84b36835c50183de20fcae8f366a45290d01fd)))", "sh(wsh(multi(20,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,02bc2feaa536991d269aae46abb8f3772a5b3ad592314945e51543e7da84c4af6e,0318bf32e5217c1eb771a6d5ce1cd39395dff7ff665704f175c9a5451d95a2f2ca,02c681a6243f16208c2004bb81f5a8a67edfdd3e3711534eadeec3dcf0b010c759,0249fdd6b69768b8d84b4893f8ff84b36835c50183de20fcae8f366a45290d01fd)))", SIGNABLE, {{"a914c2c9c510e9d7f92fd6131e94803a8d34a8ef675e87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256S("69c3f3153ed2527d12cf78e53e719233fdb7fa6ca9f8a10059ce47d34b49c4cb")); // Even if it's wrapped into P2SH
+ Check("wsh(multi(20,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy,KwGNz6YCCQtYvFzMtrC6D3tKTKdBBboMrLTsjr2NYVBwapCkn7Mr,KxogYhiNfwxuswvXV66eFyKcCpm7dZ7TqHVqujHAVUjJxyivxQ9X,L2BUNduTSyZwZjwNHynQTF14mv2uz2NRq5n5sYWTb4FkkmqgEE9f,L1okJGHGn1kFjdXHKxXjwVVtmCMR2JA5QsbKCSpSb7ReQjezKeoD,KxDCNSST75HFPaW5QKpzHtAyaCQC7p9Vo3FYfi2u4dXD1vgMiboK,L5edQjFtnkcf5UWURn6UuuoFrabgDQUHdheKCziwN42aLwS3KizU,KzF8UWFcEC7BYTq8Go1xVimMkDmyNYVmXV5PV7RuDicvAocoPB8i,L3nHUboKG2w4VSJ5jYZ5CBM97oeK6YuKvfZxrefdShECcjEYKMWZ,KyjHo36dWkYhimKmVVmQTq3gERv3pnqA4xFCpvUgbGDJad7eS8WE,KwsfyHKRUTZPQtysN7M3tZ4GXTnuov5XRgjdF2XCG8faAPmFruRF,KzCUbGhN9LJhdeFfL9zQgTJMjqxdBKEekRGZX24hXdgCNCijkkap,KzgpMBwwsDLwkaC5UrmBgCYaBD2WgZ7PBoGYXR8KT7gCA9UTN5a3,KyBXTPy4T7YG4q9tcAM3LkvfRpD1ybHMvcJ2ehaWXaSqeGUxEdkP,KzJDe9iwJRPtKP2F2AoN6zBgzS7uiuAwhWCfGdNeYJ3PC1HNJ8M8,L1xbHrxynrqLKkoYc4qtoQPx6uy5qYXR5ZDYVYBSRmCV5piU3JG9,KzRedjSwMggebB3VufhbzpYJnvHfHe9kPJSjCU5QpJdAW3NSZxYS,Kyjtp5858xL7JfeV4PNRCKy2t6XvgqNNepArGY9F9F1SSPqNEMs3,L2D4RLHPiHBidkHS8ftx11jJk1hGFELvxh8LoxNQheaGT58dKenW,KyLPZdwY4td98bKkXqEXTEBX3vwEYTQo1yyLjX2jKXA63GBpmSjv))","wsh(multi(20,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,02bc2feaa536991d269aae46abb8f3772a5b3ad592314945e51543e7da84c4af6e,0318bf32e5217c1eb771a6d5ce1cd39395dff7ff665704f175c9a5451d95a2f2ca,02c681a6243f16208c2004bb81f5a8a67edfdd3e3711534eadeec3dcf0b010c759,0249fdd6b69768b8d84b4893f8ff84b36835c50183de20fcae8f366a45290d01fd))", "wsh(multi(20,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,02bc2feaa536991d269aae46abb8f3772a5b3ad592314945e51543e7da84c4af6e,0318bf32e5217c1eb771a6d5ce1cd39395dff7ff665704f175c9a5451d95a2f2ca,02c681a6243f16208c2004bb81f5a8a67edfdd3e3711534eadeec3dcf0b010c759,0249fdd6b69768b8d84b4893f8ff84b36835c50183de20fcae8f366a45290d01fd))", SIGNABLE, {{"0020376bd8344b8b6ebe504ff85ef743eaa1aa9272178223bcb6887e9378efb341ac"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"2bb9d418ebdc3a75c465383985881527f3e5d6e520fb3efb152d4191b80e8412"}); // In P2WSH we can have up to 20 keys
+ Check("sh(wsh(multi(20,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy,KwGNz6YCCQtYvFzMtrC6D3tKTKdBBboMrLTsjr2NYVBwapCkn7Mr,KxogYhiNfwxuswvXV66eFyKcCpm7dZ7TqHVqujHAVUjJxyivxQ9X,L2BUNduTSyZwZjwNHynQTF14mv2uz2NRq5n5sYWTb4FkkmqgEE9f,L1okJGHGn1kFjdXHKxXjwVVtmCMR2JA5QsbKCSpSb7ReQjezKeoD,KxDCNSST75HFPaW5QKpzHtAyaCQC7p9Vo3FYfi2u4dXD1vgMiboK,L5edQjFtnkcf5UWURn6UuuoFrabgDQUHdheKCziwN42aLwS3KizU,KzF8UWFcEC7BYTq8Go1xVimMkDmyNYVmXV5PV7RuDicvAocoPB8i,L3nHUboKG2w4VSJ5jYZ5CBM97oeK6YuKvfZxrefdShECcjEYKMWZ,KyjHo36dWkYhimKmVVmQTq3gERv3pnqA4xFCpvUgbGDJad7eS8WE,KwsfyHKRUTZPQtysN7M3tZ4GXTnuov5XRgjdF2XCG8faAPmFruRF,KzCUbGhN9LJhdeFfL9zQgTJMjqxdBKEekRGZX24hXdgCNCijkkap,KzgpMBwwsDLwkaC5UrmBgCYaBD2WgZ7PBoGYXR8KT7gCA9UTN5a3,KyBXTPy4T7YG4q9tcAM3LkvfRpD1ybHMvcJ2ehaWXaSqeGUxEdkP,KzJDe9iwJRPtKP2F2AoN6zBgzS7uiuAwhWCfGdNeYJ3PC1HNJ8M8,L1xbHrxynrqLKkoYc4qtoQPx6uy5qYXR5ZDYVYBSRmCV5piU3JG9,KzRedjSwMggebB3VufhbzpYJnvHfHe9kPJSjCU5QpJdAW3NSZxYS,Kyjtp5858xL7JfeV4PNRCKy2t6XvgqNNepArGY9F9F1SSPqNEMs3,L2D4RLHPiHBidkHS8ftx11jJk1hGFELvxh8LoxNQheaGT58dKenW,KyLPZdwY4td98bKkXqEXTEBX3vwEYTQo1yyLjX2jKXA63GBpmSjv)))","sh(wsh(multi(20,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,02bc2feaa536991d269aae46abb8f3772a5b3ad592314945e51543e7da84c4af6e,0318bf32e5217c1eb771a6d5ce1cd39395dff7ff665704f175c9a5451d95a2f2ca,02c681a6243f16208c2004bb81f5a8a67edfdd3e3711534eadeec3dcf0b010c759,0249fdd6b69768b8d84b4893f8ff84b36835c50183de20fcae8f366a45290d01fd)))", "sh(wsh(multi(20,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0,0260b2003c386519fc9eadf2b5cf124dd8eea4c4e68d5e154050a9346ea98ce600,0362a74e399c39ed5593852a30147f2959b56bb827dfa3e60e464b02ccf87dc5e8,0261345b53de74a4d721ef877c255429961b7e43714171ac06168d7e08c542a8b8,02da72e8b46901a65d4374fe6315538d8f368557dda3a1dcf9ea903f3afe7314c8,0318c82dd0b53fd3a932d16e0ba9e278fcc937c582d5781be626ff16e201f72286,0297ccef1ef99f9d73dec9ad37476ddb232f1238aff877af19e72ba04493361009,02e502cfd5c3f972fe9a3e2a18827820638f96b6f347e54d63deb839011fd5765d,03e687710f0e3ebe81c1037074da939d409c0025f17eb86adb9427d28f0f7ae0e9,02c04d3a5274952acdbc76987f3184b346a483d43be40874624b29e3692c1df5af,02ed06e0f418b5b43a7ec01d1d7d27290fa15f75771cb69b642a51471c29c84acd,036d46073cbb9ffee90473f3da429abc8de7f8751199da44485682a989a4bebb24,02f5d1ff7c9029a80a4e36b9a5497027ef7f3e73384a4a94fbfe7c4e9164eec8bc,02e41deffd1b7cce11cde209a781adcffdabd1b91c0ba0375857a2bfd9302419f3,02d76625f7956a7fc505ab02556c23ee72d832f1bac391bcd2d3abce5710a13d06,0399eb0a5487515802dc14544cf10b3666623762fbed2ec38a3975716e2c29c232,02bc2feaa536991d269aae46abb8f3772a5b3ad592314945e51543e7da84c4af6e,0318bf32e5217c1eb771a6d5ce1cd39395dff7ff665704f175c9a5451d95a2f2ca,02c681a6243f16208c2004bb81f5a8a67edfdd3e3711534eadeec3dcf0b010c759,0249fdd6b69768b8d84b4893f8ff84b36835c50183de20fcae8f366a45290d01fd)))", SIGNABLE, {{"a914c2c9c510e9d7f92fd6131e94803a8d34a8ef675e87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256{"69c3f3153ed2527d12cf78e53e719233fdb7fa6ca9f8a10059ce47d34b49c4cb"}); // Even if it's wrapped into P2SH
// Check for invalid nesting of structures
CheckUnparsable("sh(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", "sh(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", "A function is needed within P2SH"); // P2SH needs a script, not a key
CheckUnparsable("sh(combo(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1))", "sh(combo(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", "Can only have combo() at top level"); // Old must be top level
@@ -525,8 +856,8 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
CheckUnparsable("wsh(wsh(pk(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)))", "wsh(wsh(pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)))", "Can only have wsh() at top level or inside sh()"); // Cannot embed P2WSH inside P2WSH
// Checksums
- Check("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))#ggrsrxfy", "sh(multi(2,[00000000/111'/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))#tjg09x5t", "sh(multi(2,[00000000/111h/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))#hgmsckna", DEFAULT, {{"a91445a9a622a8b0a1269944be477640eedc447bbd8487"}}, OutputType::LEGACY, /*op_desc_id=*/uint256S("9339b7bfbe8cfd9d0d55819778ef77f52e5786e85b4c83be8a0d5b976e033f4c"), {{0x8000006FUL,222},{0}});
- Check("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))", "sh(multi(2,[00000000/111'/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))", "sh(multi(2,[00000000/111h/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))", DEFAULT, {{"a91445a9a622a8b0a1269944be477640eedc447bbd8487"}}, OutputType::LEGACY, /*op_desc_id=*/uint256S("9339b7bfbe8cfd9d0d55819778ef77f52e5786e85b4c83be8a0d5b976e033f4c"), {{0x8000006FUL,222},{0}});
+ Check("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))#ggrsrxfy", "sh(multi(2,[00000000/111'/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))#tjg09x5t", "sh(multi(2,[00000000/111h/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))#hgmsckna", DEFAULT, {{"a91445a9a622a8b0a1269944be477640eedc447bbd8487"}}, OutputType::LEGACY, /*op_desc_id=*/uint256{"9339b7bfbe8cfd9d0d55819778ef77f52e5786e85b4c83be8a0d5b976e033f4c"}, {{0x8000006FUL,222},{0}});
+ Check("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))", "sh(multi(2,[00000000/111'/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))", "sh(multi(2,[00000000/111h/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))", DEFAULT, {{"a91445a9a622a8b0a1269944be477640eedc447bbd8487"}}, OutputType::LEGACY, /*op_desc_id=*/uint256{"9339b7bfbe8cfd9d0d55819778ef77f52e5786e85b4c83be8a0d5b976e033f4c"}, {{0x8000006FUL,222},{0}});
CheckUnparsable("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))#", "sh(multi(2,[00000000/111'/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))#", "Expected 8 character checksum, not 0 characters"); // Empty checksum
CheckUnparsable("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))#ggrsrxfyq", "sh(multi(2,[00000000/111'/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))#tjg09x5tq", "Expected 8 character checksum, not 9 characters"); // Too long checksum
CheckUnparsable("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))#ggrsrxf", "sh(multi(2,[00000000/111'/222]xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0))#tjg09x5", "Expected 8 character checksum, not 7 characters"); // Too short checksum
@@ -546,7 +877,7 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
RANGE | HARDENED | XONLY_KEYS,
{{"51205172af752f057d543ce8e4a6f8dcf15548ec6be44041bfa93b72e191cfc8c1ee"}, {"51201b66f20b86f700c945ecb9ad9b0ad1662b73084e2bfea48bee02126350b8a5b1"}, {"512063e70f66d815218abcc2306aa930aaca07c5cde73b75127eb27b5e8c16b58a25"}},
OutputType::BECH32M,
- /*op_desc_id=*/uint256S("458f0e7f4075a81c990c6be6d5b985027ac8b7f7cef8311696d95b7b49658c7d"),
+ /*op_desc_id=*/uint256{"458f0e7f4075a81c990c6be6d5b985027ac8b7f7cef8311696d95b7b49658c7d"},
{{0x80000056, 0x80000001, 0x80000000, 1, 0}, {0x80000056, 0x80000001, 0x80000000, 1, 1}, {0x80000056, 0x80000001, 0x80000000, 1, 2}});
Check(
@@ -556,7 +887,7 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
SIGNABLE | XONLY_KEYS,
{{"5120a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd"}},
OutputType::BECH32M,
- /*op_desc_id=*/uint256S("5ba3f7d83cee4795df00e0eaa5070a3e164283c5fc6e8586fd710eaa7a4168ec"));
+ /*op_desc_id=*/uint256{"5ba3f7d83cee4795df00e0eaa5070a3e164283c5fc6e8586fd710eaa7a4168ec"});
CheckUnparsable(
"",
@@ -607,31 +938,31 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
CheckUnparsable("wsh(and_b(and_b(older(1),a:older(100000000)),s:pk(L4gM1FBdyHNpkzsFh9ipnofLhpZRp2mwobpeULy1a6dBTvw8Ywtd)))", "wsh(and_b(and_b(older(1),a:older(100000000)),s:pk(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204)))", "and_b(older(1),a:older(100000000)) is not sane: contains mixes of timelocks expressed in blocks and seconds");
CheckUnparsable("wsh(and_b(or_b(pkh(L4gM1FBdyHNpkzsFh9ipnofLhpZRp2mwobpeULy1a6dBTvw8Ywtd),s:pk(Kx9HCDjGiwFcgVNhTrS5z5NeZdD6veeam61eDxLDCkGWujvL4Gnn)),s:pk(L4gM1FBdyHNpkzsFh9ipnofLhpZRp2mwobpeULy1a6dBTvw8Ywtd)))", "wsh(and_b(or_b(pkh(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204),s:pk(032707170c71d8f75e4ca4e3fce870b9409dcaf12b051d3bcadff74747fa7619c0)),s:pk(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204)))", "and_b(or_b(pkh(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204),s:pk(032707170c71d8f75e4ca4e3fce870b9409dcaf12b051d3bcadff74747fa7619c0)),s:pk(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204)) is not sane: contains duplicate public keys");
// Valid with extended keys.
- Check("wsh(and_v(v:ripemd160(095ff41131e5946f3c85f79e44adbcf8e27e080e),multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0)))", "wsh(and_v(v:ripemd160(095ff41131e5946f3c85f79e44adbcf8e27e080e),multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)))", "wsh(and_v(v:ripemd160(095ff41131e5946f3c85f79e44adbcf8e27e080e),multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)))", DEFAULT, {{"0020acf425291b98a1d7e0d4690139442abc289175be32ef1f75945e339924246d73"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("0634b326edc66f9e2660562564d7a8fcca55f91dc4555ce0a51883cc72e0fa41"), {{},{0}});
+ Check("wsh(and_v(v:ripemd160(095ff41131e5946f3c85f79e44adbcf8e27e080e),multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0)))", "wsh(and_v(v:ripemd160(095ff41131e5946f3c85f79e44adbcf8e27e080e),multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)))", "wsh(and_v(v:ripemd160(095ff41131e5946f3c85f79e44adbcf8e27e080e),multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)))", DEFAULT, {{"0020acf425291b98a1d7e0d4690139442abc289175be32ef1f75945e339924246d73"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"0634b326edc66f9e2660562564d7a8fcca55f91dc4555ce0a51883cc72e0fa41"}, {{},{0}});
// Valid under sh(wsh()) and with a mix of xpubs and raw keys.
- Check("sh(wsh(thresh(1,pkh(L4gM1FBdyHNpkzsFh9ipnofLhpZRp2mwobpeULy1a6dBTvw8Ywtd),a:and_n(multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0),n:older(2)))))", "sh(wsh(thresh(1,pkh(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", "sh(wsh(thresh(1,pkh(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", SIGNABLE | MIXED_PUBKEYS, {{"a914767e9119ff3b3ac0cb6dcfe21de1842ccf85f1c487"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256S("3cfcad33bc25579d70b23ce634d317be00a4e5400e758e37c215bdc17b31bfb8"), {{},{0}});
+ Check("sh(wsh(thresh(1,pkh(L4gM1FBdyHNpkzsFh9ipnofLhpZRp2mwobpeULy1a6dBTvw8Ywtd),a:and_n(multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0),n:older(2)))))", "sh(wsh(thresh(1,pkh(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", "sh(wsh(thresh(1,pkh(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", SIGNABLE | MIXED_PUBKEYS, {{"a914767e9119ff3b3ac0cb6dcfe21de1842ccf85f1c487"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256{"3cfcad33bc25579d70b23ce634d317be00a4e5400e758e37c215bdc17b31bfb8"}, {{},{0}});
// An exotic multisig, we can sign for both branches
Check("wsh(thresh(1,pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc),a:pkh(xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0)))", "wsh(thresh(1,pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL),a:pkh(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)))", "wsh(thresh(1,pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL),a:pkh(xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0)))", SIGNABLE, {{"00204a4528fbc0947e02e921b54bd476fc8cc2ebb5c6ae2ccf10ed29fe2937fb6892"}}, OutputType::BECH32, /*op_desc_id=*/std::nullopt, {{},{0}});
// We can sign for a script requiring the two kinds of timelock.
// But if we don't set a sequence high enough, we'll fail.
- Check("sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", SIGNABLE_FAILS, {{"a914099f400961f930d4c16c3b33c0e2a58ef53ac38f87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256S("f5c14a15b45d2af1b8ec69acfd3cf4790f069705d1b079efb0b8193fed181f64"), {{},{0}}, /*spender_nlocktime=*/1000, /*spender_nsequence=*/1);
+ Check("sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", SIGNABLE_FAILS, {{"a914099f400961f930d4c16c3b33c0e2a58ef53ac38f87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256{"f5c14a15b45d2af1b8ec69acfd3cf4790f069705d1b079efb0b8193fed181f64"}, {{},{0}}, /*spender_nlocktime=*/1000, /*spender_nsequence=*/1);
// And same for the nLockTime.
- Check("sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", SIGNABLE_FAILS, {{"a914099f400961f930d4c16c3b33c0e2a58ef53ac38f87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256S("f5c14a15b45d2af1b8ec69acfd3cf4790f069705d1b079efb0b8193fed181f64"), {{},{0}}, /*spender_nlocktime=*/999, /*spender_nsequence=*/2);
+ Check("sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", SIGNABLE_FAILS, {{"a914099f400961f930d4c16c3b33c0e2a58ef53ac38f87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256{"f5c14a15b45d2af1b8ec69acfd3cf4790f069705d1b079efb0b8193fed181f64"}, {{},{0}}, /*spender_nlocktime=*/999, /*spender_nsequence=*/2);
// But if both are set to (at least) the required value, we'll succeed.
- Check("sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", SIGNABLE, {{"a914099f400961f930d4c16c3b33c0e2a58ef53ac38f87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256S("f5c14a15b45d2af1b8ec69acfd3cf4790f069705d1b079efb0b8193fed181f64"), {{},{0}}, /*spender_nlocktime=*/1000, /*spender_nsequence=*/2);
+ Check("sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", "sh(wsh(thresh(2,ndv:after(1000),a:and_n(multi(1,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0),n:older(2)))))", SIGNABLE, {{"a914099f400961f930d4c16c3b33c0e2a58ef53ac38f87"}}, OutputType::P2SH_SEGWIT, /*op_desc_id=*/uint256{"f5c14a15b45d2af1b8ec69acfd3cf4790f069705d1b079efb0b8193fed181f64"}, {{},{0}}, /*spender_nlocktime=*/1000, /*spender_nsequence=*/2);
// We can't sign for a script requiring a ripemd160 preimage without providing it.
- Check("wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"002001549deda34cbc4a5982263191380f522695a2ddc2f99fc3a65c736264bd6cab"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("1fed6fbd0e408eb4bddfefa075289dc7061e7a3240c84f6ba5b9f294d96a21f4"), {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
+ Check("wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"002001549deda34cbc4a5982263191380f522695a2ddc2f99fc3a65c736264bd6cab"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"1fed6fbd0e408eb4bddfefa075289dc7061e7a3240c84f6ba5b9f294d96a21f4"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
// But if we provide it, we can.
- Check("wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"002001549deda34cbc4a5982263191380f522695a2ddc2f99fc3a65c736264bd6cab"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("1fed6fbd0e408eb4bddfefa075289dc7061e7a3240c84f6ba5b9f294d96a21f4"), {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{ParseHex("ff9aa1829c90d26e73301383f549e1497b7d6325"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:ripemd160(ff9aa1829c90d26e73301383f549e1497b7d6325),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"002001549deda34cbc4a5982263191380f522695a2ddc2f99fc3a65c736264bd6cab"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"1fed6fbd0e408eb4bddfefa075289dc7061e7a3240c84f6ba5b9f294d96a21f4"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{"ff9aa1829c90d26e73301383f549e1497b7d6325"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Same for sha256
- Check("wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"002071f7283dbbb9a55ed43a54cda16ba0efd0f16dc48fe200f299e57bb5d7be8dd4"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("a1809a65ba5ca2f09a06c114d4881eed95d1b62f38743cf126cf71b2dd411374"), {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
- Check("wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"002071f7283dbbb9a55ed43a54cda16ba0efd0f16dc48fe200f299e57bb5d7be8dd4"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("a1809a65ba5ca2f09a06c114d4881eed95d1b62f38743cf126cf71b2dd411374"), {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{ParseHex("7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"002071f7283dbbb9a55ed43a54cda16ba0efd0f16dc48fe200f299e57bb5d7be8dd4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"a1809a65ba5ca2f09a06c114d4881eed95d1b62f38743cf126cf71b2dd411374"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
+ Check("wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:sha256(7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"002071f7283dbbb9a55ed43a54cda16ba0efd0f16dc48fe200f299e57bb5d7be8dd4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"a1809a65ba5ca2f09a06c114d4881eed95d1b62f38743cf126cf71b2dd411374"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{"7426ba0604c3f8682c7016b44673f85c5bd9da2fa6c1080810cf53ae320c9863"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Same for hash160
- Check("wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"00209b9d5b45735d0e15df5b41d6594602d3de472262f7b75edc6cf5f3e3fa4e3ae4"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("d7bdbc680503a585925eec72d11fc99396f51855d0a03fce53c90bed4c2e319f"), {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
- Check("wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"00209b9d5b45735d0e15df5b41d6594602d3de472262f7b75edc6cf5f3e3fa4e3ae4"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("d7bdbc680503a585925eec72d11fc99396f51855d0a03fce53c90bed4c2e319f"), {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{ParseHex("292e2df59e3a22109200beed0cdc84b12e66793e"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"00209b9d5b45735d0e15df5b41d6594602d3de472262f7b75edc6cf5f3e3fa4e3ae4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"d7bdbc680503a585925eec72d11fc99396f51855d0a03fce53c90bed4c2e319f"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
+ Check("wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash160(292e2df59e3a22109200beed0cdc84b12e66793e),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"00209b9d5b45735d0e15df5b41d6594602d3de472262f7b75edc6cf5f3e3fa4e3ae4"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"d7bdbc680503a585925eec72d11fc99396f51855d0a03fce53c90bed4c2e319f"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{"292e2df59e3a22109200beed0cdc84b12e66793e"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Same for hash256
- Check("wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"0020cf62bf97baf977aec69cbc290c372899f913337a9093e8f066ab59b8657a365c"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("8412ba3ac20ba3a30f81442d10d32e0468fa52814960d04e959bf84a9b813b88"), {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
- Check("wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"0020cf62bf97baf977aec69cbc290c372899f913337a9093e8f066ab59b8657a365c"}}, OutputType::BECH32, /*op_desc_id=*/uint256S("8412ba3ac20ba3a30f81442d10d32e0468fa52814960d04e959bf84a9b813b88"), {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{ParseHex("ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE_FAILS, {{"0020cf62bf97baf977aec69cbc290c372899f913337a9093e8f066ab59b8657a365c"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"8412ba3ac20ba3a30f81442d10d32e0468fa52814960d04e959bf84a9b813b88"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {});
+ Check("wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", "wsh(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),pk(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL)))", SIGNABLE, {{"0020cf62bf97baf977aec69cbc290c372899f913337a9093e8f066ab59b8657a365c"}}, OutputType::BECH32, /*op_desc_id=*/uint256{"8412ba3ac20ba3a30f81442d10d32e0468fa52814960d04e959bf84a9b813b88"}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/CTxIn::SEQUENCE_FINAL, {{"ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Can have a Miniscript expression under tr() if it's alone.
Check("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,thresh(2,pk(L1NKM8dVA1h52mwDrmk1YreTWkAZZTu2vmKLpmLEbFRqGQYjHeEV),s:pk(Kz3iCBy3HNGP5CZWDsAMmnCMFNwqdDohudVN9fvkrN7tAkzKNtM7),adv:older(42)))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,thresh(2,pk(30a6069f344fb784a2b4c99540a91ee727c91e3a25ef6aae867d9c65b5f23529),s:pk(9918d400c1b8c3c478340a40117ced4054b6b58f48cdb3c89b836bdfee1f5766),adv:older(42)))", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,thresh(2,pk(30a6069f344fb784a2b4c99540a91ee727c91e3a25ef6aae867d9c65b5f23529),s:pk(9918d400c1b8c3c478340a40117ced4054b6b58f48cdb3c89b836bdfee1f5766),adv:older(42)))", MISSING_PRIVKEYS | XONLY_KEYS | SIGNABLE, {{"512033982eebe204dc66508e4b19cfc31b5ffc6e1bfcbf6e5597dfc2521a52270795"}}, OutputType::BECH32M);
// Can have a pkh() expression alone as tr() script path (because pkh() is valid Miniscript).
@@ -643,7 +974,7 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
// Can sign for a Miniscript expression containing a hash challenge inside a Taproot tree. (Fails without the
// preimages and the sequence, passes with.)
Check("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(KykUPmR5967F4URzMUeCv9kNMU9CNRWycrPmx3ZvfkWoQLabbimL)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,KztMyyi1pXUtuZfJSB7JzVdmJMAz7wfGVFoSRUR5CVZxXxULXuGR)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", MISSING_PRIVKEYS | XONLY_KEYS | SIGNABLE | SIGNABLE_FAILS, {{"51209a3d79db56fbe3ba4d905d827b62e1ed31cd6df1198b8c759d589c0f4efc27bd"}}, OutputType::BECH32M);
- Check("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(KykUPmR5967F4URzMUeCv9kNMU9CNRWycrPmx3ZvfkWoQLabbimL)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,KztMyyi1pXUtuZfJSB7JzVdmJMAz7wfGVFoSRUR5CVZxXxULXuGR)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", MISSING_PRIVKEYS | XONLY_KEYS | SIGNABLE, {{"51209a3d79db56fbe3ba4d905d827b62e1ed31cd6df1198b8c759d589c0f4efc27bd"}}, OutputType::BECH32M, /*op_desc_id=*/{}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/42, /*preimages=*/{{ParseHex("ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588"), ParseHex("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")}});
+ Check("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(KykUPmR5967F4URzMUeCv9kNMU9CNRWycrPmx3ZvfkWoQLabbimL)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,KztMyyi1pXUtuZfJSB7JzVdmJMAz7wfGVFoSRUR5CVZxXxULXuGR)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", "tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,{and_v(and_v(v:hash256(ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588),v:pk(1c9bc926084382e76da33b5a52d17b1fa153c072aae5fb5228ecc2ccf89d79d5)),older(42)),multi_a(2,adf586a32ad4b0674a86022b000348b681b4c97a811f67eefe4a6e066e55080c,14fa4ad085cdee1e2fc73d491b36a96c192382b1d9a21108eb3533f630364f9f)})", MISSING_PRIVKEYS | XONLY_KEYS | SIGNABLE, {{"51209a3d79db56fbe3ba4d905d827b62e1ed31cd6df1198b8c759d589c0f4efc27bd"}}, OutputType::BECH32M, /*op_desc_id=*/{}, {{}}, /*spender_nlocktime=*/0, /*spender_nsequence=*/42, /*preimages=*/{{"ae253ca2a54debcac7ecf414f6734f48c56421a08bb59182ff9f39a6fffdb588"_hex_v_u8, "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"_hex_v_u8}});
// Basic sh(pkh()) with key origin
CheckInferDescriptor("a9141a31ad23bf49c247dd531a623c2ef57da3c400c587", "sh(pkh([deadbeef/0h/0h/0]03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", {"76a9149a1c78a507689f6f54b847ad1cef1e614ee23f1e88ac"}, {{"03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd", "deadbeef/0h/0h/0"}});
diff --git a/src/test/fuzz/CMakeLists.txt b/src/test/fuzz/CMakeLists.txt
new file mode 100644
index 0000000000..1c7b0d5c25
--- /dev/null
+++ b/src/test/fuzz/CMakeLists.txt
@@ -0,0 +1,147 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_subdirectory(util)
+
+add_executable(fuzz
+ addition_overflow.cpp
+ addrman.cpp
+ asmap.cpp
+ asmap_direct.cpp
+ autofile.cpp
+ banman.cpp
+ base_encode_decode.cpp
+ bech32.cpp
+ bip324.cpp
+ bitdeque.cpp
+ bitset.cpp
+ block.cpp
+ block_header.cpp
+ block_index.cpp
+ blockfilter.cpp
+ bloom_filter.cpp
+ buffered_file.cpp
+ chain.cpp
+ checkqueue.cpp
+ cluster_linearize.cpp
+ coins_view.cpp
+ coinscache_sim.cpp
+ connman.cpp
+ crypto.cpp
+ crypto_aes256.cpp
+ crypto_aes256cbc.cpp
+ crypto_chacha20.cpp
+ crypto_chacha20poly1305.cpp
+ crypto_common.cpp
+ crypto_diff_fuzz_chacha20.cpp
+ crypto_hkdf_hmac_sha256_l32.cpp
+ crypto_poly1305.cpp
+ cuckoocache.cpp
+ decode_tx.cpp
+ descriptor_parse.cpp
+ deserialize.cpp
+ eval_script.cpp
+ feefrac.cpp
+ fee_rate.cpp
+ feeratediagram.cpp
+ fees.cpp
+ flatfile.cpp
+ float.cpp
+ golomb_rice.cpp
+ headerssync.cpp
+ hex.cpp
+ http_request.cpp
+ i2p.cpp
+ integer.cpp
+ key.cpp
+ key_io.cpp
+ kitchen_sink.cpp
+ load_external_block_file.cpp
+ locale.cpp
+ merkleblock.cpp
+ message.cpp
+ miniscript.cpp
+ minisketch.cpp
+ mini_miner.cpp
+ muhash.cpp
+ multiplication_overflow.cpp
+ net.cpp
+ net_permissions.cpp
+ netaddress.cpp
+ netbase_dns_lookup.cpp
+ node_eviction.cpp
+ p2p_handshake.cpp
+ p2p_headers_presync.cpp
+ p2p_transport_serialization.cpp
+ package_eval.cpp
+ parse_hd_keypath.cpp
+ parse_numbers.cpp
+ parse_script.cpp
+ parse_univalue.cpp
+ partially_downloaded_block.cpp
+ policy_estimator.cpp
+ policy_estimator_io.cpp
+ poolresource.cpp
+ pow.cpp
+ prevector.cpp
+ primitives_transaction.cpp
+ process_message.cpp
+ process_messages.cpp
+ protocol.cpp
+ psbt.cpp
+ random.cpp
+ rbf.cpp
+ rolling_bloom_filter.cpp
+ rpc.cpp
+ script.cpp
+ script_assets_test_minimizer.cpp
+ script_descriptor_cache.cpp
+ script_flags.cpp
+ script_format.cpp
+ script_interpreter.cpp
+ script_ops.cpp
+ script_parsing.cpp
+ script_sigcache.cpp
+ script_sign.cpp
+ scriptnum_ops.cpp
+ secp256k1_ec_seckey_import_export_der.cpp
+ secp256k1_ecdsa_signature_parse_der_lax.cpp
+ signature_checker.cpp
+ signet.cpp
+ socks5.cpp
+ span.cpp
+ string.cpp
+ strprintf.cpp
+ system.cpp
+ timeoffsets.cpp
+ torcontrol.cpp
+ transaction.cpp
+ tx_in.cpp
+ tx_out.cpp
+ tx_pool.cpp
+ txorphan.cpp
+ txrequest.cpp
+ utxo_snapshot.cpp
+ utxo_total_supply.cpp
+ validation_load_mempool.cpp
+ vecdeque.cpp
+ versionbits.cpp
+)
+target_link_libraries(fuzz
+ core_interface
+ test_fuzz
+ bitcoin_cli
+ bitcoin_common
+ bitcoin_util
+ minisketch
+ leveldb
+ univalue
+ secp256k1
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:libevent::libevent>
+)
+
+if(ENABLE_WALLET)
+ add_subdirectory(${PROJECT_SOURCE_DIR}/src/wallet/test/fuzz wallet)
+endif()
diff --git a/src/test/fuzz/addrman.cpp b/src/test/fuzz/addrman.cpp
index 8a54cc656d..bcc3dd3e14 100644
--- a/src/test/fuzz/addrman.cpp
+++ b/src/test/fuzz/addrman.cpp
@@ -124,7 +124,7 @@ public:
explicit AddrManDeterministic(const NetGroupManager& netgroupman, FuzzedDataProvider& fuzzed_data_provider)
: AddrMan(netgroupman, /*deterministic=*/true, GetCheckRatio())
{
- WITH_LOCK(m_impl->cs, m_impl->insecure_rand = FastRandomContext{ConsumeUInt256(fuzzed_data_provider)});
+ WITH_LOCK(m_impl->cs, m_impl->insecure_rand.Reseed(ConsumeUInt256(fuzzed_data_provider)));
}
/**
@@ -186,7 +186,7 @@ public:
return false;
}
- auto IdsReferToSameAddress = [&](int id, int other_id) EXCLUSIVE_LOCKS_REQUIRED(m_impl->cs, other.m_impl->cs) {
+ auto IdsReferToSameAddress = [&](nid_type id, nid_type other_id) EXCLUSIVE_LOCKS_REQUIRED(m_impl->cs, other.m_impl->cs) {
if (id == -1 && other_id == -1) {
return true;
}
@@ -250,19 +250,30 @@ FUZZ_TARGET(addrman, .init = initialize_addrman)
LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
addresses.push_back(ConsumeAddress(fuzzed_data_provider));
}
- addr_man.Add(addresses, ConsumeNetAddr(fuzzed_data_provider), std::chrono::seconds{ConsumeTime(fuzzed_data_provider, 0, 100000000)});
+ auto net_addr = ConsumeNetAddr(fuzzed_data_provider);
+ auto time_penalty = std::chrono::seconds{ConsumeTime(fuzzed_data_provider, 0, 100000000)};
+ addr_man.Add(addresses, net_addr, time_penalty);
},
[&] {
- addr_man.Good(ConsumeService(fuzzed_data_provider), NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}});
+ auto addr = ConsumeService(fuzzed_data_provider);
+ auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}};
+ addr_man.Good(addr, time);
},
[&] {
- addr_man.Attempt(ConsumeService(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool(), NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}});
+ auto addr = ConsumeService(fuzzed_data_provider);
+ auto count_failure = fuzzed_data_provider.ConsumeBool();
+ auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}};
+ addr_man.Attempt(addr, count_failure, time);
},
[&] {
- addr_man.Connected(ConsumeService(fuzzed_data_provider), NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}});
+ auto addr = ConsumeService(fuzzed_data_provider);
+ auto time = NodeSeconds{std::chrono::seconds{ConsumeTime(fuzzed_data_provider)}};
+ addr_man.Connected(addr, time);
},
[&] {
- addr_man.SetServices(ConsumeService(fuzzed_data_provider), ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS));
+ auto addr = ConsumeService(fuzzed_data_provider);
+ auto n_services = ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS);
+ addr_man.SetServices(addr, n_services);
});
}
const AddrMan& const_addr_man{addr_man};
@@ -270,12 +281,19 @@ FUZZ_TARGET(addrman, .init = initialize_addrman)
if (fuzzed_data_provider.ConsumeBool()) {
network = fuzzed_data_provider.PickValueInArray(ALL_NETWORKS);
}
- (void)const_addr_man.GetAddr(
- /*max_addresses=*/fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096),
- /*max_pct=*/fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096),
- network,
- /*filtered=*/fuzzed_data_provider.ConsumeBool());
- (void)const_addr_man.Select(fuzzed_data_provider.ConsumeBool(), network);
+ auto max_addresses = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096);
+ auto max_pct = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096);
+ auto filtered = fuzzed_data_provider.ConsumeBool();
+ (void)const_addr_man.GetAddr(max_addresses, max_pct, network, filtered);
+
+ std::unordered_set<Network> nets;
+ for (const auto& net : ALL_NETWORKS) {
+ if (fuzzed_data_provider.ConsumeBool()) {
+ nets.insert(net);
+ }
+ }
+ (void)const_addr_man.Select(fuzzed_data_provider.ConsumeBool(), nets);
+
std::optional<bool> in_new;
if (fuzzed_data_provider.ConsumeBool()) {
in_new = fuzzed_data_provider.ConsumeBool();
diff --git a/src/test/fuzz/autofile.cpp b/src/test/fuzz/autofile.cpp
index 45316b6b21..81761c7bf9 100644
--- a/src/test/fuzz/autofile.cpp
+++ b/src/test/fuzz/autofile.cpp
@@ -56,7 +56,6 @@ FUZZ_TARGET(autofile)
WriteToStream(fuzzed_data_provider, auto_file);
});
}
- (void)auto_file.Get();
(void)auto_file.IsNull();
if (fuzzed_data_provider.ConsumeBool()) {
FILE* f = auto_file.release();
diff --git a/src/test/fuzz/banman.cpp b/src/test/fuzz/banman.cpp
index b26151f63c..4165cc6b2c 100644
--- a/src/test/fuzz/banman.cpp
+++ b/src/test/fuzz/banman.cpp
@@ -78,7 +78,9 @@ FUZZ_TARGET(banman, .init = initialize_banman)
contains_invalid = true;
}
}
- ban_man.Ban(net_addr, ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool());
+ auto ban_time_offset = ConsumeBanTimeOffset(fuzzed_data_provider);
+ auto since_unix_epoch = fuzzed_data_provider.ConsumeBool();
+ ban_man.Ban(net_addr, ban_time_offset, since_unix_epoch);
},
[&] {
CSubNet subnet{ConsumeSubNet(fuzzed_data_provider)};
@@ -86,7 +88,9 @@ FUZZ_TARGET(banman, .init = initialize_banman)
if (!subnet.IsValid()) {
contains_invalid = true;
}
- ban_man.Ban(subnet, ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool());
+ auto ban_time_offset = ConsumeBanTimeOffset(fuzzed_data_provider);
+ auto since_unix_epoch = fuzzed_data_provider.ConsumeBool();
+ ban_man.Ban(subnet, ban_time_offset, since_unix_epoch);
},
[&] {
ban_man.ClearBanned();
diff --git a/src/test/fuzz/bech32.cpp b/src/test/fuzz/bech32.cpp
index ffc5ba518f..daa6e24404 100644
--- a/src/test/fuzz/bech32.cpp
+++ b/src/test/fuzz/bech32.cpp
@@ -29,8 +29,9 @@ FUZZ_TARGET(bech32)
std::vector<unsigned char> input;
ConvertBits<8, 5, true>([&](unsigned char c) { input.push_back(c); }, buffer.begin(), buffer.end());
- if (input.size() + 3 + 6 <= 90) {
- // If it's possible to encode input in Bech32(m) without exceeding the 90-character limit:
+ // Input data part + 3 characters for the HRP and separator (bc1) + the checksum characters
+ if (input.size() + 3 + bech32::CHECKSUM_SIZE <= bech32::CharLimit::BECH32) {
+ // If it's possible to encode input in Bech32(m) without exceeding the bech32-character limit:
for (auto encoding : {bech32::Encoding::BECH32, bech32::Encoding::BECH32M}) {
const std::string encoded = bech32::Encode(encoding, "bc", input);
assert(!encoded.empty());
diff --git a/src/test/fuzz/bip324.cpp b/src/test/fuzz/bip324.cpp
index 8210e75cee..f1fa15d8a3 100644
--- a/src/test/fuzz/bip324.cpp
+++ b/src/test/fuzz/bip324.cpp
@@ -4,12 +4,13 @@
#include <bip324.h>
#include <chainparams.h>
+#include <random.h>
#include <span.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
-#include <test/util/xoroshiro128plusplus.h>
+#include <algorithm>
#include <cstdint>
#include <vector>
@@ -56,12 +57,12 @@ FUZZ_TARGET(bip324_cipher_roundtrip, .init=Initialize)
// (potentially buggy) edge cases triggered by specific values of contents/AAD, so we can avoid
// reading the actual data for those from the fuzzer input (which would need large amounts of
// data).
- XoRoShiRo128PlusPlus rng(provider.ConsumeIntegral<uint64_t>());
+ InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>());
// Compare session IDs and garbage terminators.
- assert(initiator.GetSessionID() == responder.GetSessionID());
- assert(initiator.GetSendGarbageTerminator() == responder.GetReceiveGarbageTerminator());
- assert(initiator.GetReceiveGarbageTerminator() == responder.GetSendGarbageTerminator());
+ assert(std::ranges::equal(initiator.GetSessionID(), responder.GetSessionID()));
+ assert(std::ranges::equal(initiator.GetSendGarbageTerminator(), responder.GetReceiveGarbageTerminator()));
+ assert(std::ranges::equal(initiator.GetReceiveGarbageTerminator(), responder.GetSendGarbageTerminator()));
LIMITED_WHILE(provider.remaining_bytes(), 1000) {
// Mode:
@@ -79,10 +80,8 @@ FUZZ_TARGET(bip324_cipher_roundtrip, .init=Initialize)
unsigned length_bits = 2 * ((mode >> 5) & 7);
unsigned length = provider.ConsumeIntegralInRange<unsigned>(0, (1 << length_bits) - 1);
// Generate aad and content.
- std::vector<std::byte> aad(aad_length);
- for (auto& val : aad) val = std::byte{(uint8_t)rng()};
- std::vector<std::byte> contents(length);
- for (auto& val : contents) val = std::byte{(uint8_t)rng()};
+ auto aad = rng.randbytes<std::byte>(aad_length);
+ auto contents = rng.randbytes<std::byte>(length);
// Pick sides.
auto& sender{from_init ? initiator : responder};
diff --git a/src/test/fuzz/bitset.cpp b/src/test/fuzz/bitset.cpp
index 7684337729..ce6be0499c 100644
--- a/src/test/fuzz/bitset.cpp
+++ b/src/test/fuzz/bitset.cpp
@@ -2,9 +2,9 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <random.h>
#include <span.h>
#include <test/fuzz/util.h>
-#include <test/util/xoroshiro128plusplus.h>
#include <util/bitset.h>
#include <bitset>
@@ -29,7 +29,7 @@ void TestType(FuzzBufferType buffer)
* bitsets and their simulations do not matter for the purpose of detecting edge cases, thus
* these are taken from a deterministically-seeded RNG instead. To provide some level of
* variation however, pick the seed based on the buffer size and size of the chosen bitset. */
- XoRoShiRo128PlusPlus rng(buffer.size() + 0x10000 * S::Size());
+ InsecureRandomContext rng(buffer.size() + 0x10000 * S::Size());
using Sim = std::bitset<S::Size()>;
// Up to 4 real BitSets (initially 2).
@@ -124,7 +124,7 @@ void TestType(FuzzBufferType buffer)
sim[dest].reset();
real[dest] = S{};
for (unsigned i = 0; i < S::Size(); ++i) {
- if (rng() & 1) {
+ if (rng.randbool()) {
sim[dest][i] = true;
real[dest].Set(i);
}
@@ -132,9 +132,9 @@ void TestType(FuzzBufferType buffer)
break;
} else if (dest < sim.size() && command-- == 0) {
/* Assign initializer list. */
- unsigned r1 = rng() % S::Size();
- unsigned r2 = rng() % S::Size();
- unsigned r3 = rng() % S::Size();
+ unsigned r1 = rng.randrange(S::Size());
+ unsigned r2 = rng.randrange(S::Size());
+ unsigned r3 = rng.randrange(S::Size());
compare_fn(dest);
sim[dest].reset();
real[dest] = {r1, r2, r3};
@@ -166,8 +166,8 @@ void TestType(FuzzBufferType buffer)
break;
} else if (sim.size() < 4 && command-- == 0) {
/* Construct with initializer list. */
- unsigned r1 = rng() % S::Size();
- unsigned r2 = rng() % S::Size();
+ unsigned r1 = rng.randrange(S::Size());
+ unsigned r2 = rng.randrange(S::Size());
sim.emplace_back();
sim.back().set(r1);
sim.back().set(r2);
diff --git a/src/test/fuzz/block_header.cpp b/src/test/fuzz/block_header.cpp
index c73270dcb3..2e446b16eb 100644
--- a/src/test/fuzz/block_header.cpp
+++ b/src/test/fuzz/block_header.cpp
@@ -23,7 +23,7 @@ FUZZ_TARGET(block_header)
}
{
const uint256 hash = block_header->GetHash();
- static const uint256 u256_max(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
+ constexpr uint256 u256_max{"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
assert(hash != u256_max);
assert(block_header->GetBlockTime() == block_header->nTime);
assert(block_header->IsNull() == (block_header->nBits == 0));
diff --git a/src/test/fuzz/block_index.cpp b/src/test/fuzz/block_index.cpp
new file mode 100644
index 0000000000..eef8c2efc8
--- /dev/null
+++ b/src/test/fuzz/block_index.cpp
@@ -0,0 +1,133 @@
+// 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 <chain.h>
+#include <chainparams.h>
+#include <node/blockstorage.h>
+#include <test/fuzz/FuzzedDataProvider.h>
+#include <test/fuzz/fuzz.h>
+#include <test/fuzz/util.h>
+#include <test/util/setup_common.h>
+#include <txdb.h>
+#include <validation.h>
+
+namespace {
+
+const BasicTestingSetup* g_setup;
+
+// Hardcoded block hash and nBits to make sure the blocks we store pass the pow check.
+uint256 g_block_hash;
+
+bool operator==(const CBlockFileInfo& a, const CBlockFileInfo& b)
+{
+ return a.nBlocks == b.nBlocks &&
+ a.nSize == b.nSize &&
+ a.nUndoSize == b.nUndoSize &&
+ a.nHeightFirst == b.nHeightFirst &&
+ a.nHeightLast == b.nHeightLast &&
+ a.nTimeFirst == b.nTimeFirst &&
+ a.nTimeLast == b.nTimeLast;
+}
+
+CBlockHeader ConsumeBlockHeader(FuzzedDataProvider& provider)
+{
+ CBlockHeader header;
+ header.nVersion = provider.ConsumeIntegral<decltype(header.nVersion)>();
+ header.hashPrevBlock = g_block_hash;
+ header.hashMerkleRoot = g_block_hash;
+ header.nTime = provider.ConsumeIntegral<decltype(header.nTime)>();
+ header.nBits = Params().GenesisBlock().nBits;
+ header.nNonce = provider.ConsumeIntegral<decltype(header.nNonce)>();
+ return header;
+}
+
+} // namespace
+
+void init_block_index()
+{
+ static const auto testing_setup = MakeNoLogFileContext<>(ChainType::MAIN);
+ g_setup = testing_setup.get();
+ g_block_hash = Params().GenesisBlock().GetHash();
+}
+
+FUZZ_TARGET(block_index, .init = init_block_index)
+{
+ FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
+ auto block_index = kernel::BlockTreeDB(DBParams{
+ .path = "", // Memory only.
+ .cache_bytes = 1 << 20, // 1MB.
+ .memory_only = true,
+ });
+
+ // Generate a number of block files to be stored in the index.
+ int files_count = fuzzed_data_provider.ConsumeIntegralInRange(1, 100);
+ std::vector<std::unique_ptr<CBlockFileInfo>> files;
+ files.reserve(files_count);
+ std::vector<std::pair<int, const CBlockFileInfo*>> files_info;
+ files_info.reserve(files_count);
+ for (int i = 0; i < files_count; i++) {
+ if (auto file_info = ConsumeDeserializable<CBlockFileInfo>(fuzzed_data_provider)) {
+ files.push_back(std::make_unique<CBlockFileInfo>(std::move(*file_info)));
+ files_info.emplace_back(i, files.back().get());
+ } else {
+ return;
+ }
+ }
+
+ // Generate a number of block headers to be stored in the index.
+ int blocks_count = fuzzed_data_provider.ConsumeIntegralInRange(files_count * 10, files_count * 100);
+ std::vector<std::unique_ptr<CBlockIndex>> blocks;
+ blocks.reserve(blocks_count);
+ std::vector<const CBlockIndex*> blocks_info;
+ blocks_info.reserve(blocks_count);
+ for (int i = 0; i < blocks_count; i++) {
+ CBlockHeader header{ConsumeBlockHeader(fuzzed_data_provider)};
+ blocks.push_back(std::make_unique<CBlockIndex>(std::move(header)));
+ blocks.back()->phashBlock = &g_block_hash;
+ blocks_info.push_back(blocks.back().get());
+ }
+
+ // Store these files and blocks in the block index. It should not fail.
+ assert(block_index.WriteBatchSync(files_info, files_count - 1, blocks_info));
+
+ // We should be able to read every block file info we stored. Its value should correspond to
+ // what we stored above.
+ CBlockFileInfo info;
+ for (const auto& [n, file_info]: files_info) {
+ assert(block_index.ReadBlockFileInfo(n, info));
+ assert(info == *file_info);
+ }
+
+ // We should be able to read the last block file number. Its value should be consistent.
+ int last_block_file;
+ assert(block_index.ReadLastBlockFile(last_block_file));
+ assert(last_block_file == files_count - 1);
+
+ // We should be able to flip and read the reindexing flag.
+ bool reindexing;
+ block_index.WriteReindexing(true);
+ block_index.ReadReindexing(reindexing);
+ assert(reindexing);
+ block_index.WriteReindexing(false);
+ block_index.ReadReindexing(reindexing);
+ assert(!reindexing);
+
+ // We should be able to set and read the value of any random flag.
+ const std::string flag_name = fuzzed_data_provider.ConsumeRandomLengthString(100);
+ bool flag_value;
+ block_index.WriteFlag(flag_name, true);
+ block_index.ReadFlag(flag_name, flag_value);
+ assert(flag_value);
+ block_index.WriteFlag(flag_name, false);
+ block_index.ReadFlag(flag_name, flag_value);
+ assert(!flag_value);
+
+ // We should be able to load everything we've previously stored. Note to assert on the
+ // return value we need to make sure all blocks pass the pow check.
+ const auto params{Params().GetConsensus()};
+ const auto inserter = [&](const uint256&) {
+ return blocks.back().get();
+ };
+ WITH_LOCK(::cs_main, assert(block_index.LoadBlockIndexGuts(params, inserter, g_setup->m_interrupt)));
+}
diff --git a/src/test/fuzz/buffered_file.cpp b/src/test/fuzz/buffered_file.cpp
index e30c19b265..a6a042a25c 100644
--- a/src/test/fuzz/buffered_file.cpp
+++ b/src/test/fuzz/buffered_file.cpp
@@ -25,7 +25,9 @@ FUZZ_TARGET(buffered_file)
ConsumeRandomLengthByteVector<std::byte>(fuzzed_data_provider),
};
try {
- opt_buffered_file.emplace(fuzzed_file, fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096));
+ auto n_buf_size = fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096);
+ auto n_rewind_in = fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096);
+ opt_buffered_file.emplace(fuzzed_file, n_buf_size, n_rewind_in);
} catch (const std::ios_base::failure&) {
}
if (opt_buffered_file && !fuzzed_file.IsNull()) {
diff --git a/src/test/fuzz/cluster_linearize.cpp b/src/test/fuzz/cluster_linearize.cpp
new file mode 100644
index 0000000000..d91f85d867
--- /dev/null
+++ b/src/test/fuzz/cluster_linearize.cpp
@@ -0,0 +1,1021 @@
+// 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.
+
+#include <cluster_linearize.h>
+#include <serialize.h>
+#include <streams.h>
+#include <test/fuzz/fuzz.h>
+#include <test/fuzz/FuzzedDataProvider.h>
+#include <test/util/cluster_linearize.h>
+#include <util/bitset.h>
+#include <util/feefrac.h>
+
+#include <algorithm>
+#include <stdint.h>
+#include <vector>
+#include <utility>
+
+using namespace cluster_linearize;
+
+namespace {
+
+/** A simple finder class for candidate sets.
+ *
+ * This class matches SearchCandidateFinder in interface and behavior, though with fewer
+ * optimizations.
+ */
+template<typename SetType>
+class SimpleCandidateFinder
+{
+ /** Internal dependency graph. */
+ const DepGraph<SetType>& m_depgraph;
+ /** Which transaction are left to include. */
+ SetType m_todo;
+
+public:
+ /** Construct an SimpleCandidateFinder for a given graph. */
+ SimpleCandidateFinder(const DepGraph<SetType>& depgraph LIFETIMEBOUND) noexcept :
+ m_depgraph(depgraph), m_todo{SetType::Fill(depgraph.TxCount())} {}
+
+ /** Remove a set of transactions from the set of to-be-linearized ones. */
+ void MarkDone(SetType select) noexcept { m_todo -= select; }
+
+ /** Determine whether unlinearized transactions remain. */
+ bool AllDone() const noexcept { return m_todo.None(); }
+
+ /** Find a candidate set using at most max_iterations iterations, and the number of iterations
+ * actually performed. If that number is less than max_iterations, then the result is optimal.
+ *
+ * Complexity: O(N * M), where M is the number of connected topological subsets of the cluster.
+ * That number is bounded by M <= 2^(N-1).
+ */
+ std::pair<SetInfo<SetType>, uint64_t> FindCandidateSet(uint64_t max_iterations) const noexcept
+ {
+ uint64_t iterations_left = max_iterations;
+ // Queue of work units. Each consists of:
+ // - inc: set of transactions definitely included
+ // - und: set of transactions that can be added to inc still
+ std::vector<std::pair<SetType, SetType>> queue;
+ // Initially we have just one queue element, with the entire graph in und.
+ queue.emplace_back(SetType{}, m_todo);
+ // Best solution so far.
+ SetInfo best(m_depgraph, m_todo);
+ // Process the queue.
+ while (!queue.empty() && iterations_left) {
+ --iterations_left;
+ // Pop top element of the queue.
+ auto [inc, und] = queue.back();
+ queue.pop_back();
+ // Look for a transaction to consider adding/removing.
+ bool inc_none = inc.None();
+ for (auto split : und) {
+ // If inc is empty, consider any split transaction. Otherwise only consider
+ // transactions that share ancestry with inc so far (which means only connected
+ // sets will be considered).
+ if (inc_none || inc.Overlaps(m_depgraph.Ancestors(split))) {
+ // Add a queue entry with split included.
+ SetInfo new_inc(m_depgraph, inc | (m_todo & m_depgraph.Ancestors(split)));
+ queue.emplace_back(new_inc.transactions, und - new_inc.transactions);
+ // Add a queue entry with split excluded.
+ queue.emplace_back(inc, und - m_depgraph.Descendants(split));
+ // Update statistics to account for the candidate new_inc.
+ if (new_inc.feerate > best.feerate) best = new_inc;
+ break;
+ }
+ }
+ }
+ return {std::move(best), max_iterations - iterations_left};
+ }
+};
+
+/** A very simple finder class for optimal candidate sets, which tries every subset.
+ *
+ * It is even simpler than SimpleCandidateFinder, and is primarily included here to test the
+ * correctness of SimpleCandidateFinder, which is then used to test the correctness of
+ * SearchCandidateFinder.
+ */
+template<typename SetType>
+class ExhaustiveCandidateFinder
+{
+ /** Internal dependency graph. */
+ const DepGraph<SetType>& m_depgraph;
+ /** Which transaction are left to include. */
+ SetType m_todo;
+
+public:
+ /** Construct an ExhaustiveCandidateFinder for a given graph. */
+ ExhaustiveCandidateFinder(const DepGraph<SetType>& depgraph LIFETIMEBOUND) noexcept :
+ m_depgraph(depgraph), m_todo{SetType::Fill(depgraph.TxCount())} {}
+
+ /** Remove a set of transactions from the set of to-be-linearized ones. */
+ void MarkDone(SetType select) noexcept { m_todo -= select; }
+
+ /** Determine whether unlinearized transactions remain. */
+ bool AllDone() const noexcept { return m_todo.None(); }
+
+ /** Find the optimal remaining candidate set.
+ *
+ * Complexity: O(N * 2^N).
+ */
+ SetInfo<SetType> FindCandidateSet() const noexcept
+ {
+ // Best solution so far.
+ SetInfo<SetType> best{m_todo, m_depgraph.FeeRate(m_todo)};
+ // The number of combinations to try.
+ uint64_t limit = (uint64_t{1} << m_todo.Count()) - 1;
+ // Try the transitive closure of every non-empty subset of m_todo.
+ for (uint64_t x = 1; x < limit; ++x) {
+ // If bit number b is set in x, then the remaining ancestors of the b'th remaining
+ // transaction in m_todo are included.
+ SetType txn;
+ auto x_shifted{x};
+ for (auto i : m_todo) {
+ if (x_shifted & 1) txn |= m_depgraph.Ancestors(i);
+ x_shifted >>= 1;
+ }
+ SetInfo cur(m_depgraph, txn & m_todo);
+ if (cur.feerate > best.feerate) best = cur;
+ }
+ return best;
+ }
+};
+
+/** A simple linearization algorithm.
+ *
+ * This matches Linearize() in interface and behavior, though with fewer optimizations, lacking
+ * the ability to pass in an existing linearization, and using just SimpleCandidateFinder rather
+ * than AncestorCandidateFinder and SearchCandidateFinder.
+ */
+template<typename SetType>
+std::pair<std::vector<ClusterIndex>, bool> SimpleLinearize(const DepGraph<SetType>& depgraph, uint64_t max_iterations)
+{
+ std::vector<ClusterIndex> linearization;
+ SimpleCandidateFinder finder(depgraph);
+ SetType todo = SetType::Fill(depgraph.TxCount());
+ bool optimal = true;
+ while (todo.Any()) {
+ auto [candidate, iterations_done] = finder.FindCandidateSet(max_iterations);
+ if (iterations_done == max_iterations) optimal = false;
+ depgraph.AppendTopo(linearization, candidate.transactions);
+ todo -= candidate.transactions;
+ finder.MarkDone(candidate.transactions);
+ max_iterations -= iterations_done;
+ }
+ return {std::move(linearization), optimal};
+}
+
+/** Stitch connected components together in a DepGraph, guaranteeing its corresponding cluster is connected. */
+template<typename BS>
+void MakeConnected(DepGraph<BS>& depgraph)
+{
+ auto todo = BS::Fill(depgraph.TxCount());
+ auto comp = depgraph.FindConnectedComponent(todo);
+ Assume(depgraph.IsConnected(comp));
+ todo -= comp;
+ while (todo.Any()) {
+ auto nextcomp = depgraph.FindConnectedComponent(todo);
+ Assume(depgraph.IsConnected(nextcomp));
+ depgraph.AddDependency(comp.Last(), nextcomp.First());
+ todo -= nextcomp;
+ comp = nextcomp;
+ }
+}
+
+/** Given a dependency graph, and a todo set, read a topological subset of todo from reader. */
+template<typename SetType>
+SetType ReadTopologicalSet(const DepGraph<SetType>& depgraph, const SetType& todo, SpanReader& reader)
+{
+ uint64_t mask{0};
+ try {
+ reader >> VARINT(mask);
+ } catch(const std::ios_base::failure&) {}
+ SetType ret;
+ for (auto i : todo) {
+ if (!ret[i]) {
+ if (mask & 1) ret |= depgraph.Ancestors(i);
+ mask >>= 1;
+ }
+ }
+ return ret & todo;
+}
+
+/** Given a dependency graph, construct any valid linearization for it, reading from a SpanReader. */
+template<typename BS>
+std::vector<ClusterIndex> ReadLinearization(const DepGraph<BS>& depgraph, SpanReader& reader)
+{
+ std::vector<ClusterIndex> linearization;
+ TestBitSet todo = TestBitSet::Fill(depgraph.TxCount());
+ // In every iteration one topologically-valid transaction is appended to linearization.
+ while (todo.Any()) {
+ // Compute the set of transactions with no not-yet-included ancestors.
+ TestBitSet potential_next;
+ for (auto j : todo) {
+ if ((depgraph.Ancestors(j) & todo) == TestBitSet::Singleton(j)) {
+ potential_next.Set(j);
+ }
+ }
+ // There must always be one (otherwise there is a cycle in the graph).
+ assert(potential_next.Any());
+ // Read a number from reader, and interpret it as index into potential_next.
+ uint64_t idx{0};
+ try {
+ reader >> VARINT(idx);
+ } catch (const std::ios_base::failure&) {}
+ idx %= potential_next.Count();
+ // Find out which transaction that corresponds to.
+ for (auto j : potential_next) {
+ if (idx == 0) {
+ // When found, add it to linearization and remove it from todo.
+ linearization.push_back(j);
+ assert(todo[j]);
+ todo.Reset(j);
+ break;
+ }
+ --idx;
+ }
+ }
+ return linearization;
+}
+
+} // namespace
+
+FUZZ_TARGET(clusterlin_add_dependency)
+{
+ // Verify that computing a DepGraph from a cluster, or building it step by step using AddDependency
+ // have the same effect.
+
+ // Construct a cluster of a certain length, with no dependencies.
+ FuzzedDataProvider provider(buffer.data(), buffer.size());
+ auto num_tx = provider.ConsumeIntegralInRange<ClusterIndex>(2, 32);
+ Cluster<TestBitSet> cluster(num_tx, std::pair{FeeFrac{0, 1}, TestBitSet{}});
+ // Construct the corresponding DepGraph object (also no dependencies).
+ DepGraph depgraph(cluster);
+ SanityCheck(depgraph);
+ // Read (parent, child) pairs, and add them to the cluster and depgraph.
+ LIMITED_WHILE(provider.remaining_bytes() > 0, TestBitSet::Size() * TestBitSet::Size()) {
+ auto parent = provider.ConsumeIntegralInRange<ClusterIndex>(0, num_tx - 1);
+ auto child = provider.ConsumeIntegralInRange<ClusterIndex>(0, num_tx - 2);
+ child += (child >= parent);
+ cluster[child].second.Set(parent);
+ depgraph.AddDependency(parent, child);
+ assert(depgraph.Ancestors(child)[parent]);
+ assert(depgraph.Descendants(parent)[child]);
+ }
+ // Sanity check the result.
+ SanityCheck(depgraph);
+ // Verify that the resulting DepGraph matches one recomputed from the cluster.
+ assert(DepGraph(cluster) == depgraph);
+}
+
+FUZZ_TARGET(clusterlin_cluster_serialization)
+{
+ // Verify that any graph of transactions has its ancestry correctly computed by DepGraph, and
+ // if it is a DAG, that it can be serialized as a DepGraph in a way that roundtrips. This
+ // guarantees that any acyclic cluster has a corresponding DepGraph serialization.
+
+ FuzzedDataProvider provider(buffer.data(), buffer.size());
+
+ // Construct a cluster in a naive way (using a FuzzedDataProvider-based serialization).
+ Cluster<TestBitSet> cluster;
+ auto num_tx = provider.ConsumeIntegralInRange<ClusterIndex>(1, 32);
+ cluster.resize(num_tx);
+ for (ClusterIndex i = 0; i < num_tx; ++i) {
+ cluster[i].first.size = provider.ConsumeIntegralInRange<int32_t>(1, 0x3fffff);
+ cluster[i].first.fee = provider.ConsumeIntegralInRange<int64_t>(-0x8000000000000, 0x7ffffffffffff);
+ for (ClusterIndex j = 0; j < num_tx; ++j) {
+ if (i == j) continue;
+ if (provider.ConsumeBool()) cluster[i].second.Set(j);
+ }
+ }
+
+ // Construct dependency graph, and verify it matches the cluster (which includes a round-trip
+ // check for the serialization).
+ DepGraph depgraph(cluster);
+ VerifyDepGraphFromCluster(cluster, depgraph);
+}
+
+FUZZ_TARGET(clusterlin_depgraph_serialization)
+{
+ // Verify that any deserialized depgraph is acyclic and roundtrips to an identical depgraph.
+
+ // Construct a graph by deserializing.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+ SanityCheck(depgraph);
+
+ // Verify the graph is a DAG.
+ assert(IsAcyclic(depgraph));
+}
+
+FUZZ_TARGET(clusterlin_components)
+{
+ // Verify the behavior of DepGraphs's FindConnectedComponent and IsConnected functions.
+
+ // Construct a depgraph.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+
+ TestBitSet todo = TestBitSet::Fill(depgraph.TxCount());
+ while (todo.Any()) {
+ // Find a connected component inside todo.
+ auto component = depgraph.FindConnectedComponent(todo);
+
+ // The component must be a subset of todo and non-empty.
+ assert(component.IsSubsetOf(todo));
+ assert(component.Any());
+
+ // If todo is the entire graph, and the entire graph is connected, then the component must
+ // be the entire graph.
+ if (todo == TestBitSet::Fill(depgraph.TxCount())) {
+ assert((component == todo) == depgraph.IsConnected());
+ }
+
+ // If subset is connected, then component must match subset.
+ assert((component == todo) == depgraph.IsConnected(todo));
+
+ // The component cannot have any ancestors or descendants outside of component but in todo.
+ for (auto i : component) {
+ assert((depgraph.Ancestors(i) & todo).IsSubsetOf(component));
+ assert((depgraph.Descendants(i) & todo).IsSubsetOf(component));
+ }
+
+ // Starting from any component element, we must be able to reach every element.
+ for (auto i : component) {
+ // Start with just i as reachable.
+ TestBitSet reachable = TestBitSet::Singleton(i);
+ // Add in-todo descendants and ancestors to reachable until it does not change anymore.
+ while (true) {
+ TestBitSet new_reachable = reachable;
+ for (auto j : new_reachable) {
+ new_reachable |= depgraph.Ancestors(j) & todo;
+ new_reachable |= depgraph.Descendants(j) & todo;
+ }
+ if (new_reachable == reachable) break;
+ reachable = new_reachable;
+ }
+ // Verify that the result is the entire component.
+ assert(component == reachable);
+ }
+
+ // Construct an arbitrary subset of todo.
+ uint64_t subset_bits{0};
+ try {
+ reader >> VARINT(subset_bits);
+ } catch (const std::ios_base::failure&) {}
+ TestBitSet subset;
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ if (todo[i]) {
+ if (subset_bits & 1) subset.Set(i);
+ subset_bits >>= 1;
+ }
+ }
+ // Which must be non-empty.
+ if (subset.None()) subset = TestBitSet::Singleton(todo.First());
+ // Remove it from todo.
+ todo -= subset;
+ }
+
+ // No components can be found in an empty subset.
+ assert(depgraph.FindConnectedComponent(todo).None());
+}
+
+FUZZ_TARGET(clusterlin_make_connected)
+{
+ // Verify that MakeConnected makes graphs connected.
+
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+ MakeConnected(depgraph);
+ SanityCheck(depgraph);
+ assert(depgraph.IsConnected());
+}
+
+FUZZ_TARGET(clusterlin_chunking)
+{
+ // Verify the correctness of the ChunkLinearization function.
+
+ // Construct a graph by deserializing.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+
+ // Read a valid linearization for depgraph.
+ auto linearization = ReadLinearization(depgraph, reader);
+
+ // Invoke the chunking function.
+ auto chunking = ChunkLinearization(depgraph, linearization);
+
+ // Verify that chunk feerates are monotonically non-increasing.
+ for (size_t i = 1; i < chunking.size(); ++i) {
+ assert(!(chunking[i] >> chunking[i - 1]));
+ }
+
+ // Naively recompute the chunks (each is the highest-feerate prefix of what remains).
+ auto todo = TestBitSet::Fill(depgraph.TxCount());
+ for (const auto& chunk_feerate : chunking) {
+ assert(todo.Any());
+ SetInfo<TestBitSet> accumulator, best;
+ for (ClusterIndex idx : linearization) {
+ if (todo[idx]) {
+ accumulator.Set(depgraph, idx);
+ if (best.feerate.IsEmpty() || accumulator.feerate >> best.feerate) {
+ best = accumulator;
+ }
+ }
+ }
+ assert(chunk_feerate == best.feerate);
+ assert(best.transactions.IsSubsetOf(todo));
+ todo -= best.transactions;
+ }
+ assert(todo.None());
+}
+
+FUZZ_TARGET(clusterlin_ancestor_finder)
+{
+ // Verify that AncestorCandidateFinder works as expected.
+
+ // Retrieve a depgraph from the fuzz input.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+
+ AncestorCandidateFinder anc_finder(depgraph);
+ auto todo = TestBitSet::Fill(depgraph.TxCount());
+ while (todo.Any()) {
+ // Call the ancestor finder's FindCandidateSet for what remains of the graph.
+ assert(!anc_finder.AllDone());
+ assert(todo.Count() == anc_finder.NumRemaining());
+ auto best_anc = anc_finder.FindCandidateSet();
+ // Sanity check the result.
+ assert(best_anc.transactions.Any());
+ assert(best_anc.transactions.IsSubsetOf(todo));
+ assert(depgraph.FeeRate(best_anc.transactions) == best_anc.feerate);
+ assert(depgraph.IsConnected(best_anc.transactions));
+ // Check that it is topologically valid.
+ for (auto i : best_anc.transactions) {
+ assert((depgraph.Ancestors(i) & todo).IsSubsetOf(best_anc.transactions));
+ }
+
+ // Compute all remaining ancestor sets.
+ std::optional<SetInfo<TestBitSet>> real_best_anc;
+ for (auto i : todo) {
+ SetInfo info(depgraph, todo & depgraph.Ancestors(i));
+ if (!real_best_anc.has_value() || info.feerate > real_best_anc->feerate) {
+ real_best_anc = info;
+ }
+ }
+ // The set returned by anc_finder must equal the real best ancestor sets.
+ assert(real_best_anc.has_value());
+ assert(*real_best_anc == best_anc);
+
+ // Find a topologically valid subset of transactions to remove from the graph.
+ auto del_set = ReadTopologicalSet(depgraph, todo, reader);
+ // If we did not find anything, use best_anc itself, because we should remove something.
+ if (del_set.None()) del_set = best_anc.transactions;
+ todo -= del_set;
+ anc_finder.MarkDone(del_set);
+ }
+ assert(anc_finder.AllDone());
+ assert(anc_finder.NumRemaining() == 0);
+}
+
+static constexpr auto MAX_SIMPLE_ITERATIONS = 300000;
+
+FUZZ_TARGET(clusterlin_search_finder)
+{
+ // Verify that SearchCandidateFinder works as expected by sanity checking the results
+ // and comparing with the results from SimpleCandidateFinder, ExhaustiveCandidateFinder, and
+ // AncestorCandidateFinder.
+
+ // Retrieve an RNG seed, a depgraph, and whether to make it connected, from the fuzz input.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ uint64_t rng_seed{0};
+ uint8_t make_connected{1};
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph) >> rng_seed >> make_connected;
+ } catch (const std::ios_base::failure&) {}
+ // The most complicated graphs are connected ones (other ones just split up). Optionally force
+ // the graph to be connected.
+ if (make_connected) MakeConnected(depgraph);
+
+ // Instantiate ALL the candidate finders.
+ SearchCandidateFinder src_finder(depgraph, rng_seed);
+ SimpleCandidateFinder smp_finder(depgraph);
+ ExhaustiveCandidateFinder exh_finder(depgraph);
+ AncestorCandidateFinder anc_finder(depgraph);
+
+ auto todo = TestBitSet::Fill(depgraph.TxCount());
+ while (todo.Any()) {
+ assert(!src_finder.AllDone());
+ assert(!smp_finder.AllDone());
+ assert(!exh_finder.AllDone());
+ assert(!anc_finder.AllDone());
+ assert(anc_finder.NumRemaining() == todo.Count());
+
+ // For each iteration, read an iteration count limit from the fuzz input.
+ uint64_t max_iterations = 1;
+ try {
+ reader >> VARINT(max_iterations);
+ } catch (const std::ios_base::failure&) {}
+ max_iterations &= 0xfffff;
+
+ // Read an initial subset from the fuzz input.
+ SetInfo init_best(depgraph, ReadTopologicalSet(depgraph, todo, reader));
+
+ // Call the search finder's FindCandidateSet for what remains of the graph.
+ auto [found, iterations_done] = src_finder.FindCandidateSet(max_iterations, init_best);
+
+ // Sanity check the result.
+ assert(iterations_done <= max_iterations);
+ assert(found.transactions.Any());
+ assert(found.transactions.IsSubsetOf(todo));
+ assert(depgraph.FeeRate(found.transactions) == found.feerate);
+ if (!init_best.feerate.IsEmpty()) assert(found.feerate >= init_best.feerate);
+ // Check that it is topologically valid.
+ for (auto i : found.transactions) {
+ assert(found.transactions.IsSupersetOf(depgraph.Ancestors(i) & todo));
+ }
+
+ // At most 2^(N-1) iterations can be required: the maximum number of non-empty topological
+ // subsets a (connected) cluster with N transactions can have. Even when the cluster is no
+ // longer connected after removing certain transactions, this holds, because the connected
+ // components are searched separately.
+ assert(iterations_done <= (uint64_t{1} << (todo.Count() - 1)));
+ // Additionally, test that no more than sqrt(2^N)+1 iterations are required. This is just
+ // an empirical bound that seems to hold, without proof. Still, add a test for it so we
+ // can learn about counterexamples if they exist.
+ if (iterations_done >= 1 && todo.Count() <= 63) {
+ Assume((iterations_done - 1) * (iterations_done - 1) <= uint64_t{1} << todo.Count());
+ }
+
+ // Perform quality checks only if SearchCandidateFinder claims an optimal result.
+ if (iterations_done < max_iterations) {
+ // Optimal sets are always connected.
+ assert(depgraph.IsConnected(found.transactions));
+
+ // Compare with SimpleCandidateFinder.
+ auto [simple, simple_iters] = smp_finder.FindCandidateSet(MAX_SIMPLE_ITERATIONS);
+ assert(found.feerate >= simple.feerate);
+ if (simple_iters < MAX_SIMPLE_ITERATIONS) {
+ assert(found.feerate == simple.feerate);
+ }
+
+ // Compare with AncestorCandidateFinder;
+ auto anc = anc_finder.FindCandidateSet();
+ assert(found.feerate >= anc.feerate);
+
+ // Compare with ExhaustiveCandidateFinder. This quickly gets computationally expensive
+ // for large clusters (O(2^n)), so only do it for sufficiently small ones.
+ if (todo.Count() <= 12) {
+ auto exhaustive = exh_finder.FindCandidateSet();
+ assert(exhaustive.feerate == found.feerate);
+ // Also compare ExhaustiveCandidateFinder with SimpleCandidateFinder (this is
+ // primarily a test for SimpleCandidateFinder's correctness).
+ assert(exhaustive.feerate >= simple.feerate);
+ if (simple_iters < MAX_SIMPLE_ITERATIONS) {
+ assert(exhaustive.feerate == simple.feerate);
+ }
+ }
+ }
+
+ // Find a topologically valid subset of transactions to remove from the graph.
+ auto del_set = ReadTopologicalSet(depgraph, todo, reader);
+ // If we did not find anything, use found itself, because we should remove something.
+ if (del_set.None()) del_set = found.transactions;
+ todo -= del_set;
+ src_finder.MarkDone(del_set);
+ smp_finder.MarkDone(del_set);
+ exh_finder.MarkDone(del_set);
+ anc_finder.MarkDone(del_set);
+ }
+
+ assert(src_finder.AllDone());
+ assert(smp_finder.AllDone());
+ assert(exh_finder.AllDone());
+ assert(anc_finder.AllDone());
+ assert(anc_finder.NumRemaining() == 0);
+}
+
+FUZZ_TARGET(clusterlin_linearization_chunking)
+{
+ // Verify the behavior of LinearizationChunking.
+
+ // Retrieve a depgraph from the fuzz input.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+
+ // Retrieve a topologically-valid subset of depgraph.
+ auto todo = TestBitSet::Fill(depgraph.TxCount());
+ auto subset = SetInfo(depgraph, ReadTopologicalSet(depgraph, todo, reader));
+
+ // Retrieve a valid linearization for depgraph.
+ auto linearization = ReadLinearization(depgraph, reader);
+
+ // Construct a LinearizationChunking object, initially for the whole linearization.
+ LinearizationChunking chunking(depgraph, linearization);
+
+ // Incrementally remove transactions from the chunking object, and check various properties at
+ // every step.
+ while (todo.Any()) {
+ assert(chunking.NumChunksLeft() > 0);
+
+ // Construct linearization with just todo.
+ std::vector<ClusterIndex> linearization_left;
+ for (auto i : linearization) {
+ if (todo[i]) linearization_left.push_back(i);
+ }
+
+ // Compute the chunking for linearization_left.
+ auto chunking_left = ChunkLinearization(depgraph, linearization_left);
+
+ // Verify that it matches the feerates of the chunks of chunking.
+ assert(chunking.NumChunksLeft() == chunking_left.size());
+ for (ClusterIndex i = 0; i < chunking.NumChunksLeft(); ++i) {
+ assert(chunking.GetChunk(i).feerate == chunking_left[i]);
+ }
+
+ // Check consistency of chunking.
+ TestBitSet combined;
+ for (ClusterIndex i = 0; i < chunking.NumChunksLeft(); ++i) {
+ const auto& chunk_info = chunking.GetChunk(i);
+ // Chunks must be non-empty.
+ assert(chunk_info.transactions.Any());
+ // Chunk feerates must be monotonically non-increasing.
+ if (i > 0) assert(!(chunk_info.feerate >> chunking.GetChunk(i - 1).feerate));
+ // Chunks must be a subset of what is left of the linearization.
+ assert(chunk_info.transactions.IsSubsetOf(todo));
+ // Chunks' claimed feerates must match their transactions' aggregate feerate.
+ assert(depgraph.FeeRate(chunk_info.transactions) == chunk_info.feerate);
+ // Chunks must be the highest-feerate remaining prefix.
+ SetInfo<TestBitSet> accumulator, best;
+ for (auto j : linearization) {
+ if (todo[j] && !combined[j]) {
+ accumulator.Set(depgraph, j);
+ if (best.feerate.IsEmpty() || accumulator.feerate > best.feerate) {
+ best = accumulator;
+ }
+ }
+ }
+ assert(best.transactions == chunk_info.transactions);
+ assert(best.feerate == chunk_info.feerate);
+ // Chunks cannot overlap.
+ assert(!chunk_info.transactions.Overlaps(combined));
+ combined |= chunk_info.transactions;
+ // Chunks must be topological.
+ for (auto idx : chunk_info.transactions) {
+ assert((depgraph.Ancestors(idx) & todo).IsSubsetOf(combined));
+ }
+ }
+ assert(combined == todo);
+
+ // Verify the expected properties of LinearizationChunking::IntersectPrefixes:
+ auto intersect = chunking.IntersectPrefixes(subset);
+ // - Intersecting again doesn't change the result.
+ assert(chunking.IntersectPrefixes(intersect) == intersect);
+ // - The intersection is topological.
+ TestBitSet intersect_anc;
+ for (auto idx : intersect.transactions) {
+ intersect_anc |= (depgraph.Ancestors(idx) & todo);
+ }
+ assert(intersect.transactions == intersect_anc);
+ // - The claimed intersection feerate matches its transactions.
+ assert(intersect.feerate == depgraph.FeeRate(intersect.transactions));
+ // - The intersection may only be empty if its input is empty.
+ assert(intersect.transactions.Any() == subset.transactions.Any());
+ // - The intersection feerate must be as high as the input.
+ assert(intersect.feerate >= subset.feerate);
+ // - No non-empty intersection between the intersection and a prefix of the chunks of the
+ // remainder of the linearization may be better than the intersection.
+ TestBitSet prefix;
+ for (ClusterIndex i = 0; i < chunking.NumChunksLeft(); ++i) {
+ prefix |= chunking.GetChunk(i).transactions;
+ auto reintersect = SetInfo(depgraph, prefix & intersect.transactions);
+ if (!reintersect.feerate.IsEmpty()) {
+ assert(reintersect.feerate <= intersect.feerate);
+ }
+ }
+
+ // Find a subset to remove from linearization.
+ auto done = ReadTopologicalSet(depgraph, todo, reader);
+ if (done.None()) {
+ // We need to remove a non-empty subset, so fall back to the unlinearized ancestors of
+ // the first transaction in todo if done is empty.
+ done = depgraph.Ancestors(todo.First()) & todo;
+ }
+ todo -= done;
+ chunking.MarkDone(done);
+ subset = SetInfo(depgraph, subset.transactions - done);
+ }
+
+ assert(chunking.NumChunksLeft() == 0);
+}
+
+FUZZ_TARGET(clusterlin_linearize)
+{
+ // Verify the behavior of Linearize().
+
+ // Retrieve an RNG seed, an iteration count, a depgraph, and whether to make it connected from
+ // the fuzz input.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ uint64_t rng_seed{0};
+ uint64_t iter_count{0};
+ uint8_t make_connected{1};
+ try {
+ reader >> VARINT(iter_count) >> Using<DepGraphFormatter>(depgraph) >> rng_seed >> make_connected;
+ } catch (const std::ios_base::failure&) {}
+ // The most complicated graphs are connected ones (other ones just split up). Optionally force
+ // the graph to be connected.
+ if (make_connected) MakeConnected(depgraph);
+
+ // Optionally construct an old linearization for it.
+ std::vector<ClusterIndex> old_linearization;
+ {
+ uint8_t have_old_linearization{0};
+ try {
+ reader >> have_old_linearization;
+ } catch(const std::ios_base::failure&) {}
+ if (have_old_linearization & 1) {
+ old_linearization = ReadLinearization(depgraph, reader);
+ SanityCheck(depgraph, old_linearization);
+ }
+ }
+
+ // Invoke Linearize().
+ iter_count &= 0x7ffff;
+ auto [linearization, optimal] = Linearize(depgraph, iter_count, rng_seed, old_linearization);
+ SanityCheck(depgraph, linearization);
+ auto chunking = ChunkLinearization(depgraph, linearization);
+
+ // Linearization must always be as good as the old one, if provided.
+ if (!old_linearization.empty()) {
+ auto old_chunking = ChunkLinearization(depgraph, old_linearization);
+ auto cmp = CompareChunks(chunking, old_chunking);
+ assert(cmp >= 0);
+ }
+
+ // If the iteration count is sufficiently high, an optimal linearization must be found.
+ // Each linearization step can use up to 2^(k-1) iterations, with steps k=1..n. That sum is
+ // 2^n - 1.
+ const uint64_t n = depgraph.TxCount();
+ if (n <= 19 && iter_count > (uint64_t{1} << n)) {
+ assert(optimal);
+ }
+ // Additionally, if the assumption of sqrt(2^k)+1 iterations per step holds, plus ceil(k/4)
+ // start-up cost per step, plus ceil(n^2/64) start-up cost overall, we can compute the upper
+ // bound for a whole linearization (summing for k=1..n) using the Python expression
+ // [sum((k+3)//4 + int(math.sqrt(2**k)) + 1 for k in range(1, n + 1)) + (n**2 + 63) // 64 for n in range(0, 35)]:
+ static constexpr uint64_t MAX_OPTIMAL_ITERS[] = {
+ 0, 4, 8, 12, 18, 26, 37, 51, 70, 97, 133, 182, 251, 346, 480, 666, 927, 1296, 1815, 2545,
+ 3576, 5031, 7087, 9991, 14094, 19895, 28096, 39690, 56083, 79263, 112041, 158391, 223936,
+ 316629, 447712
+ };
+ if (n < std::size(MAX_OPTIMAL_ITERS) && iter_count >= MAX_OPTIMAL_ITERS[n]) {
+ Assume(optimal);
+ }
+
+ // If Linearize claims optimal result, run quality tests.
+ if (optimal) {
+ // It must be as good as SimpleLinearize.
+ auto [simple_linearization, simple_optimal] = SimpleLinearize(depgraph, MAX_SIMPLE_ITERATIONS);
+ SanityCheck(depgraph, simple_linearization);
+ auto simple_chunking = ChunkLinearization(depgraph, simple_linearization);
+ auto cmp = CompareChunks(chunking, simple_chunking);
+ assert(cmp >= 0);
+ // If SimpleLinearize finds the optimal result too, they must be equal (if not,
+ // SimpleLinearize is broken).
+ if (simple_optimal) assert(cmp == 0);
+
+ // Only for very small clusters, test every topologically-valid permutation.
+ if (depgraph.TxCount() <= 7) {
+ std::vector<ClusterIndex> perm_linearization(depgraph.TxCount());
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) perm_linearization[i] = i;
+ // Iterate over all valid permutations.
+ do {
+ // Determine whether perm_linearization is topological.
+ TestBitSet perm_done;
+ bool perm_is_topo{true};
+ for (auto i : perm_linearization) {
+ perm_done.Set(i);
+ if (!depgraph.Ancestors(i).IsSubsetOf(perm_done)) {
+ perm_is_topo = false;
+ break;
+ }
+ }
+ // If so, verify that the obtained linearization is as good as the permutation.
+ if (perm_is_topo) {
+ auto perm_chunking = ChunkLinearization(depgraph, perm_linearization);
+ auto cmp = CompareChunks(chunking, perm_chunking);
+ assert(cmp >= 0);
+ }
+ } while(std::next_permutation(perm_linearization.begin(), perm_linearization.end()));
+ }
+ }
+}
+
+FUZZ_TARGET(clusterlin_postlinearize)
+{
+ // Verify expected properties of PostLinearize() on arbitrary linearizations.
+
+ // Retrieve a depgraph from the fuzz input.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+
+ // Retrieve a linearization from the fuzz input.
+ std::vector<ClusterIndex> linearization;
+ linearization = ReadLinearization(depgraph, reader);
+ SanityCheck(depgraph, linearization);
+
+ // Produce a post-processed version.
+ auto post_linearization = linearization;
+ PostLinearize(depgraph, post_linearization);
+ SanityCheck(depgraph, post_linearization);
+
+ // Compare diagrams: post-linearization cannot worsen anywhere.
+ auto chunking = ChunkLinearization(depgraph, linearization);
+ auto post_chunking = ChunkLinearization(depgraph, post_linearization);
+ auto cmp = CompareChunks(post_chunking, chunking);
+ assert(cmp >= 0);
+
+ // Run again, things can keep improving (and never get worse)
+ auto post_post_linearization = post_linearization;
+ PostLinearize(depgraph, post_post_linearization);
+ SanityCheck(depgraph, post_post_linearization);
+ auto post_post_chunking = ChunkLinearization(depgraph, post_post_linearization);
+ cmp = CompareChunks(post_post_chunking, post_chunking);
+ assert(cmp >= 0);
+
+ // The chunks that come out of postlinearizing are always connected.
+ LinearizationChunking linchunking(depgraph, post_linearization);
+ while (linchunking.NumChunksLeft()) {
+ assert(depgraph.IsConnected(linchunking.GetChunk(0).transactions));
+ linchunking.MarkDone(linchunking.GetChunk(0).transactions);
+ }
+}
+
+FUZZ_TARGET(clusterlin_postlinearize_tree)
+{
+ // Verify expected properties of PostLinearize() on linearizations of graphs that form either
+ // an upright or reverse tree structure.
+
+ // Construct a direction, RNG seed, and an arbitrary graph from the fuzz input.
+ SpanReader reader(buffer);
+ uint64_t rng_seed{0};
+ DepGraph<TestBitSet> depgraph_gen;
+ uint8_t direction{0};
+ try {
+ reader >> direction >> rng_seed >> Using<DepGraphFormatter>(depgraph_gen);
+ } catch (const std::ios_base::failure&) {}
+
+ // Now construct a new graph, copying the nodes, but leaving only the first parent (even
+ // direction) or the first child (odd direction).
+ DepGraph<TestBitSet> depgraph_tree;
+ for (ClusterIndex i = 0; i < depgraph_gen.TxCount(); ++i) {
+ depgraph_tree.AddTransaction(depgraph_gen.FeeRate(i));
+ }
+ if (direction & 1) {
+ for (ClusterIndex i = 0; i < depgraph_gen.TxCount(); ++i) {
+ auto children = depgraph_gen.Descendants(i) - TestBitSet::Singleton(i);
+ // Remove descendants that are children of other descendants.
+ for (auto j : children) {
+ if (!children[j]) continue;
+ children -= depgraph_gen.Descendants(j);
+ children.Set(j);
+ }
+ if (children.Any()) depgraph_tree.AddDependency(i, children.First());
+ }
+ } else {
+ for (ClusterIndex i = 0; i < depgraph_gen.TxCount(); ++i) {
+ auto parents = depgraph_gen.Ancestors(i) - TestBitSet::Singleton(i);
+ // Remove ancestors that are parents of other ancestors.
+ for (auto j : parents) {
+ if (!parents[j]) continue;
+ parents -= depgraph_gen.Ancestors(j);
+ parents.Set(j);
+ }
+ if (parents.Any()) depgraph_tree.AddDependency(parents.First(), i);
+ }
+ }
+
+ // Retrieve a linearization from the fuzz input.
+ std::vector<ClusterIndex> linearization;
+ linearization = ReadLinearization(depgraph_tree, reader);
+ SanityCheck(depgraph_tree, linearization);
+
+ // Produce a postlinearized version.
+ auto post_linearization = linearization;
+ PostLinearize(depgraph_tree, post_linearization);
+ SanityCheck(depgraph_tree, post_linearization);
+
+ // Compare diagrams.
+ auto chunking = ChunkLinearization(depgraph_tree, linearization);
+ auto post_chunking = ChunkLinearization(depgraph_tree, post_linearization);
+ auto cmp = CompareChunks(post_chunking, chunking);
+ assert(cmp >= 0);
+
+ // Verify that post-linearizing again does not change the diagram. The result must be identical
+ // as post_linearization ought to be optimal already with a tree-structured graph.
+ auto post_post_linearization = post_linearization;
+ PostLinearize(depgraph_tree, post_linearization);
+ SanityCheck(depgraph_tree, post_linearization);
+ auto post_post_chunking = ChunkLinearization(depgraph_tree, post_post_linearization);
+ auto cmp_post = CompareChunks(post_post_chunking, post_chunking);
+ assert(cmp_post == 0);
+
+ // Try to find an even better linearization directly. This must not change the diagram for the
+ // same reason.
+ auto [opt_linearization, _optimal] = Linearize(depgraph_tree, 100000, rng_seed, post_linearization);
+ auto opt_chunking = ChunkLinearization(depgraph_tree, opt_linearization);
+ auto cmp_opt = CompareChunks(opt_chunking, post_chunking);
+ assert(cmp_opt == 0);
+}
+
+FUZZ_TARGET(clusterlin_postlinearize_moved_leaf)
+{
+ // Verify that taking an existing linearization, and moving a leaf to the back, potentially
+ // increasing its fee, and then post-linearizing, results in something as good as the
+ // original. This guarantees that in an RBF that replaces a transaction with one of the same
+ // size but higher fee, applying the "remove conflicts, append new transaction, postlinearize"
+ // process will never worsen linearization quality.
+
+ // Construct an arbitrary graph and a fee from the fuzz input.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ int32_t fee_inc{0};
+ try {
+ uint64_t fee_inc_code;
+ reader >> Using<DepGraphFormatter>(depgraph) >> VARINT(fee_inc_code);
+ fee_inc = fee_inc_code & 0x3ffff;
+ } catch (const std::ios_base::failure&) {}
+ if (depgraph.TxCount() == 0) return;
+
+ // Retrieve two linearizations from the fuzz input.
+ auto lin = ReadLinearization(depgraph, reader);
+ auto lin_leaf = ReadLinearization(depgraph, reader);
+
+ // Construct a linearization identical to lin, but with the tail end of lin_leaf moved to the
+ // back.
+ std::vector<ClusterIndex> lin_moved;
+ for (auto i : lin) {
+ if (i != lin_leaf.back()) lin_moved.push_back(i);
+ }
+ lin_moved.push_back(lin_leaf.back());
+
+ // Postlinearize lin_moved.
+ PostLinearize(depgraph, lin_moved);
+ SanityCheck(depgraph, lin_moved);
+
+ // Compare diagrams (applying the fee delta after computing the old one).
+ auto old_chunking = ChunkLinearization(depgraph, lin);
+ depgraph.FeeRate(lin_leaf.back()).fee += fee_inc;
+ auto new_chunking = ChunkLinearization(depgraph, lin_moved);
+ auto cmp = CompareChunks(new_chunking, old_chunking);
+ assert(cmp >= 0);
+}
+
+FUZZ_TARGET(clusterlin_merge)
+{
+ // Construct an arbitrary graph from the fuzz input.
+ SpanReader reader(buffer);
+ DepGraph<TestBitSet> depgraph;
+ try {
+ reader >> Using<DepGraphFormatter>(depgraph);
+ } catch (const std::ios_base::failure&) {}
+
+ // Retrieve two linearizations from the fuzz input.
+ auto lin1 = ReadLinearization(depgraph, reader);
+ auto lin2 = ReadLinearization(depgraph, reader);
+
+ // Merge the two.
+ auto lin_merged = MergeLinearizations(depgraph, lin1, lin2);
+
+ // Compute chunkings and compare.
+ auto chunking1 = ChunkLinearization(depgraph, lin1);
+ auto chunking2 = ChunkLinearization(depgraph, lin2);
+ auto chunking_merged = ChunkLinearization(depgraph, lin_merged);
+ auto cmp1 = CompareChunks(chunking_merged, chunking1);
+ assert(cmp1 >= 0);
+ auto cmp2 = CompareChunks(chunking_merged, chunking2);
+ assert(cmp2 >= 0);
+}
diff --git a/src/test/fuzz/coins_view.cpp b/src/test/fuzz/coins_view.cpp
index 8f3e357a84..368c69819a 100644
--- a/src/test/fuzz/coins_view.cpp
+++ b/src/test/fuzz/coins_view.cpp
@@ -27,7 +27,6 @@
#include <vector>
namespace {
-const TestingSetup* g_setup;
const Coin EMPTY_COIN{};
bool operator==(const Coin& a, const Coin& b)
@@ -39,8 +38,7 @@ bool operator==(const Coin& a, const Coin& b)
void initialize_coins_view()
{
- static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
- g_setup = testing_setup.get();
+ static const auto testing_setup = MakeNoLogFileContext<>();
}
FUZZ_TARGET(coins_view, .init = initialize_coins_view)
@@ -122,12 +120,15 @@ FUZZ_TARGET(coins_view, .init = initialize_coins_view)
random_mutable_transaction = *opt_mutable_transaction;
},
[&] {
+ CoinsCachePair sentinel{};
+ sentinel.second.SelfRef(sentinel);
+ size_t usage{0};
CCoinsMapMemoryResource resource;
CCoinsMap coins_map{0, SaltedOutpointHasher{/*deterministic=*/true}, CCoinsMap::key_equal{}, &resource};
LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 10'000)
{
CCoinsCacheEntry coins_cache_entry;
- coins_cache_entry.flags = fuzzed_data_provider.ConsumeIntegral<unsigned char>();
+ const auto flags{fuzzed_data_provider.ConsumeIntegral<uint8_t>()};
if (fuzzed_data_provider.ConsumeBool()) {
coins_cache_entry.coin = random_coin;
} else {
@@ -138,11 +139,14 @@ FUZZ_TARGET(coins_view, .init = initialize_coins_view)
}
coins_cache_entry.coin = *opt_coin;
}
- coins_map.emplace(random_out_point, std::move(coins_cache_entry));
+ auto it{coins_map.emplace(random_out_point, std::move(coins_cache_entry)).first};
+ it->second.AddFlags(flags, *it, sentinel);
+ usage += it->second.coin.DynamicMemoryUsage();
}
bool expected_code_path = false;
try {
- coins_view_cache.BatchWrite(coins_map, fuzzed_data_provider.ConsumeBool() ? ConsumeUInt256(fuzzed_data_provider) : coins_view_cache.GetBestBlock());
+ auto cursor{CoinsViewCacheCursor(usage, sentinel, coins_map, /*will_erase=*/true)};
+ coins_view_cache.BatchWrite(cursor, fuzzed_data_provider.ConsumeBool() ? ConsumeUInt256(fuzzed_data_provider) : coins_view_cache.GetBestBlock());
expected_code_path = true;
} catch (const std::logic_error& e) {
if (e.what() == std::string{"FRESH flag misapplied to coin that exists in parent cache"}) {
diff --git a/src/test/fuzz/coinscache_sim.cpp b/src/test/fuzz/coinscache_sim.cpp
index 648e96b4a0..8e717e96b4 100644
--- a/src/test/fuzz/coinscache_sim.cpp
+++ b/src/test/fuzz/coinscache_sim.cpp
@@ -172,13 +172,13 @@ public:
std::unique_ptr<CCoinsViewCursor> Cursor() const final { return {}; }
size_t EstimateSize() const final { return m_data.size(); }
- bool BatchWrite(CCoinsMap& data, const uint256&, bool erase) final
+ bool BatchWrite(CoinsViewCacheCursor& cursor, const uint256&) final
{
- for (auto it = data.begin(); it != data.end(); it = erase ? data.erase(it) : std::next(it)) {
- if (it->second.flags & CCoinsCacheEntry::DIRTY) {
+ for (auto it{cursor.Begin()}; it != cursor.End(); it = cursor.NextAndMaybeErase(*it)) {
+ if (it->second.IsDirty()) {
if (it->second.coin.IsSpent() && (it->first.n % 5) != 4) {
m_data.erase(it->first);
- } else if (erase) {
+ } else if (cursor.WillErase(*it)) {
m_data[it->first] = std::move(it->second.coin);
} else {
m_data[it->first] = it->second.coin;
diff --git a/src/test/fuzz/connman.cpp b/src/test/fuzz/connman.cpp
index 8f5f6a6071..beefc9d82e 100644
--- a/src/test/fuzz/connman.cpp
+++ b/src/test/fuzz/connman.cpp
@@ -91,17 +91,15 @@ FUZZ_TARGET(connman, .init = initialize_connman)
(void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
},
[&] {
- (void)connman.GetAddresses(
- /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
- /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
- /*network=*/std::nullopt,
- /*filtered=*/fuzzed_data_provider.ConsumeBool());
+ auto max_addresses = fuzzed_data_provider.ConsumeIntegral<size_t>();
+ auto max_pct = fuzzed_data_provider.ConsumeIntegral<size_t>();
+ auto filtered = fuzzed_data_provider.ConsumeBool();
+ (void)connman.GetAddresses(max_addresses, max_pct, /*network=*/std::nullopt, filtered);
},
[&] {
- (void)connman.GetAddresses(
- /*requestor=*/random_node,
- /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
- /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
+ auto max_addresses = fuzzed_data_provider.ConsumeIntegral<size_t>();
+ auto max_pct = fuzzed_data_provider.ConsumeIntegral<size_t>();
+ (void)connman.GetAddresses(/*requestor=*/random_node, max_addresses, max_pct);
},
[&] {
(void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
diff --git a/src/test/fuzz/crypto.cpp b/src/test/fuzz/crypto.cpp
index ca8c1cd033..aa478277e3 100644
--- a/src/test/fuzz/crypto.cpp
+++ b/src/test/fuzz/crypto.cpp
@@ -22,7 +22,9 @@ FUZZ_TARGET(crypto)
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
std::vector<uint8_t> data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
if (data.empty()) {
- data.resize(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096), fuzzed_data_provider.ConsumeIntegral<uint8_t>());
+ auto new_size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096);
+ auto x = fuzzed_data_provider.ConsumeIntegral<uint8_t>();
+ data.resize(new_size, x);
}
CHash160 hash160;
@@ -44,7 +46,9 @@ FUZZ_TARGET(crypto)
if (fuzzed_data_provider.ConsumeBool()) {
data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
if (data.empty()) {
- data.resize(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096), fuzzed_data_provider.ConsumeIntegral<uint8_t>());
+ auto new_size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096);
+ auto x = fuzzed_data_provider.ConsumeIntegral<uint8_t>();
+ data.resize(new_size, x);
}
}
diff --git a/src/test/fuzz/crypto_chacha20.cpp b/src/test/fuzz/crypto_chacha20.cpp
index 50c77bf699..fe47f18923 100644
--- a/src/test/fuzz/crypto_chacha20.cpp
+++ b/src/test/fuzz/crypto_chacha20.cpp
@@ -3,10 +3,10 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <crypto/chacha20.h>
+#include <random.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
-#include <test/util/xoroshiro128plusplus.h>
#include <array>
#include <cstddef>
@@ -28,11 +28,10 @@ FUZZ_TARGET(crypto_chacha20)
chacha20.SetKey(key);
},
[&] {
- chacha20.Seek(
- {
- fuzzed_data_provider.ConsumeIntegral<uint32_t>(),
- fuzzed_data_provider.ConsumeIntegral<uint64_t>()
- }, fuzzed_data_provider.ConsumeIntegral<uint32_t>());
+ ChaCha20::Nonce96 nonce{
+ fuzzed_data_provider.ConsumeIntegral<uint32_t>(),
+ fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
+ chacha20.Seek(nonce, fuzzed_data_provider.ConsumeIntegral<uint32_t>());
},
[&] {
std::vector<uint8_t> output(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
@@ -53,7 +52,7 @@ namespace
once for a large block at once, and then the same data in chunks, comparing
the outcome.
- If UseCrypt, seeded Xoroshiro128++ output is used as input to Crypt().
+ If UseCrypt, seeded InsecureRandomContext output is used as input to Crypt().
If not, Keystream() is used directly, or sequences of 0x00 are encrypted.
*/
template<bool UseCrypt>
@@ -78,25 +77,11 @@ void ChaCha20SplitFuzz(FuzzedDataProvider& provider)
data1.resize(total_bytes);
data2.resize(total_bytes);
- // If using Crypt(), initialize data1 and data2 with the same Xoroshiro128++ based
+ // If using Crypt(), initialize data1 and data2 with the same InsecureRandomContext based
// stream.
if constexpr (UseCrypt) {
- uint64_t seed = provider.ConsumeIntegral<uint64_t>();
- XoRoShiRo128PlusPlus rng(seed);
- uint64_t bytes = 0;
- while (bytes < (total_bytes & ~uint64_t{7})) {
- uint64_t val = rng();
- WriteLE64(UCharCast(data1.data() + bytes), val);
- WriteLE64(UCharCast(data2.data() + bytes), val);
- bytes += 8;
- }
- if (bytes < total_bytes) {
- std::byte valbytes[8];
- uint64_t val = rng();
- WriteLE64(UCharCast(valbytes), val);
- std::copy(valbytes, valbytes + (total_bytes - bytes), data1.data() + bytes);
- std::copy(valbytes, valbytes + (total_bytes - bytes), data2.data() + bytes);
- }
+ InsecureRandomContext(provider.ConsumeIntegral<uint64_t>()).fillrand(data1);
+ std::copy(data1.begin(), data1.end(), data2.begin());
}
// Whether UseCrypt is used or not, the two byte arrays must match.
diff --git a/src/test/fuzz/crypto_chacha20poly1305.cpp b/src/test/fuzz/crypto_chacha20poly1305.cpp
new file mode 100644
index 0000000000..0700ba7fb6
--- /dev/null
+++ b/src/test/fuzz/crypto_chacha20poly1305.cpp
@@ -0,0 +1,200 @@
+// Copyright (c) 2020-2021 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 <crypto/chacha20poly1305.h>
+#include <random.h>
+#include <span.h>
+#include <test/fuzz/FuzzedDataProvider.h>
+#include <test/fuzz/fuzz.h>
+#include <test/fuzz/util.h>
+
+#include <cstddef>
+#include <cstdint>
+#include <vector>
+
+constexpr static inline void crypt_till_rekey(FSChaCha20Poly1305& aead, int rekey_interval, bool encrypt)
+{
+ for (int i = 0; i < rekey_interval; ++i) {
+ std::byte dummy_tag[FSChaCha20Poly1305::EXPANSION] = {{}};
+ if (encrypt) {
+ aead.Encrypt(Span{dummy_tag}.first(0), Span{dummy_tag}.first(0), dummy_tag);
+ } else {
+ aead.Decrypt(dummy_tag, Span{dummy_tag}.first(0), Span{dummy_tag}.first(0));
+ }
+ }
+}
+
+FUZZ_TARGET(crypto_aeadchacha20poly1305)
+{
+ FuzzedDataProvider provider{buffer.data(), buffer.size()};
+
+ auto key = provider.ConsumeBytes<std::byte>(32);
+ key.resize(32);
+ AEADChaCha20Poly1305 aead(key);
+
+ // Initialize RNG deterministically, to generate contents and AAD. We assume that there are no
+ // (potentially buggy) edge cases triggered by specific values of contents/AAD, so we can avoid
+ // reading the actual data for those from the fuzzer input (which would need large amounts of
+ // data).
+ InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>());
+
+ LIMITED_WHILE(provider.ConsumeBool(), 100)
+ {
+ // Mode:
+ // - Bit 0: whether to use single-plain Encrypt/Decrypt; otherwise use a split at prefix.
+ // - Bit 2: whether this ciphertext will be corrupted (making it the last sent one)
+ // - Bit 3-4: controls the maximum aad length (max 511 bytes)
+ // - Bit 5-7: controls the maximum content length (max 16383 bytes, for performance reasons)
+ unsigned mode = provider.ConsumeIntegral<uint8_t>();
+ bool use_splits = mode & 1;
+ bool damage = mode & 4;
+ unsigned aad_length_bits = 3 * ((mode >> 3) & 3);
+ unsigned aad_length = provider.ConsumeIntegralInRange<unsigned>(0, (1 << aad_length_bits) - 1);
+ unsigned length_bits = 2 * ((mode >> 5) & 7);
+ unsigned length = provider.ConsumeIntegralInRange<unsigned>(0, (1 << length_bits) - 1);
+ // Generate aad and content.
+ auto aad = rng.randbytes<std::byte>(aad_length);
+ auto plain = rng.randbytes<std::byte>(length);
+ std::vector<std::byte> cipher(length + AEADChaCha20Poly1305::EXPANSION);
+ // Generate nonce
+ AEADChaCha20Poly1305::Nonce96 nonce = {(uint32_t)rng(), rng()};
+
+ if (use_splits && length > 0) {
+ size_t split_index = provider.ConsumeIntegralInRange<size_t>(1, length);
+ aead.Encrypt(Span{plain}.first(split_index), Span{plain}.subspan(split_index), aad, nonce, cipher);
+ } else {
+ aead.Encrypt(plain, aad, nonce, cipher);
+ }
+
+ // Test Keystream output
+ std::vector<std::byte> keystream(length);
+ aead.Keystream(nonce, keystream);
+ for (size_t i = 0; i < length; ++i) {
+ assert((plain[i] ^ keystream[i]) == cipher[i]);
+ }
+
+ std::vector<std::byte> decrypted_contents(length);
+ bool ok{false};
+
+ // damage the key
+ unsigned key_position = provider.ConsumeIntegralInRange<unsigned>(0, 31);
+ std::byte damage_val{(uint8_t)(1U << (key_position & 7))};
+ std::vector<std::byte> bad_key = key;
+ bad_key[key_position] ^= damage_val;
+
+ AEADChaCha20Poly1305 bad_aead(bad_key);
+ ok = bad_aead.Decrypt(cipher, aad, nonce, decrypted_contents);
+ assert(!ok);
+
+ // Optionally damage 1 bit in either the cipher (corresponding to a change in transit)
+ // or the aad (to make sure that decryption will fail if the AAD mismatches).
+ if (damage) {
+ unsigned damage_bit = provider.ConsumeIntegralInRange<unsigned>(0, (cipher.size() + aad.size()) * 8U - 1U);
+ unsigned damage_pos = damage_bit >> 3;
+ std::byte damage_val{(uint8_t)(1U << (damage_bit & 7))};
+ if (damage_pos >= cipher.size()) {
+ aad[damage_pos - cipher.size()] ^= damage_val;
+ } else {
+ cipher[damage_pos] ^= damage_val;
+ }
+ }
+
+ if (use_splits && length > 0) {
+ size_t split_index = provider.ConsumeIntegralInRange<size_t>(1, length);
+ ok = aead.Decrypt(cipher, aad, nonce, Span{decrypted_contents}.first(split_index), Span{decrypted_contents}.subspan(split_index));
+ } else {
+ ok = aead.Decrypt(cipher, aad, nonce, decrypted_contents);
+ }
+
+ // Decryption *must* fail if the packet was damaged, and succeed if it wasn't.
+ assert(!ok == damage);
+ if (!ok) break;
+ assert(decrypted_contents == plain);
+ }
+}
+
+FUZZ_TARGET(crypto_fschacha20poly1305)
+{
+ FuzzedDataProvider provider{buffer.data(), buffer.size()};
+
+ uint32_t rekey_interval = provider.ConsumeIntegralInRange<size_t>(32, 512);
+ auto key = provider.ConsumeBytes<std::byte>(32);
+ key.resize(32);
+ FSChaCha20Poly1305 enc_aead(key, rekey_interval);
+ FSChaCha20Poly1305 dec_aead(key, rekey_interval);
+
+ // Initialize RNG deterministically, to generate contents and AAD. We assume that there are no
+ // (potentially buggy) edge cases triggered by specific values of contents/AAD, so we can avoid
+ // reading the actual data for those from the fuzzer input (which would need large amounts of
+ // data).
+ InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>());
+
+ LIMITED_WHILE(provider.ConsumeBool(), 100)
+ {
+ // Mode:
+ // - Bit 0: whether to use single-plain Encrypt/Decrypt; otherwise use a split at prefix.
+ // - Bit 2: whether this ciphertext will be corrupted (making it the last sent one)
+ // - Bit 3-4: controls the maximum aad length (max 511 bytes)
+ // - Bit 5-7: controls the maximum content length (max 16383 bytes, for performance reasons)
+ unsigned mode = provider.ConsumeIntegral<uint8_t>();
+ bool use_splits = mode & 1;
+ bool damage = mode & 4;
+ unsigned aad_length_bits = 3 * ((mode >> 3) & 3);
+ unsigned aad_length = provider.ConsumeIntegralInRange<unsigned>(0, (1 << aad_length_bits) - 1);
+ unsigned length_bits = 2 * ((mode >> 5) & 7);
+ unsigned length = provider.ConsumeIntegralInRange<unsigned>(0, (1 << length_bits) - 1);
+ // Generate aad and content.
+ auto aad = rng.randbytes<std::byte>(aad_length);
+ auto plain = rng.randbytes<std::byte>(length);
+ std::vector<std::byte> cipher(length + FSChaCha20Poly1305::EXPANSION);
+
+ crypt_till_rekey(enc_aead, rekey_interval, true);
+ if (use_splits && length > 0) {
+ size_t split_index = provider.ConsumeIntegralInRange<size_t>(1, length);
+ enc_aead.Encrypt(Span{plain}.first(split_index), Span{plain}.subspan(split_index), aad, cipher);
+ } else {
+ enc_aead.Encrypt(plain, aad, cipher);
+ }
+
+ std::vector<std::byte> decrypted_contents(length);
+ bool ok{false};
+
+ // damage the key
+ unsigned key_position = provider.ConsumeIntegralInRange<unsigned>(0, 31);
+ std::byte damage_val{(uint8_t)(1U << (key_position & 7))};
+ std::vector<std::byte> bad_key = key;
+ bad_key[key_position] ^= damage_val;
+
+ FSChaCha20Poly1305 bad_fs_aead(bad_key, rekey_interval);
+ crypt_till_rekey(bad_fs_aead, rekey_interval, false);
+ ok = bad_fs_aead.Decrypt(cipher, aad, decrypted_contents);
+ assert(!ok);
+
+ // Optionally damage 1 bit in either the cipher (corresponding to a change in transit)
+ // or the aad (to make sure that decryption will fail if the AAD mismatches).
+ if (damage) {
+ unsigned damage_bit = provider.ConsumeIntegralInRange<unsigned>(0, (cipher.size() + aad.size()) * 8U - 1U);
+ unsigned damage_pos = damage_bit >> 3;
+ std::byte damage_val{(uint8_t)(1U << (damage_bit & 7))};
+ if (damage_pos >= cipher.size()) {
+ aad[damage_pos - cipher.size()] ^= damage_val;
+ } else {
+ cipher[damage_pos] ^= damage_val;
+ }
+ }
+
+ crypt_till_rekey(dec_aead, rekey_interval, false);
+ if (use_splits && length > 0) {
+ size_t split_index = provider.ConsumeIntegralInRange<size_t>(1, length);
+ ok = dec_aead.Decrypt(cipher, aad, Span{decrypted_contents}.first(split_index), Span{decrypted_contents}.subspan(split_index));
+ } else {
+ ok = dec_aead.Decrypt(cipher, aad, decrypted_contents);
+ }
+
+ // Decryption *must* fail if the packet was damaged, and succeed if it wasn't.
+ assert(!ok == damage);
+ if (!ok) break;
+ assert(decrypted_contents == plain);
+ }
+}
diff --git a/src/test/fuzz/crypto_common.cpp b/src/test/fuzz/crypto_common.cpp
index 8e07dfedb9..5a76d4e1a9 100644
--- a/src/test/fuzz/crypto_common.cpp
+++ b/src/test/fuzz/crypto_common.cpp
@@ -35,6 +35,10 @@ FUZZ_TARGET(crypto_common)
WriteLE64(writele64_arr.data(), random_u64);
assert(ReadLE64(writele64_arr.data()) == random_u64);
+ std::array<uint8_t, 2> writebe16_arr;
+ WriteBE16(writebe16_arr.data(), random_u16);
+ assert(ReadBE16(writebe16_arr.data()) == random_u16);
+
std::array<uint8_t, 4> writebe32_arr;
WriteBE32(writebe32_arr.data(), random_u32);
assert(ReadBE32(writebe32_arr.data()) == random_u32);
diff --git a/src/test/fuzz/cuckoocache.cpp b/src/test/fuzz/cuckoocache.cpp
index 50a71ee03f..f8a5bde3e6 100644
--- a/src/test/fuzz/cuckoocache.cpp
+++ b/src/test/fuzz/cuckoocache.cpp
@@ -41,7 +41,9 @@ FUZZ_TARGET(cuckoocache)
if (fuzzed_data_provider.ConsumeBool()) {
cuckoo_cache.insert(fuzzed_data_provider.ConsumeBool());
} else {
- cuckoo_cache.contains(fuzzed_data_provider.ConsumeBool(), fuzzed_data_provider.ConsumeBool());
+ auto e = fuzzed_data_provider.ConsumeBool();
+ auto erase = fuzzed_data_provider.ConsumeBool();
+ cuckoo_cache.contains(e, erase);
}
}
fuzzed_data_provider_ptr = nullptr;
diff --git a/src/test/fuzz/descriptor_parse.cpp b/src/test/fuzz/descriptor_parse.cpp
index b9a5560ffb..765daa3db7 100644
--- a/src/test/fuzz/descriptor_parse.cpp
+++ b/src/test/fuzz/descriptor_parse.cpp
@@ -15,14 +15,24 @@
MockedDescriptorConverter MOCKED_DESC_CONVERTER;
/** Test a successfully parsed descriptor. */
-static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_provider, std::string& dummy)
+static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_provider, std::string& dummy, std::optional<bool>& is_ranged, std::optional<bool>& is_solvable)
{
// Trivial helpers.
(void)desc.IsRange();
- const bool is_solvable{desc.IsSolvable()};
(void)desc.IsSingleType();
(void)desc.GetOutputType();
+ if (is_ranged.has_value()) {
+ assert(desc.IsRange() == *is_ranged);
+ } else {
+ is_ranged = desc.IsRange();
+ }
+ if (is_solvable.has_value()) {
+ assert(desc.IsSolvable() == *is_solvable);
+ } else {
+ is_solvable = desc.IsSolvable();
+ }
+
// Serialization to string representation.
(void)desc.ToString();
(void)desc.ToPrivateString(sig_provider, dummy);
@@ -48,7 +58,7 @@ static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_prov
const auto max_sat_nonmaxsig{desc.MaxSatisfactionWeight(true)};
const auto max_elems{desc.MaxSatisfactionElems()};
// We must be able to estimate the max satisfaction size for any solvable descriptor (but combo).
- const bool is_nontop_or_nonsolvable{!is_solvable || !desc.GetOutputType()};
+ const bool is_nontop_or_nonsolvable{!*is_solvable || !desc.GetOutputType()};
const bool is_input_size_info_set{max_sat_maxsig && max_sat_nonmaxsig && max_elems};
assert(is_input_size_info_set || is_nontop_or_nonsolvable);
}
@@ -72,25 +82,45 @@ FUZZ_TARGET(mocked_descriptor_parse, .init = initialize_mocked_descriptor_parse)
// out strings which could correspond to a descriptor containing a too large derivation path.
if (HasDeepDerivPath(buffer)) return;
+ // Some fragments can take a virtually unlimited number of sub-fragments (thresh, multi_a) but
+ // may perform quadratic operations on them. Limit the number of sub-fragments per fragment.
+ if (HasTooManySubFrag(buffer)) return;
+
+ // The script building logic performs quadratic copies in the number of nested wrappers. Limit
+ // the number of nested wrappers per fragment.
+ if (HasTooManyWrappers(buffer)) return;
+
const std::string mocked_descriptor{buffer.begin(), buffer.end()};
if (const auto descriptor = MOCKED_DESC_CONVERTER.GetDescriptor(mocked_descriptor)) {
FlatSigningProvider signing_provider;
std::string error;
const auto desc = Parse(*descriptor, signing_provider, error);
- if (desc) TestDescriptor(*desc, signing_provider, error);
+ std::optional<bool> is_ranged;
+ std::optional<bool> is_solvable;
+ for (const auto& d : desc) {
+ assert(d);
+ TestDescriptor(*d, signing_provider, error, is_ranged, is_solvable);
+ }
}
}
FUZZ_TARGET(descriptor_parse, .init = initialize_descriptor_parse)
{
- // See comment above for rationale.
+ // See comments above for rationales.
if (HasDeepDerivPath(buffer)) return;
+ if (HasTooManySubFrag(buffer)) return;
+ if (HasTooManyWrappers(buffer)) return;
const std::string descriptor(buffer.begin(), buffer.end());
FlatSigningProvider signing_provider;
std::string error;
for (const bool require_checksum : {true, false}) {
const auto desc = Parse(descriptor, signing_provider, error, require_checksum);
- if (desc) TestDescriptor(*desc, signing_provider, error);
+ std::optional<bool> is_ranged;
+ std::optional<bool> is_solvable;
+ for (const auto& d : desc) {
+ assert(d);
+ TestDescriptor(*d, signing_provider, error, is_ranged, is_solvable);
+ }
}
}
diff --git a/src/test/fuzz/fuzz.cpp b/src/test/fuzz/fuzz.cpp
index c1c9945a04..bba2dd8e3a 100644
--- a/src/test/fuzz/fuzz.cpp
+++ b/src/test/fuzz/fuzz.cpp
@@ -6,6 +6,7 @@
#include <netaddress.h>
#include <netbase.h>
+#include <test/util/random.h>
#include <test/util/setup_common.h>
#include <util/check.h>
#include <util/fs.h>
@@ -48,7 +49,7 @@ static std::vector<const char*> g_args;
static void SetArgs(int argc, char** argv) {
for (int i = 1; i < argc; ++i) {
// Only take into account arguments that start with `--`. The others are for the fuzz engine:
- // `fuzz -runs=1 fuzz_seed_corpus/address_deserialize_v2 --checkaddrman=5`
+ // `fuzz -runs=1 fuzz_corpora/address_deserialize_v2 --checkaddrman=5`
if (strlen(argv[i]) > 2 && argv[i][0] == '-' && argv[i][1] == '-') {
g_args.push_back(argv[i]);
}
@@ -72,8 +73,8 @@ 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 after clang-16 */ {std::move(target), std::move(opts)})};
- Assert(it_ins.second);
+ const auto [it, ins]{FuzzTargets().try_emplace(name, FuzzTarget /* temporary can be dropped after Apple-Clang-16 ? */ {std::move(target), std::move(opts)})};
+ Assert(ins);
}
static std::string_view g_fuzz_target;
@@ -101,6 +102,12 @@ void ResetCoverageCounters() {}
void initialize()
{
+ // By default, make the RNG deterministic with a fixed seed. This will affect all
+ // randomness during the fuzz test, except:
+ // - GetStrongRandBytes(), which is used for the creation of private key material.
+ // - Creating a BasicTestingSetup or derived class will switch to a random seed.
+ SeedRandomStateForTest(SeedRand::ZEROS);
+
// Terminate immediately if a fuzzing harness ever tries to create a socket.
// Individual tests can override this by pointing CreateSock to a mocked alternative.
CreateSock = [](int, int, int) -> std::unique_ptr<Sock> { std::terminate(); };
diff --git a/src/test/fuzz/hex.cpp b/src/test/fuzz/hex.cpp
index f67b820d11..3dcf1ed3d5 100644
--- a/src/test/fuzz/hex.cpp
+++ b/src/test/fuzz/hex.cpp
@@ -10,7 +10,9 @@
#include <uint256.h>
#include <univalue.h>
#include <util/strencodings.h>
+#include <util/transaction_identifier.h>
+#include <algorithm>
#include <cassert>
#include <cstdint>
#include <string>
@@ -21,15 +23,26 @@ FUZZ_TARGET(hex)
const std::string random_hex_string(buffer.begin(), buffer.end());
const std::vector<unsigned char> data = ParseHex(random_hex_string);
const std::vector<std::byte> bytes{ParseHex<std::byte>(random_hex_string)};
- assert(AsBytes(Span{data}) == Span{bytes});
+ assert(std::ranges::equal(AsBytes(Span{data}), bytes));
const std::string hex_data = HexStr(data);
if (IsHex(random_hex_string)) {
assert(ToLower(random_hex_string) == hex_data);
}
- (void)IsHexNumber(random_hex_string);
- uint256 result;
- (void)ParseHashStr(random_hex_string, result);
- (void)uint256S(random_hex_string);
+ if (uint256::FromHex(random_hex_string)) {
+ assert(random_hex_string.length() == 64);
+ assert(Txid::FromHex(random_hex_string));
+ assert(Wtxid::FromHex(random_hex_string));
+ assert(uint256::FromUserHex(random_hex_string));
+ }
+ if (const auto result{uint256::FromUserHex(random_hex_string)}) {
+ const auto result_string{result->ToString()}; // ToString() returns a fixed-length string without "0x" prefix
+ assert(result_string.length() == 64);
+ assert(IsHex(result_string));
+ assert(TryParseHex(result_string));
+ assert(Txid::FromHex(result_string));
+ assert(Wtxid::FromHex(result_string));
+ assert(uint256::FromHex(result_string));
+ }
try {
(void)HexToPubKey(random_hex_string);
} catch (const UniValue&) {
diff --git a/src/test/fuzz/integer.cpp b/src/test/fuzz/integer.cpp
index 8f1d7b6d45..b9e3154106 100644
--- a/src/test/fuzz/integer.cpp
+++ b/src/test/fuzz/integer.cpp
@@ -69,7 +69,7 @@ FUZZ_TARGET(integer, .init = initialize_integer)
const bool b = fuzzed_data_provider.ConsumeBool();
const Consensus::Params& consensus_params = Params().GetConsensus();
- (void)CheckProofOfWork(u256, u32, consensus_params);
+ (void)CheckProofOfWorkImpl(u256, u32, consensus_params);
if (u64 <= MAX_MONEY) {
const uint64_t compressed_money_amount = CompressAmount(u64);
assert(u64 == DecompressAmount(compressed_money_amount));
@@ -78,8 +78,8 @@ FUZZ_TARGET(integer, .init = initialize_integer)
} else {
(void)CompressAmount(u64);
}
- static const uint256 u256_min(uint256S("0000000000000000000000000000000000000000000000000000000000000000"));
- static const uint256 u256_max(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
+ constexpr uint256 u256_min{"0000000000000000000000000000000000000000000000000000000000000000"};
+ constexpr uint256 u256_max{"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
const std::vector<uint256> v256{u256, u256_min, u256_max};
(void)ComputeMerkleRoot(v256);
(void)DecompressAmount(u64);
@@ -140,7 +140,7 @@ FUZZ_TARGET(integer, .init = initialize_integer)
const arith_uint256 au256 = UintToArith256(u256);
assert(ArithToUint256(au256) == u256);
- assert(uint256S(au256.GetHex()) == u256);
+ assert(uint256::FromHex(au256.GetHex()).value() == u256);
(void)au256.bits();
(void)au256.GetCompact(/* fNegative= */ false);
(void)au256.GetCompact(/* fNegative= */ true);
diff --git a/src/test/fuzz/kitchen_sink.cpp b/src/test/fuzz/kitchen_sink.cpp
index 4468f358d9..62b49106cd 100644
--- a/src/test/fuzz/kitchen_sink.cpp
+++ b/src/test/fuzz/kitchen_sink.cpp
@@ -23,7 +23,7 @@ using node::TransactionError;
namespace {
constexpr TransactionError ALL_TRANSACTION_ERROR[] = {
TransactionError::MISSING_INPUTS,
- TransactionError::ALREADY_IN_CHAIN,
+ TransactionError::ALREADY_IN_UTXO_SET,
TransactionError::MEMPOOL_REJECTED,
TransactionError::MEMPOOL_ERROR,
TransactionError::MAX_FEE_EXCEEDED,
diff --git a/src/test/fuzz/message.cpp b/src/test/fuzz/message.cpp
index 6763206f72..99bbad6591 100644
--- a/src/test/fuzz/message.cpp
+++ b/src/test/fuzz/message.cpp
@@ -39,7 +39,9 @@ FUZZ_TARGET(message, .init = initialize_message)
}
{
(void)MessageHash(random_message);
- (void)MessageVerify(fuzzed_data_provider.ConsumeRandomLengthString(1024), fuzzed_data_provider.ConsumeRandomLengthString(1024), random_message);
+ auto address = fuzzed_data_provider.ConsumeRandomLengthString(1024);
+ auto signature = fuzzed_data_provider.ConsumeRandomLengthString(1024);
+ (void)MessageVerify(address, signature, random_message);
(void)SigningResultString(fuzzed_data_provider.PickValueInArray({SigningResult::OK, SigningResult::PRIVATE_KEY_NOT_AVAILABLE, SigningResult::SIGNING_FAILED}));
}
}
diff --git a/src/test/fuzz/mini_miner.cpp b/src/test/fuzz/mini_miner.cpp
index 3a1663364f..51de4d0166 100644
--- a/src/test/fuzz/mini_miner.cpp
+++ b/src/test/fuzz/mini_miner.cpp
@@ -188,9 +188,9 @@ FUZZ_TARGET(mini_miner_selection, .init = initialize_miner)
auto mock_template_txids = mini_miner.GetMockTemplateTxids();
// MiniMiner doesn't add a coinbase tx.
assert(mock_template_txids.count(blocktemplate->block.vtx[0]->GetHash()) == 0);
- mock_template_txids.emplace(blocktemplate->block.vtx[0]->GetHash());
- assert(mock_template_txids.size() <= blocktemplate->block.vtx.size());
- assert(mock_template_txids.size() >= blocktemplate->block.vtx.size());
+ auto [iter, new_entry] = mock_template_txids.emplace(blocktemplate->block.vtx[0]->GetHash());
+ assert(new_entry);
+
assert(mock_template_txids.size() == blocktemplate->block.vtx.size());
for (const auto& tx : blocktemplate->block.vtx) {
assert(mock_template_txids.count(tx->GetHash()));
diff --git a/src/test/fuzz/miniscript.cpp b/src/test/fuzz/miniscript.cpp
index 7e71af7c44..5b9e168856 100644
--- a/src/test/fuzz/miniscript.cpp
+++ b/src/test/fuzz/miniscript.cpp
@@ -13,6 +13,8 @@
#include <test/fuzz/util.h>
#include <util/strencodings.h>
+#include <algorithm>
+
namespace {
using Fragment = miniscript::Fragment;
@@ -47,9 +49,9 @@ struct TestData {
void Init() {
unsigned char keydata[32] = {1};
// All our signatures sign (and are required to sign) this constant message.
- auto const MESSAGE_HASH{uint256S("f5cd94e18b6fe77dd7aca9e35c2b0c9cbd86356c80a71065")};
+ constexpr uint256 MESSAGE_HASH{"0000000000000000f5cd94e18b6fe77dd7aca9e35c2b0c9cbd86356c80a71065"};
// We don't pass additional randomness when creating a schnorr signature.
- auto const EMPTY_AUX{uint256S("")};
+ const auto EMPTY_AUX{uint256::ZERO};
for (size_t i = 0; i < 256; i++) {
keydata[31] = i;
@@ -293,7 +295,7 @@ const struct CheckerContext: BaseSignatureChecker {
XOnlyPubKey pk{pubkey};
auto it = TEST_DATA.schnorr_sigs.find(pk);
if (it == TEST_DATA.schnorr_sigs.end()) return false;
- return it->second.first == sig;
+ return std::ranges::equal(it->second.first, sig);
}
bool CheckLockTime(const CScriptNum& nLockTime) const override { return nLockTime.GetInt64() & 1; }
bool CheckSequence(const CScriptNum& nSequence) const override { return nSequence.GetInt64() & 1; }
diff --git a/src/test/fuzz/muhash.cpp b/src/test/fuzz/muhash.cpp
index dd34c465ed..e74bcb962f 100644
--- a/src/test/fuzz/muhash.cpp
+++ b/src/test/fuzz/muhash.cpp
@@ -20,7 +20,7 @@ FUZZ_TARGET(muhash)
muhash.Insert(data);
muhash.Insert(data2);
- const std::string initial_state_hash{"dd5ad2a105c2d29495f577245c357409002329b9f4d6182c0af3dc2f462555c8"};
+ constexpr uint256 initial_state_hash{"dd5ad2a105c2d29495f577245c357409002329b9f4d6182c0af3dc2f462555c8"};
uint256 out;
uint256 out2;
CallOneOf(
@@ -57,14 +57,14 @@ FUZZ_TARGET(muhash)
#endif
muhash.Finalize(out);
- out2 = uint256S(initial_state_hash);
+ out2 = initial_state_hash;
},
[&] {
// Test that removing all added elements brings the object back to it's initial state
muhash.Remove(data);
muhash.Remove(data2);
muhash.Finalize(out);
- out2 = uint256S(initial_state_hash);
+ out2 = initial_state_hash;
});
assert(out == out2);
}
diff --git a/src/test/fuzz/net.cpp b/src/test/fuzz/net.cpp
index e8b1480c5b..4cec96274e 100644
--- a/src/test/fuzz/net.cpp
+++ b/src/test/fuzz/net.cpp
@@ -33,6 +33,11 @@ FUZZ_TARGET(net, .init = initialize_net)
SetMockTime(ConsumeTime(fuzzed_data_provider));
CNode node{ConsumeNode(fuzzed_data_provider)};
node.SetCommonVersion(fuzzed_data_provider.ConsumeIntegral<int>());
+ if (const auto service_opt =
+ ConsumeDeserializable<CService>(fuzzed_data_provider, ConsumeDeserializationParams<CNetAddr::SerParams>(fuzzed_data_provider)))
+ {
+ node.SetAddrLocal(*service_opt);
+ }
LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
CallOneOf(
fuzzed_data_provider,
@@ -53,13 +58,6 @@ FUZZ_TARGET(net, .init = initialize_net)
}
},
[&] {
- const std::optional<CService> service_opt = ConsumeDeserializable<CService>(fuzzed_data_provider, ConsumeDeserializationParams<CNetAddr::SerParams>(fuzzed_data_provider));
- if (!service_opt) {
- return;
- }
- node.SetAddrLocal(*service_opt);
- },
- [&] {
const std::vector<uint8_t> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
bool complete;
node.ReceiveMsgBytes(b, complete);
diff --git a/src/test/fuzz/p2p_handshake.cpp b/src/test/fuzz/p2p_handshake.cpp
new file mode 100644
index 0000000000..6c1ed11d45
--- /dev/null
+++ b/src/test/fuzz/p2p_handshake.cpp
@@ -0,0 +1,107 @@
+// Copyright (c) 2020-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.
+
+#include <addrman.h>
+#include <consensus/consensus.h>
+#include <net.h>
+#include <net_processing.h>
+#include <node/warnings.h>
+#include <protocol.h>
+#include <script/script.h>
+#include <sync.h>
+#include <test/fuzz/FuzzedDataProvider.h>
+#include <test/fuzz/fuzz.h>
+#include <test/fuzz/util.h>
+#include <test/fuzz/util/net.h>
+#include <test/util/mining.h>
+#include <test/util/net.h>
+#include <test/util/setup_common.h>
+#include <test/util/validation.h>
+#include <util/time.h>
+#include <validationinterface.h>
+
+#include <ios>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace {
+const TestingSetup* g_setup;
+
+void initialize()
+{
+ static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(
+ /*chain_type=*/ChainType::REGTEST);
+ g_setup = testing_setup.get();
+}
+} // namespace
+
+FUZZ_TARGET(p2p_handshake, .init = ::initialize)
+{
+ FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
+
+ ConnmanTestMsg& connman = static_cast<ConnmanTestMsg&>(*g_setup->m_node.connman);
+ auto& chainman = static_cast<TestChainstateManager&>(*g_setup->m_node.chainman);
+ SetMockTime(1610000000); // any time to successfully reset ibd
+ chainman.ResetIbd();
+
+ node::Warnings warnings{};
+ NetGroupManager netgroupman{{}};
+ AddrMan addrman{netgroupman, /*deterministic=*/true, 0};
+ auto peerman = PeerManager::make(connman, addrman,
+ /*banman=*/nullptr, chainman,
+ *g_setup->m_node.mempool, warnings,
+ PeerManager::Options{
+ .reconcile_txs = true,
+ .deterministic_rng = true,
+ });
+ connman.SetMsgProc(peerman.get());
+
+ LOCK(NetEventsInterface::g_msgproc_mutex);
+
+ std::vector<CNode*> peers;
+ const auto num_peers_to_add = fuzzed_data_provider.ConsumeIntegralInRange(1, 3);
+ for (int i = 0; i < num_peers_to_add; ++i) {
+ peers.push_back(ConsumeNodeAsUniquePtr(fuzzed_data_provider, i).release());
+ connman.AddTestNode(*peers.back());
+ peerman->InitializeNode(
+ *peers.back(),
+ static_cast<ServiceFlags>(fuzzed_data_provider.ConsumeIntegral<uint64_t>()));
+ }
+
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100)
+ {
+ CNode& connection = *PickValue(fuzzed_data_provider, peers);
+ if (connection.fDisconnect || connection.fSuccessfullyConnected) {
+ // Skip if the connection was disconnected or if the version
+ // handshake was already completed.
+ continue;
+ }
+
+ SetMockTime(GetTime() +
+ fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(
+ -std::chrono::seconds{10min}.count(), // Allow mocktime to go backwards slightly
+ std::chrono::seconds{TIMEOUT_INTERVAL}.count()));
+
+ CSerializedNetMsg net_msg;
+ net_msg.m_type = PickValue(fuzzed_data_provider, ALL_NET_MESSAGE_TYPES);
+ net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider, MAX_PROTOCOL_MESSAGE_LENGTH);
+
+ connman.FlushSendBuffer(connection);
+ (void)connman.ReceiveMsgFrom(connection, std::move(net_msg));
+
+ bool more_work{true};
+ while (more_work) {
+ connection.fPauseSend = false;
+
+ try {
+ more_work = connman.ProcessMessagesOnce(connection);
+ } catch (const std::ios_base::failure&) {
+ }
+ peerman->SendMessages(&connection);
+ }
+ }
+
+ g_setup->m_node.connman->StopNodes();
+}
diff --git a/src/test/fuzz/p2p_headers_presync.cpp b/src/test/fuzz/p2p_headers_presync.cpp
new file mode 100644
index 0000000000..2670aa8ee4
--- /dev/null
+++ b/src/test/fuzz/p2p_headers_presync.cpp
@@ -0,0 +1,216 @@
+#include <blockencodings.h>
+#include <net.h>
+#include <net_processing.h>
+#include <netmessagemaker.h>
+#include <node/peerman_args.h>
+#include <pow.h>
+#include <test/fuzz/FuzzedDataProvider.h>
+#include <test/fuzz/fuzz.h>
+#include <test/fuzz/util.h>
+#include <test/util/net.h>
+#include <test/util/script.h>
+#include <test/util/setup_common.h>
+#include <uint256.h>
+#include <validation.h>
+
+namespace {
+constexpr uint32_t FUZZ_MAX_HEADERS_RESULTS{16};
+
+class HeadersSyncSetup : public TestingSetup
+{
+ std::vector<CNode*> m_connections;
+
+public:
+ HeadersSyncSetup(const ChainType chain_type, TestOpts opts) : TestingSetup(chain_type, opts)
+ {
+ PeerManager::Options peerman_opts;
+ node::ApplyArgsManOptions(*m_node.args, peerman_opts);
+ peerman_opts.max_headers_result = FUZZ_MAX_HEADERS_RESULTS;
+ m_node.peerman = PeerManager::make(*m_node.connman, *m_node.addrman,
+ m_node.banman.get(), *m_node.chainman,
+ *m_node.mempool, *m_node.warnings, peerman_opts);
+
+ CConnman::Options options;
+ options.m_msgproc = m_node.peerman.get();
+ m_node.connman->Init(options);
+ }
+
+ void ResetAndInitialize() EXCLUSIVE_LOCKS_REQUIRED(NetEventsInterface::g_msgproc_mutex);
+ void SendMessage(FuzzedDataProvider& fuzzed_data_provider, CSerializedNetMsg&& msg)
+ EXCLUSIVE_LOCKS_REQUIRED(NetEventsInterface::g_msgproc_mutex);
+};
+
+void HeadersSyncSetup::ResetAndInitialize()
+{
+ m_connections.clear();
+ auto& connman = static_cast<ConnmanTestMsg&>(*m_node.connman);
+ connman.StopNodes();
+
+ NodeId id{0};
+ std::vector<ConnectionType> conn_types = {
+ ConnectionType::OUTBOUND_FULL_RELAY,
+ ConnectionType::BLOCK_RELAY,
+ ConnectionType::INBOUND
+ };
+
+ for (auto conn_type : conn_types) {
+ CAddress addr{};
+ m_connections.push_back(new CNode(id++, nullptr, addr, 0, 0, addr, "", conn_type, false));
+ CNode& p2p_node = *m_connections.back();
+
+ connman.Handshake(
+ /*node=*/p2p_node,
+ /*successfully_connected=*/true,
+ /*remote_services=*/ServiceFlags(NODE_NETWORK | NODE_WITNESS),
+ /*local_services=*/ServiceFlags(NODE_NETWORK | NODE_WITNESS),
+ /*version=*/PROTOCOL_VERSION,
+ /*relay_txs=*/true);
+
+ connman.AddTestNode(p2p_node);
+ }
+}
+
+void HeadersSyncSetup::SendMessage(FuzzedDataProvider& fuzzed_data_provider, CSerializedNetMsg&& msg)
+{
+ auto& connman = static_cast<ConnmanTestMsg&>(*m_node.connman);
+ CNode& connection = *PickValue(fuzzed_data_provider, m_connections);
+
+ connman.FlushSendBuffer(connection);
+ (void)connman.ReceiveMsgFrom(connection, std::move(msg));
+ connection.fPauseSend = false;
+ try {
+ connman.ProcessMessagesOnce(connection);
+ } catch (const std::ios_base::failure&) {
+ }
+ m_node.peerman->SendMessages(&connection);
+}
+
+CBlockHeader ConsumeHeader(FuzzedDataProvider& fuzzed_data_provider, const uint256& prev_hash, uint32_t prev_nbits)
+{
+ CBlockHeader header;
+ header.nNonce = 0;
+ // Either use the previous difficulty or let the fuzzer choose
+ header.nBits = fuzzed_data_provider.ConsumeBool() ?
+ prev_nbits :
+ fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0x17058EBE, 0x1D00FFFF);
+ header.nTime = ConsumeTime(fuzzed_data_provider);
+ header.hashPrevBlock = prev_hash;
+ header.nVersion = fuzzed_data_provider.ConsumeIntegral<int32_t>();
+ return header;
+}
+
+CBlock ConsumeBlock(FuzzedDataProvider& fuzzed_data_provider, const uint256& prev_hash, uint32_t prev_nbits)
+{
+ auto header = ConsumeHeader(fuzzed_data_provider, prev_hash, prev_nbits);
+ // In order to reach the headers acceptance logic, the block is
+ // constructed in a way that will pass the mutation checks.
+ CBlock block{header};
+ CMutableTransaction tx;
+ tx.vin.resize(1);
+ tx.vout.resize(1);
+ tx.vout[0].nValue = 0;
+ tx.vin[0].scriptSig.resize(2);
+ block.vtx.push_back(MakeTransactionRef(tx));
+ block.hashMerkleRoot = block.vtx[0]->GetHash();
+ return block;
+}
+
+void FinalizeHeader(CBlockHeader& header, const ChainstateManager& chainman)
+{
+ while (!CheckProofOfWork(header.GetHash(), header.nBits, chainman.GetParams().GetConsensus())) {
+ ++(header.nNonce);
+ }
+}
+
+// Global setup works for this test as state modification (specifically in the
+// block index) would indicate a bug.
+HeadersSyncSetup* g_testing_setup;
+
+void initialize()
+{
+ static auto setup = MakeNoLogFileContext<HeadersSyncSetup>(ChainType::MAIN, {.extra_args = {"-checkpoints=0"}});
+ g_testing_setup = setup.get();
+}
+} // namespace
+
+FUZZ_TARGET(p2p_headers_presync, .init = initialize)
+{
+ ChainstateManager& chainman = *g_testing_setup->m_node.chainman;
+
+ LOCK(NetEventsInterface::g_msgproc_mutex);
+
+ g_testing_setup->ResetAndInitialize();
+
+ FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
+
+ CBlockHeader base{chainman.GetParams().GenesisBlock()};
+ SetMockTime(base.nTime);
+
+ // The chain is just a single block, so this is equal to 1
+ size_t original_index_size{WITH_LOCK(cs_main, return chainman.m_blockman.m_block_index.size())};
+ arith_uint256 total_work{WITH_LOCK(cs_main, return chainman.m_best_header->nChainWork)};
+
+ std::vector<CBlockHeader> all_headers;
+
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100)
+ {
+ auto finalized_block = [&]() {
+ CBlock block = ConsumeBlock(fuzzed_data_provider, base.GetHash(), base.nBits);
+ FinalizeHeader(block, chainman);
+ return block;
+ };
+
+ // Send low-work headers, compact blocks, and blocks
+ CallOneOf(
+ fuzzed_data_provider,
+ [&]() NO_THREAD_SAFETY_ANALYSIS {
+ // Send FUZZ_MAX_HEADERS_RESULTS headers
+ std::vector<CBlock> headers;
+ headers.resize(FUZZ_MAX_HEADERS_RESULTS);
+ for (CBlock& header : headers) {
+ header = ConsumeHeader(fuzzed_data_provider, base.GetHash(), base.nBits);
+ FinalizeHeader(header, chainman);
+ base = header;
+ }
+
+ all_headers.insert(all_headers.end(), headers.begin(), headers.end());
+
+ auto headers_msg = NetMsg::Make(NetMsgType::HEADERS, TX_WITH_WITNESS(headers));
+ g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
+ },
+ [&]() NO_THREAD_SAFETY_ANALYSIS {
+ // Send a compact block
+ auto block = finalized_block();
+ CBlockHeaderAndShortTxIDs cmpct_block{block, fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
+
+ all_headers.push_back(block);
+
+ auto headers_msg = NetMsg::Make(NetMsgType::CMPCTBLOCK, TX_WITH_WITNESS(cmpct_block));
+ g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
+ },
+ [&]() NO_THREAD_SAFETY_ANALYSIS {
+ // Send a block
+ auto block = finalized_block();
+
+ all_headers.push_back(block);
+
+ auto headers_msg = NetMsg::Make(NetMsgType::BLOCK, TX_WITH_WITNESS(block));
+ g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
+ });
+ }
+
+ // This is a conservative overestimate, as base is only moved forward when sending headers. In theory,
+ // the longest chain generated by this test is 1600 (FUZZ_MAX_HEADERS_RESULTS * 100) headers. In that case,
+ // this variable will accurately reflect the chain's total work.
+ total_work += CalculateClaimedHeadersWork(all_headers);
+
+ // This test should never create a chain with more work than MinimumChainWork.
+ assert(total_work < chainman.MinimumChainWork());
+
+ // The headers/blocks sent in this test should never be stored, as the chains don't have the work required
+ // to meet the anti-DoS work threshold. So, if at any point the block index grew in size, then there's a bug
+ // in the headers pre-sync logic.
+ assert(WITH_LOCK(cs_main, return chainman.m_blockman.m_block_index.size()) == original_index_size);
+
+ g_testing_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
+}
diff --git a/src/test/fuzz/p2p_transport_serialization.cpp b/src/test/fuzz/p2p_transport_serialization.cpp
index 767238d103..cf3ef45c0a 100644
--- a/src/test/fuzz/p2p_transport_serialization.cpp
+++ b/src/test/fuzz/p2p_transport_serialization.cpp
@@ -10,9 +10,9 @@
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
-#include <test/util/xoroshiro128plusplus.h>
#include <util/chaintype.h>
+#include <algorithm>
#include <cassert>
#include <cstdint>
#include <limits>
@@ -104,7 +104,7 @@ FUZZ_TARGET(p2p_transport_serialization, .init = initialize_p2p_transport_serial
namespace {
-template<typename R>
+template<RandomNumberGenerator R>
void SimulationTest(Transport& initiator, Transport& responder, R& rng, FuzzedDataProvider& provider)
{
// Simulation test with two Transport objects, which send messages to each other, with
@@ -165,8 +165,7 @@ void SimulationTest(Transport& initiator, Transport& responder, R& rng, FuzzedDa
// Determine size of message to send (limited to 75 kB for performance reasons).
size_t size = provider.ConsumeIntegralInRange<uint32_t>(0, 75000);
// Get payload of message from RNG.
- msg.data.resize(size);
- for (auto& v : msg.data) v = uint8_t(rng());
+ msg.data = rng.randbytes(size);
// Return.
return msg;
};
@@ -187,12 +186,12 @@ void SimulationTest(Transport& initiator, Transport& responder, R& rng, FuzzedDa
// Compare with expected more.
if (expect_more[side].has_value()) assert(!bytes.empty() == *expect_more[side]);
// Verify consistency between the two results.
- assert(bytes == bytes_next);
+ assert(std::ranges::equal(bytes, bytes_next));
assert(msg_type == msg_type_next);
if (more_nonext) assert(more_next);
// Compare with previously reported output.
assert(to_send[side].size() <= bytes.size());
- assert(to_send[side] == Span{bytes}.first(to_send[side].size()));
+ assert(std::ranges::equal(to_send[side], Span{bytes}.first(to_send[side].size())));
to_send[side].resize(bytes.size());
std::copy(bytes.begin(), bytes.end(), to_send[side].begin());
// Remember 'more' results.
@@ -280,7 +279,7 @@ void SimulationTest(Transport& initiator, Transport& responder, R& rng, FuzzedDa
// The m_type must match what is expected.
assert(received.m_type == expected[side].front().m_type);
// The data must match what is expected.
- assert(MakeByteSpan(received.m_recv) == MakeByteSpan(expected[side].front().data));
+ assert(std::ranges::equal(received.m_recv, MakeByteSpan(expected[side].front().data)));
expected[side].pop_front();
progress = true;
}
@@ -337,7 +336,7 @@ std::unique_ptr<Transport> MakeV1Transport(NodeId nodeid) noexcept
return std::make_unique<V1Transport>(nodeid);
}
-template<typename RNG>
+template<RandomNumberGenerator RNG>
std::unique_ptr<Transport> MakeV2Transport(NodeId nodeid, bool initiator, RNG& rng, FuzzedDataProvider& provider)
{
// Retrieve key
@@ -353,8 +352,7 @@ std::unique_ptr<Transport> MakeV2Transport(NodeId nodeid, bool initiator, RNG& r
} else {
// If it's longer, generate it from the RNG. This avoids having large amounts of
// (hopefully) irrelevant data needing to be stored in the fuzzer data.
- garb.resize(garb_len);
- for (auto& v : garb) v = uint8_t(rng());
+ garb = rng.randbytes(garb_len);
}
// Retrieve entropy
auto ent = provider.ConsumeBytes<std::byte>(32);
@@ -378,7 +376,7 @@ FUZZ_TARGET(p2p_transport_bidirectional, .init = initialize_p2p_transport_serial
{
// Test with two V1 transports talking to each other.
FuzzedDataProvider provider{buffer.data(), buffer.size()};
- XoRoShiRo128PlusPlus rng(provider.ConsumeIntegral<uint64_t>());
+ InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>());
auto t1 = MakeV1Transport(NodeId{0});
auto t2 = MakeV1Transport(NodeId{1});
if (!t1 || !t2) return;
@@ -389,7 +387,7 @@ FUZZ_TARGET(p2p_transport_bidirectional_v2, .init = initialize_p2p_transport_ser
{
// Test with two V2 transports talking to each other.
FuzzedDataProvider provider{buffer.data(), buffer.size()};
- XoRoShiRo128PlusPlus rng(provider.ConsumeIntegral<uint64_t>());
+ InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>());
auto t1 = MakeV2Transport(NodeId{0}, true, rng, provider);
auto t2 = MakeV2Transport(NodeId{1}, false, rng, provider);
if (!t1 || !t2) return;
@@ -400,7 +398,7 @@ FUZZ_TARGET(p2p_transport_bidirectional_v1v2, .init = initialize_p2p_transport_s
{
// Test with a V1 initiator talking to a V2 responder.
FuzzedDataProvider provider{buffer.data(), buffer.size()};
- XoRoShiRo128PlusPlus rng(provider.ConsumeIntegral<uint64_t>());
+ InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>());
auto t1 = MakeV1Transport(NodeId{0});
auto t2 = MakeV2Transport(NodeId{1}, false, rng, provider);
if (!t1 || !t2) return;
diff --git a/src/test/fuzz/package_eval.cpp b/src/test/fuzz/package_eval.cpp
index 53aedf23ea..652c7a7609 100644
--- a/src/test/fuzz/package_eval.cpp
+++ b/src/test/fuzz/package_eval.cpp
@@ -6,7 +6,7 @@
#include <node/context.h>
#include <node/mempool_args.h>
#include <node/miner.h>
-#include <policy/v3_policy.h>
+#include <policy/truc_policy.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
@@ -225,7 +225,7 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
tx_mut.vin.emplace_back();
}
- // Make a p2pk output to make sigops adjusted vsize to violate v3, potentially, which is never spent
+ // Make a p2pk output to make sigops adjusted vsize to violate TRUC rules, 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.
@@ -320,7 +320,7 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
Assert(result_package.m_tx_results.size() == txs.size() || result_package.m_tx_results.empty());
}
- CheckMempoolV3Invariants(tx_pool);
+ CheckMempoolTRUCInvariants(tx_pool);
}
node.validation_signals->UnregisterSharedValidationInterface(outpoints_updater);
diff --git a/src/test/fuzz/parse_univalue.cpp b/src/test/fuzz/parse_univalue.cpp
index a3d6ab6375..cb39b3be83 100644
--- a/src/test/fuzz/parse_univalue.cpp
+++ b/src/test/fuzz/parse_univalue.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.
@@ -77,7 +77,7 @@ FUZZ_TARGET(parse_univalue, .init = initialize_parse_univalue)
}
try {
FlatSigningProvider provider;
- (void)EvalDescriptorStringOrObject(univalue, provider);
+ if (buffer.size() < 10'000) (void)EvalDescriptorStringOrObject(univalue, provider);
} catch (const UniValue&) {
} catch (const std::runtime_error&) {
}
diff --git a/src/test/fuzz/policy_estimator.cpp b/src/test/fuzz/policy_estimator.cpp
index a4e1947b9f..2942740395 100644
--- a/src/test/fuzz/policy_estimator.cpp
+++ b/src/test/fuzz/policy_estimator.cpp
@@ -85,9 +85,18 @@ FUZZ_TARGET(policy_estimator, .init = initialize_policy_estimator)
});
(void)block_policy_estimator.estimateFee(fuzzed_data_provider.ConsumeIntegral<int>());
EstimationResult result;
- (void)block_policy_estimator.estimateRawFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeFloatingPoint<double>(), fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS), fuzzed_data_provider.ConsumeBool() ? &result : nullptr);
+ auto conf_target = fuzzed_data_provider.ConsumeIntegral<int>();
+ auto success_threshold = fuzzed_data_provider.ConsumeFloatingPoint<double>();
+ auto horizon = fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS);
+ auto* result_ptr = fuzzed_data_provider.ConsumeBool() ? &result : nullptr;
+ (void)block_policy_estimator.estimateRawFee(conf_target, success_threshold, horizon, result_ptr);
+
FeeCalculation fee_calculation;
- (void)block_policy_estimator.estimateSmartFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeBool() ? &fee_calculation : nullptr, fuzzed_data_provider.ConsumeBool());
+ conf_target = fuzzed_data_provider.ConsumeIntegral<int>();
+ auto* fee_calc_ptr = fuzzed_data_provider.ConsumeBool() ? &fee_calculation : nullptr;
+ auto conservative = fuzzed_data_provider.ConsumeBool();
+ (void)block_policy_estimator.estimateSmartFee(conf_target, fee_calc_ptr, conservative);
+
(void)block_policy_estimator.HighestTargetTracked(fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS));
}
{
diff --git a/src/test/fuzz/poolresource.cpp b/src/test/fuzz/poolresource.cpp
index f764d9f8db..dd8d5b07e5 100644
--- a/src/test/fuzz/poolresource.cpp
+++ b/src/test/fuzz/poolresource.cpp
@@ -2,13 +2,13 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <random.h>
#include <span.h>
#include <support/allocators/pool.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
#include <test/util/poolresourcetester.h>
-#include <test/util/xoroshiro128plusplus.h>
#include <cstdint>
#include <tuple>
@@ -71,41 +71,14 @@ public:
void RandomContentFill(Entry& entry)
{
- XoRoShiRo128PlusPlus rng(entry.seed);
- auto ptr = entry.span.data();
- auto size = entry.span.size();
-
- while (size >= 8) {
- auto r = rng();
- std::memcpy(ptr, &r, 8);
- size -= 8;
- ptr += 8;
- }
- if (size > 0) {
- auto r = rng();
- std::memcpy(ptr, &r, size);
- }
+ InsecureRandomContext(entry.seed).fillrand(entry.span);
}
void RandomContentCheck(const Entry& entry)
{
- XoRoShiRo128PlusPlus rng(entry.seed);
- auto ptr = entry.span.data();
- auto size = entry.span.size();
-
- std::byte buf[8];
- while (size >= 8) {
- auto r = rng();
- std::memcpy(buf, &r, 8);
- assert(std::memcmp(buf, ptr, 8) == 0);
- size -= 8;
- ptr += 8;
- }
- if (size > 0) {
- auto r = rng();
- std::memcpy(buf, &r, size);
- assert(std::memcmp(buf, ptr, size) == 0);
- }
+ std::vector<std::byte> expect(entry.span.size());
+ InsecureRandomContext(entry.seed).fillrand(expect);
+ assert(std::ranges::equal(entry.span, expect));
}
void Deallocate(const Entry& entry)
diff --git a/src/test/fuzz/pow.cpp b/src/test/fuzz/pow.cpp
index 05cdb740e4..dba999ce4f 100644
--- a/src/test/fuzz/pow.cpp
+++ b/src/test/fuzz/pow.cpp
@@ -80,7 +80,7 @@ FUZZ_TARGET(pow, .init = initialize_pow)
{
const std::optional<uint256> hash = ConsumeDeserializable<uint256>(fuzzed_data_provider);
if (hash) {
- (void)CheckProofOfWork(*hash, fuzzed_data_provider.ConsumeIntegral<unsigned int>(), consensus_params);
+ (void)CheckProofOfWorkImpl(*hash, fuzzed_data_provider.ConsumeIntegral<unsigned int>(), consensus_params);
}
}
}
diff --git a/src/test/fuzz/prevector.cpp b/src/test/fuzz/prevector.cpp
index 9cea32e304..fffa099391 100644
--- a/src/test/fuzz/prevector.cpp
+++ b/src/test/fuzz/prevector.cpp
@@ -2,16 +2,14 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <test/fuzz/FuzzedDataProvider.h>
-#include <test/fuzz/fuzz.h>
-
#include <prevector.h>
-#include <vector>
-
-#include <reverse_iterator.h>
#include <serialize.h>
#include <streams.h>
+#include <test/fuzz/FuzzedDataProvider.h>
+#include <test/fuzz/fuzz.h>
+#include <ranges>
+#include <vector>
namespace {
template <unsigned int N, typename T>
@@ -47,7 +45,7 @@ public:
assert(v == real_vector[pos]);
++pos;
}
- for (const T& v : reverse_iterate(pre_vector)) {
+ for (const T& v : pre_vector | std::views::reverse) {
--pos;
assert(v == real_vector[pos]);
}
@@ -55,7 +53,7 @@ public:
assert(v == real_vector[pos]);
++pos;
}
- for (const T& v : reverse_iterate(const_pre_vector)) {
+ for (const T& v : const_pre_vector | std::views::reverse) {
--pos;
assert(v == real_vector[pos]);
}
@@ -212,15 +210,20 @@ FUZZ_TARGET(prevector)
LIMITED_WHILE(prov.remaining_bytes(), 3000)
{
switch (prov.ConsumeIntegralInRange<int>(0, 13 + 3 * (test.size() > 0))) {
- case 0:
- test.insert(prov.ConsumeIntegralInRange<size_t>(0, test.size()), prov.ConsumeIntegral<int>());
- break;
+ case 0: {
+ auto position = prov.ConsumeIntegralInRange<size_t>(0, test.size());
+ auto value = prov.ConsumeIntegral<int>();
+ test.insert(position, value);
+ } break;
case 1:
test.resize(std::max(0, std::min(30, (int)test.size() + prov.ConsumeIntegralInRange<int>(0, 4) - 2)));
break;
- case 2:
- test.insert(prov.ConsumeIntegralInRange<size_t>(0, test.size()), 1 + prov.ConsumeBool(), prov.ConsumeIntegral<int>());
- break;
+ case 2: {
+ auto position = prov.ConsumeIntegralInRange<size_t>(0, test.size());
+ auto count = 1 + prov.ConsumeBool();
+ auto value = prov.ConsumeIntegral<int>();
+ test.insert(position, count, value);
+ } break;
case 3: {
int del = prov.ConsumeIntegralInRange<int>(0, test.size());
int beg = prov.ConsumeIntegralInRange<int>(0, test.size() - del);
@@ -257,9 +260,11 @@ FUZZ_TARGET(prevector)
case 9:
test.clear();
break;
- case 10:
- test.assign(prov.ConsumeIntegralInRange<size_t>(0, 32767), prov.ConsumeIntegral<int>());
- break;
+ case 10: {
+ auto n = prov.ConsumeIntegralInRange<size_t>(0, 32767);
+ auto value = prov.ConsumeIntegral<int>();
+ test.assign(n, value);
+ } break;
case 11:
test.swap();
break;
@@ -269,9 +274,11 @@ FUZZ_TARGET(prevector)
case 13:
test.move();
break;
- case 14:
- test.update(prov.ConsumeIntegralInRange<size_t>(0, test.size() - 1), prov.ConsumeIntegral<int>());
- break;
+ case 14: {
+ auto pos = prov.ConsumeIntegralInRange<size_t>(0, test.size() - 1);
+ auto value = prov.ConsumeIntegral<int>();
+ test.update(pos, value);
+ } break;
case 15:
test.erase(prov.ConsumeIntegralInRange<size_t>(0, test.size() - 1));
break;
diff --git a/src/test/fuzz/process_message.cpp b/src/test/fuzz/process_message.cpp
index d10d9dafe8..6373eac1c3 100644
--- a/src/test/fuzz/process_message.cpp
+++ b/src/test/fuzz/process_message.cpp
@@ -42,7 +42,7 @@ void initialize_process_message()
static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(
/*chain_type=*/ChainType::REGTEST,
- /*extra_args=*/{"-txreconciliation"});
+ {.extra_args = {"-txreconciliation"}});
g_setup = testing_setup.get();
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
MineBlock(g_setup->m_node, CScript() << OP_TRUE);
diff --git a/src/test/fuzz/process_messages.cpp b/src/test/fuzz/process_messages.cpp
index 38acd432fa..62f38967a3 100644
--- a/src/test/fuzz/process_messages.cpp
+++ b/src/test/fuzz/process_messages.cpp
@@ -32,7 +32,7 @@ void initialize_process_messages()
{
static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(
/*chain_type=*/ChainType::REGTEST,
- /*extra_args=*/{"-txreconciliation"});
+ {.extra_args = {"-txreconciliation"}});
g_setup = testing_setup.get();
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
MineBlock(g_setup->m_node, CScript() << OP_TRUE);
diff --git a/src/test/fuzz/random.cpp b/src/test/fuzz/random.cpp
index 96668734fd..6b2d42738b 100644
--- a/src/test/fuzz/random.cpp
+++ b/src/test/fuzz/random.cpp
@@ -26,6 +26,5 @@ FUZZ_TARGET(random)
(void)fast_random_context();
std::vector<int64_t> integrals = ConsumeRandomLengthIntegralVector<int64_t>(fuzzed_data_provider);
- Shuffle(integrals.begin(), integrals.end(), fast_random_context);
std::shuffle(integrals.begin(), integrals.end(), fast_random_context);
}
diff --git a/src/test/fuzz/rpc.cpp b/src/test/fuzz/rpc.cpp
index 4e52c1c091..9122617e46 100644
--- a/src/test/fuzz/rpc.cpp
+++ b/src/test/fuzz/rpc.cpp
@@ -41,7 +41,7 @@ using util::ToString;
namespace {
struct RPCFuzzTestingSetup : public TestingSetup {
- RPCFuzzTestingSetup(const ChainType chain_type, const std::vector<const char*>& extra_args) : TestingSetup{chain_type, extra_args}
+ RPCFuzzTestingSetup(const ChainType chain_type, TestOpts opts) : TestingSetup{chain_type, opts}
{
}
diff --git a/src/test/fuzz/script.cpp b/src/test/fuzz/script.cpp
index fe41a8c6ae..07a49e039f 100644
--- a/src/test/fuzz/script.cpp
+++ b/src/test/fuzz/script.cpp
@@ -94,6 +94,7 @@ FUZZ_TARGET(script, .init = initialize_script)
(void)Solver(script, solutions);
(void)script.HasValidOps();
+ (void)script.IsPayToAnchor();
(void)script.IsPayToScriptHash();
(void)script.IsPayToWitnessScriptHash();
(void)script.IsPushOnly();
diff --git a/src/test/fuzz/script_format.cpp b/src/test/fuzz/script_format.cpp
index 10150dcd7f..e26c42ae38 100644
--- a/src/test/fuzz/script_format.cpp
+++ b/src/test/fuzz/script_format.cpp
@@ -30,5 +30,7 @@ FUZZ_TARGET(script_format, .init = initialize_script_format)
(void)ScriptToAsmStr(script, /*fAttemptSighashDecode=*/fuzzed_data_provider.ConsumeBool());
UniValue o1(UniValue::VOBJ);
- ScriptToUniv(script, /*out=*/o1, /*include_hex=*/fuzzed_data_provider.ConsumeBool(), /*include_address=*/fuzzed_data_provider.ConsumeBool());
+ auto include_hex = fuzzed_data_provider.ConsumeBool();
+ auto include_address = fuzzed_data_provider.ConsumeBool();
+ ScriptToUniv(script, /*out=*/o1, include_hex, include_address);
}
diff --git a/src/test/fuzz/script_interpreter.cpp b/src/test/fuzz/script_interpreter.cpp
index 5e76443abe..9e3ad02b2e 100644
--- a/src/test/fuzz/script_interpreter.cpp
+++ b/src/test/fuzz/script_interpreter.cpp
@@ -25,12 +25,18 @@ FUZZ_TARGET(script_interpreter)
const CTransaction tx_to{*mtx};
const unsigned int in = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
if (in < tx_to.vin.size()) {
- (void)SignatureHash(script_code, tx_to, in, fuzzed_data_provider.ConsumeIntegral<int>(), ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}), nullptr);
+ auto n_hash_type = fuzzed_data_provider.ConsumeIntegral<int>();
+ auto amount = ConsumeMoney(fuzzed_data_provider);
+ auto sigversion = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0});
+ (void)SignatureHash(script_code, tx_to, in, n_hash_type, amount, sigversion, nullptr);
const std::optional<CMutableTransaction> mtx_precomputed = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
if (mtx_precomputed) {
const CTransaction tx_precomputed{*mtx_precomputed};
const PrecomputedTransactionData precomputed_transaction_data{tx_precomputed};
- (void)SignatureHash(script_code, tx_to, in, fuzzed_data_provider.ConsumeIntegral<int>(), ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}), &precomputed_transaction_data);
+ n_hash_type = fuzzed_data_provider.ConsumeIntegral<int>();
+ amount = ConsumeMoney(fuzzed_data_provider);
+ sigversion = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0});
+ (void)SignatureHash(script_code, tx_to, in, n_hash_type, amount, sigversion, &precomputed_transaction_data);
}
}
}
diff --git a/src/test/fuzz/script_sigcache.cpp b/src/test/fuzz/script_sigcache.cpp
index 5fdbc9e106..7f73c3706c 100644
--- a/src/test/fuzz/script_sigcache.cpp
+++ b/src/test/fuzz/script_sigcache.cpp
@@ -2,41 +2,41 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <chainparams.h>
-#include <key.h>
+#include <consensus/amount.h>
+#include <primitives/transaction.h>
#include <pubkey.h>
+#include <script/interpreter.h>
#include <script/sigcache.h>
+#include <span.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
#include <test/util/setup_common.h>
+#include <uint256.h>
-#include <cstdint>
+#include <cstddef>
#include <optional>
-#include <string>
#include <vector>
-namespace {
-const BasicTestingSetup* g_setup;
-} // namespace
-
void initialize_script_sigcache()
{
static const auto testing_setup = MakeNoLogFileContext<>();
- g_setup = testing_setup.get();
}
FUZZ_TARGET(script_sigcache, .init = initialize_script_sigcache)
{
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
+ const auto max_sigcache_bytes{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, DEFAULT_SIGNATURE_CACHE_BYTES)};
+ SignatureCache signature_cache{max_sigcache_bytes};
+
const std::optional<CMutableTransaction> mutable_transaction = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
const CTransaction tx{mutable_transaction ? *mutable_transaction : CMutableTransaction{}};
const unsigned int n_in = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
const CAmount amount = ConsumeMoney(fuzzed_data_provider);
const bool store = fuzzed_data_provider.ConsumeBool();
PrecomputedTransactionData tx_data;
- CachingTransactionSignatureChecker caching_transaction_signature_checker{mutable_transaction ? &tx : nullptr, n_in, amount, store, tx_data};
+ CachingTransactionSignatureChecker caching_transaction_signature_checker{mutable_transaction ? &tx : nullptr, n_in, amount, store, signature_cache, tx_data};
if (fuzzed_data_provider.ConsumeBool()) {
const auto random_bytes = fuzzed_data_provider.ConsumeBytes<unsigned char>(64);
const XOnlyPubKey pub_key(ConsumeUInt256(fuzzed_data_provider));
diff --git a/src/test/fuzz/script_sign.cpp b/src/test/fuzz/script_sign.cpp
index 4695bc611b..9fa5e0b7d8 100644
--- a/src/test/fuzz/script_sign.cpp
+++ b/src/test/fuzz/script_sign.cpp
@@ -13,6 +13,7 @@
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
+#include <test/util/transaction_utils.h>
#include <util/chaintype.h>
#include <util/translation.h>
@@ -111,7 +112,10 @@ FUZZ_TARGET(script_sign, .init = initialize_script_sign)
}
if (n_in < script_tx_to.vin.size()) {
SignatureData empty;
- (void)SignSignature(provider, ConsumeScript(fuzzed_data_provider), script_tx_to, n_in, ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int>(), empty);
+ auto from_pub_key = ConsumeScript(fuzzed_data_provider);
+ auto amount = ConsumeMoney(fuzzed_data_provider);
+ auto n_hash_type = fuzzed_data_provider.ConsumeIntegral<int>();
+ (void)SignSignature(provider, from_pub_key, script_tx_to, n_in, amount, n_hash_type, empty);
MutableTransactionSignatureCreator signature_creator{tx_to, n_in, ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int>()};
std::vector<unsigned char> vch_sig;
CKeyID address;
@@ -122,7 +126,9 @@ FUZZ_TARGET(script_sign, .init = initialize_script_sign)
} else {
address = CKeyID{ConsumeUInt160(fuzzed_data_provider)};
}
- (void)signature_creator.CreateSig(provider, vch_sig, address, ConsumeScript(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}));
+ auto script_code = ConsumeScript(fuzzed_data_provider);
+ auto sigversion = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0});
+ (void)signature_creator.CreateSig(provider, vch_sig, address, script_code, sigversion);
}
std::map<COutPoint, Coin> coins{ConsumeCoins(fuzzed_data_provider)};
std::map<int, bilingual_str> input_errors;
diff --git a/src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp b/src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp
index 0435626356..9f84ac9713 100644
--- a/src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp
+++ b/src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp
@@ -17,7 +17,7 @@ int ec_seckey_export_der(const secp256k1_context* ctx, unsigned char* seckey, si
FUZZ_TARGET(secp256k1_ec_seckey_import_export_der)
{
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
- secp256k1_context* secp256k1_context_sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
+ secp256k1_context* secp256k1_context_sign = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
{
std::vector<uint8_t> out32(32);
(void)ec_seckey_import_der(secp256k1_context_sign, out32.data(), ConsumeFixedLengthByteVector(fuzzed_data_provider, CKey::SIZE).data(), CKey::SIZE);
diff --git a/src/test/fuzz/socks5.cpp b/src/test/fuzz/socks5.cpp
index af81fcb593..17d1787586 100644
--- a/src/test/fuzz/socks5.cpp
+++ b/src/test/fuzz/socks5.cpp
@@ -41,8 +41,8 @@ FUZZ_TARGET(socks5, .init = initialize_socks5)
FuzzedSock fuzzed_sock = ConsumeSock(fuzzed_data_provider);
// This Socks5(...) fuzzing harness would have caught CVE-2017-18350 within
// a few seconds of fuzzing.
- (void)Socks5(fuzzed_data_provider.ConsumeRandomLengthString(512),
- fuzzed_data_provider.ConsumeIntegral<uint16_t>(),
- fuzzed_data_provider.ConsumeBool() ? &proxy_credentials : nullptr,
- fuzzed_sock);
+ auto str_dest = fuzzed_data_provider.ConsumeRandomLengthString(512);
+ auto port = fuzzed_data_provider.ConsumeIntegral<uint16_t>();
+ auto* auth = fuzzed_data_provider.ConsumeBool() ? &proxy_credentials : nullptr;
+ (void)Socks5(str_dest, port, auth, fuzzed_sock);
}
diff --git a/src/test/fuzz/span.cpp b/src/test/fuzz/span.cpp
index 8f753948df..cd436d582f 100644
--- a/src/test/fuzz/span.cpp
+++ b/src/test/fuzz/span.cpp
@@ -30,10 +30,4 @@ FUZZ_TARGET(span)
(void)span.subspan(idx, span.size() - idx);
(void)span[idx];
}
-
- std::string another_str = fuzzed_data_provider.ConsumeBytesAsString(32);
- const Span<const char> another_span{another_str};
- assert((span <= another_span) != (span > another_span));
- assert((span == another_span) != (span != another_span));
- assert((span >= another_span) != (span < another_span));
}
diff --git a/src/test/fuzz/string.cpp b/src/test/fuzz/string.cpp
index 5b822b03f6..443d7241b5 100644
--- a/src/test/fuzz/string.cpp
+++ b/src/test/fuzz/string.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2020-2022 The Bitcoin Core developers
+// Copyright (c) 2020-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.
@@ -101,7 +101,6 @@ FUZZ_TARGET(string)
(void)TrimString(random_string_1, random_string_2);
(void)UrlDecode(random_string_1);
(void)ContainsNoNUL(random_string_1);
- (void)_(random_string_1.c_str());
try {
throw scriptnum_error{random_string_1};
} catch (const std::runtime_error&) {
diff --git a/src/test/fuzz/system.cpp b/src/test/fuzz/system.cpp
index 73ae89b52a..2ab5b7ed39 100644
--- a/src/test/fuzz/system.cpp
+++ b/src/test/fuzz/system.cpp
@@ -44,23 +44,31 @@ FUZZ_TARGET(system, .init = initialize_system)
args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16));
},
[&] {
- args_manager.SoftSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16));
+ auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ args_manager.SoftSetArg(str_arg, str_value);
},
[&] {
- args_manager.ForceSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16));
+ auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ args_manager.ForceSetArg(str_arg, str_value);
},
[&] {
- args_manager.SoftSetBoolArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeBool());
+ auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ auto f_value = fuzzed_data_provider.ConsumeBool();
+ args_manager.SoftSetBoolArg(str_arg, f_value);
},
[&] {
- const OptionsCategory options_category = fuzzed_data_provider.PickValueInArray<OptionsCategory>({OptionsCategory::OPTIONS, OptionsCategory::CONNECTION, OptionsCategory::WALLET, OptionsCategory::WALLET_DEBUG_TEST, OptionsCategory::ZMQ, OptionsCategory::DEBUG_TEST, OptionsCategory::CHAINPARAMS, OptionsCategory::NODE_RELAY, OptionsCategory::BLOCK_CREATION, OptionsCategory::RPC, OptionsCategory::GUI, OptionsCategory::COMMANDS, OptionsCategory::REGISTER_COMMANDS, OptionsCategory::HIDDEN});
+ const OptionsCategory options_category = fuzzed_data_provider.PickValueInArray<OptionsCategory>({OptionsCategory::OPTIONS, OptionsCategory::CONNECTION, OptionsCategory::WALLET, OptionsCategory::WALLET_DEBUG_TEST, OptionsCategory::ZMQ, OptionsCategory::DEBUG_TEST, OptionsCategory::CHAINPARAMS, OptionsCategory::NODE_RELAY, OptionsCategory::BLOCK_CREATION, OptionsCategory::RPC, OptionsCategory::GUI, OptionsCategory::COMMANDS, OptionsCategory::REGISTER_COMMANDS, OptionsCategory::CLI_COMMANDS, OptionsCategory::IPC, OptionsCategory::HIDDEN});
// Avoid hitting:
// common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.
const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16));
if (args_manager.GetArgFlags(argument_name) != std::nullopt) {
return;
}
- args_manager.AddArg(argument_name, fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND, options_category);
+ auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
+ auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND;
+ args_manager.AddArg(argument_name, help, flags, options_category);
},
[&] {
// Avoid hitting:
diff --git a/src/test/fuzz/tx_pool.cpp b/src/test/fuzz/tx_pool.cpp
index b6b91445f9..64861311db 100644
--- a/src/test/fuzz/tx_pool.cpp
+++ b/src/test/fuzz/tx_pool.cpp
@@ -6,7 +6,7 @@
#include <node/context.h>
#include <node/mempool_args.h>
#include <node/miner.h>
-#include <policy/v3_policy.h>
+#include <policy/truc_policy.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
@@ -320,7 +320,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);
+ CheckMempoolTRUCInvariants(tx_pool);
} else {
// Do not consider rejected transaction removed
removed.erase(tx);
@@ -413,7 +413,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);
+ CheckMempoolTRUCInvariants(tx_pool);
}
}
Finish(fuzzed_data_provider, tx_pool, chainstate);
diff --git a/src/test/fuzz/txorphan.cpp b/src/test/fuzz/txorphan.cpp
index 7bebb987b1..5129c05a39 100644
--- a/src/test/fuzz/txorphan.cpp
+++ b/src/test/fuzz/txorphan.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2022 The Bitcoin Core developers
+// Copyright (c) 2022-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.
@@ -37,11 +37,11 @@ FUZZ_TARGET(txorphan, .init = initialize_orphanage)
SetMockTime(ConsumeTime(fuzzed_data_provider));
TxOrphanage orphanage;
- std::set<COutPoint> outpoints;
+ std::vector<COutPoint> outpoints; // Duplicates are tolerated
// initial outpoints used to construct transactions later
for (uint8_t i = 0; i < 4; i++) {
- outpoints.emplace(Txid::FromUint256(uint256{i}), 0);
+ outpoints.emplace_back(Txid::FromUint256(uint256{i}), 0);
}
CTransactionRef ptx_potential_parent = nullptr;
@@ -67,7 +67,7 @@ FUZZ_TARGET(txorphan, .init = initialize_orphanage)
auto new_tx = MakeTransactionRef(tx_mut);
// add newly constructed outpoints to the coin pool
for (uint32_t i = 0; i < num_out; i++) {
- outpoints.emplace(new_tx->GetHash(), i);
+ outpoints.emplace_back(new_tx->GetHash(), i);
}
return new_tx;
}();
diff --git a/src/test/fuzz/util.cpp b/src/test/fuzz/util.cpp
index 92ded99917..425b9559a7 100644
--- a/src/test/fuzz/util.cpp
+++ b/src/test/fuzz/util.cpp
@@ -214,6 +214,9 @@ CTxDestination ConsumeTxDestination(FuzzedDataProvider& fuzzed_data_provider) no
tx_destination = WitnessV1Taproot{XOnlyPubKey{ConsumeUInt256(fuzzed_data_provider)}};
},
[&] {
+ tx_destination = PayToAnchor{};
+ },
+ [&] {
std::vector<unsigned char> program{ConsumeRandomLengthByteVector(fuzzed_data_provider, /*max_length=*/40)};
if (program.size() < 2) {
program = {0, 0};
diff --git a/src/test/fuzz/util/CMakeLists.txt b/src/test/fuzz/util/CMakeLists.txt
new file mode 100644
index 0000000000..f73a1a83c2
--- /dev/null
+++ b/src/test/fuzz/util/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(test_fuzz STATIC EXCLUDE_FROM_ALL
+ descriptor.cpp
+ mempool.cpp
+ net.cpp
+ ../fuzz.cpp
+ ../util.cpp
+)
+
+target_link_libraries(test_fuzz
+ PRIVATE
+ core_interface
+ test_util
+ bitcoin_node
+ Boost::headers
+)
+
+if(NOT FUZZ_BINARY_LINKS_WITHOUT_MAIN_FUNCTION)
+ target_compile_definitions(test_fuzz PRIVATE PROVIDE_FUZZ_MAIN_FUNCTION)
+endif()
diff --git a/src/test/fuzz/util/descriptor.cpp b/src/test/fuzz/util/descriptor.cpp
index 0fed2bc5e1..9e52e990a2 100644
--- a/src/test/fuzz/util/descriptor.cpp
+++ b/src/test/fuzz/util/descriptor.cpp
@@ -4,6 +4,9 @@
#include <test/fuzz/util/descriptor.h>
+#include <ranges>
+#include <stack>
+
void MockedDescriptorConverter::Init() {
// The data to use as a private key or a seed for an xprv.
std::array<std::byte, 32> key_data{std::byte{1}};
@@ -84,3 +87,59 @@ bool HasDeepDerivPath(const FuzzBufferType& buff, const int max_depth)
}
return false;
}
+
+bool HasTooManySubFrag(const FuzzBufferType& buff, const int max_subs, const size_t max_nested_subs)
+{
+ // We use a stack because there may be many nested sub-frags.
+ std::stack<int> counts;
+ for (const auto& ch: buff) {
+ // The fuzzer may generate an input with a ton of parentheses. Rule out pathological cases.
+ if (counts.size() > max_nested_subs) return true;
+
+ if (ch == '(') {
+ // A new fragment was opened, create a new sub-count for it and start as one since any fragment with
+ // parentheses has at least one sub.
+ counts.push(1);
+ } else if (ch == ',' && !counts.empty()) {
+ // When encountering a comma, account for an additional sub in the last opened fragment. If it exceeds the
+ // limit, bail.
+ if (++counts.top() > max_subs) return true;
+ } else if (ch == ')' && !counts.empty()) {
+ // Fragment closed! Drop its sub count and resume to counting the number of subs for its parent.
+ counts.pop();
+ }
+ }
+ return false;
+}
+
+bool HasTooManyWrappers(const FuzzBufferType& buff, const int max_wrappers)
+{
+ // The number of nested wrappers. Nested wrappers are always characters which follow each other so we don't have to
+ // use a stack as we do above when counting the number of sub-fragments.
+ std::optional<int> count;
+
+ // We want to detect nested wrappers. A wrapper is a character prepended to a fragment, separated by a colon. There
+ // may be more than one wrapper, in which case the colon is not repeated. For instance `jjjjj:pk()`. To count
+ // wrappers we iterate in reverse and use the colon to detect the end of a wrapper expression and count how many
+ // characters there are since the beginning of the expression. We stop counting when we encounter a character
+ // indicating the beginning of a new expression.
+ for (const auto ch: buff | std::views::reverse) {
+ // A colon, start counting.
+ if (ch == ':') {
+ // The colon itself is not a wrapper so we start at 0.
+ count = 0;
+ } else if (count) {
+ // If we are counting wrappers, stop when we crossed the beginning of the wrapper expression. Otherwise keep
+ // counting and bail if we reached the limit.
+ // A wrapper may only ever occur as the first sub of a descriptor/miniscript expression ('('), as the
+ // first Taproot leaf in a pair ('{') or as the nth sub in each case (',').
+ if (ch == ',' || ch == '(' || ch == '{') {
+ count.reset();
+ } else if (++*count > max_wrappers) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
diff --git a/src/test/fuzz/util/descriptor.h b/src/test/fuzz/util/descriptor.h
index cd41dbafa3..ea928c39f0 100644
--- a/src/test/fuzz/util/descriptor.h
+++ b/src/test/fuzz/util/descriptor.h
@@ -55,4 +55,25 @@ constexpr int MAX_DEPTH{2};
*/
bool HasDeepDerivPath(const FuzzBufferType& buff, const int max_depth = MAX_DEPTH);
+//! Default maximum number of sub-fragments.
+constexpr int MAX_SUBS{1'000};
+//! Maximum number of nested sub-fragments we'll allow in a descriptor.
+constexpr size_t MAX_NESTED_SUBS{10'000};
+
+/**
+ * Whether the buffer, if it represents a valid descriptor, contains a fragment with more
+ * sub-fragments than the given maximum.
+ */
+bool HasTooManySubFrag(const FuzzBufferType& buff, const int max_subs = MAX_SUBS,
+ const size_t max_nested_subs = MAX_NESTED_SUBS);
+
+//! Default maximum number of wrappers per fragment.
+constexpr int MAX_WRAPPERS{100};
+
+/**
+ * Whether the buffer, if it represents a valid descriptor, contains a fragment with more
+ * wrappers than the given maximum.
+ */
+bool HasTooManyWrappers(const FuzzBufferType& buff, const int max_wrappers = MAX_WRAPPERS);
+
#endif // BITCOIN_TEST_FUZZ_UTIL_DESCRIPTOR_H
diff --git a/src/test/fuzz/util/net.cpp b/src/test/fuzz/util/net.cpp
index ad69c29d12..b02c4edbad 100644
--- a/src/test/fuzz/util/net.cpp
+++ b/src/test/fuzz/util/net.cpp
@@ -383,7 +383,7 @@ bool FuzzedSock::Wait(std::chrono::milliseconds timeout, Event requested, Event*
return false;
}
if (occurred != nullptr) {
- // We simulate the requested event as occured when ConsumeBool()
+ // We simulate the requested event as occurred when ConsumeBool()
// returns false. This avoids simulating endless waiting if the
// FuzzedDataProvider runs out of data.
*occurred = m_fuzzed_data_provider.ConsumeBool() ? 0 : requested;
@@ -395,7 +395,7 @@ bool FuzzedSock::WaitMany(std::chrono::milliseconds timeout, EventsPerSock& even
{
for (auto& [sock, events] : events_per_sock) {
(void)sock;
- // We simulate the requested event as occured when ConsumeBool()
+ // We simulate the requested event as occurred when ConsumeBool()
// returns false. This avoids simulating endless waiting if the
// FuzzedDataProvider runs out of data.
events.occurred = m_fuzzed_data_provider.ConsumeBool() ? 0 : events.requested;
@@ -414,10 +414,10 @@ bool FuzzedSock::IsConnected(std::string& errmsg) const
void FillNode(FuzzedDataProvider& fuzzed_data_provider, ConnmanTestMsg& connman, CNode& node) noexcept
{
- connman.Handshake(node,
- /*successfully_connected=*/fuzzed_data_provider.ConsumeBool(),
- /*remote_services=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS),
- /*local_services=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS),
- /*version=*/fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(MIN_PEER_PROTO_VERSION, std::numeric_limits<int32_t>::max()),
- /*relay_txs=*/fuzzed_data_provider.ConsumeBool());
+ auto successfully_connected = fuzzed_data_provider.ConsumeBool();
+ auto remote_services = ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS);
+ auto local_services = ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS);
+ auto version = fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(MIN_PEER_PROTO_VERSION, std::numeric_limits<int32_t>::max());
+ auto relay_txs = fuzzed_data_provider.ConsumeBool();
+ connman.Handshake(node, successfully_connected, remote_services, local_services, version, relay_txs);
}
diff --git a/src/test/fuzz/utxo_snapshot.cpp b/src/test/fuzz/utxo_snapshot.cpp
index 8c9c67a91c..1241bba8be 100644
--- a/src/test/fuzz/utxo_snapshot.cpp
+++ b/src/test/fuzz/utxo_snapshot.cpp
@@ -1,39 +1,79 @@
-// Copyright (c) 2021-2022 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.
+#include <chain.h>
#include <chainparams.h>
+#include <coins.h>
+#include <consensus/consensus.h>
#include <consensus/validation.h>
+#include <node/blockstorage.h>
#include <node/utxo_snapshot.h>
+#include <primitives/block.h>
+#include <primitives/transaction.h>
+#include <serialize.h>
+#include <span.h>
+#include <streams.h>
+#include <sync.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
#include <test/util/mining.h>
#include <test/util/setup_common.h>
-#include <util/chaintype.h>
+#include <uint256.h>
+#include <util/check.h>
#include <util/fs.h>
+#include <util/result.h>
#include <validation.h>
-#include <validationinterface.h>
+
+#include <cstdint>
+#include <functional>
+#include <ios>
+#include <memory>
+#include <optional>
+#include <vector>
using node::SnapshotMetadata;
namespace {
const std::vector<std::shared_ptr<CBlock>>* g_chain;
+TestingSetup* g_setup;
+template <bool INVALID>
void initialize_chain()
{
const auto params{CreateChainParams(ArgsManager{}, ChainType::REGTEST)};
static const auto chain{CreateBlockChain(2 * COINBASE_MATURITY, *params)};
g_chain = &chain;
+ static const auto setup{
+ MakeNoLogFileContext<TestingSetup>(ChainType::REGTEST,
+ TestOpts{
+ .setup_net = false,
+ .setup_validation_interface = false,
+ .min_validation_cache = true,
+ }),
+ };
+ if constexpr (INVALID) {
+ auto& chainman{*setup->m_node.chainman};
+ for (const auto& block : chain) {
+ BlockValidationState dummy;
+ bool processed{chainman.ProcessNewBlockHeaders({{block->GetBlockHeader()}}, true, dummy)};
+ Assert(processed);
+ const auto* index{WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(block->GetHash()))};
+ Assert(index);
+ }
+ }
+ g_setup = setup.get();
}
-FUZZ_TARGET(utxo_snapshot, .init = initialize_chain)
+template <bool INVALID>
+void utxo_snapshot_fuzz(FuzzBufferType buffer)
{
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
- std::unique_ptr<const TestingSetup> setup{MakeNoLogFileContext<const TestingSetup>()};
- const auto& node = setup->m_node;
- auto& chainman{*node.chainman};
+ auto& setup{*g_setup};
+ bool dirty_chainman{false}; // Re-use the global chainman, but reset it when it is dirty
+ auto& chainman{*setup.m_node.chainman};
const auto snapshot_path = gArgs.GetDataDirNet() / "fuzzed_snapshot.dat";
@@ -41,29 +81,68 @@ FUZZ_TARGET(utxo_snapshot, .init = initialize_chain)
{
AutoFile outfile{fsbridge::fopen(snapshot_path, "wb")};
- const auto file_data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
- outfile << Span{file_data};
+ // Metadata
+ if (fuzzed_data_provider.ConsumeBool()) {
+ std::vector<uint8_t> metadata{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
+ outfile << Span{metadata};
+ } else {
+ auto msg_start = chainman.GetParams().MessageStart();
+ int base_blockheight{fuzzed_data_provider.ConsumeIntegralInRange<int>(1, 2 * COINBASE_MATURITY)};
+ uint256 base_blockhash{g_chain->at(base_blockheight - 1)->GetHash()};
+ uint64_t m_coins_count{fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(1, 3 * COINBASE_MATURITY)};
+ SnapshotMetadata metadata{msg_start, base_blockhash, m_coins_count};
+ outfile << metadata;
+ }
+ // Coins
+ if (fuzzed_data_provider.ConsumeBool()) {
+ std::vector<uint8_t> file_data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
+ outfile << Span{file_data};
+ } else {
+ int height{0};
+ for (const auto& block : *g_chain) {
+ auto coinbase{block->vtx.at(0)};
+ outfile << coinbase->GetHash();
+ WriteCompactSize(outfile, 1); // number of coins for the hash
+ WriteCompactSize(outfile, 0); // index of coin
+ outfile << Coin(coinbase->vout[0], height, /*fCoinBaseIn=*/1);
+ height++;
+ }
+ }
+ if constexpr (INVALID) {
+ // Append an invalid coin to ensure invalidity. This error will be
+ // detected late in PopulateAndValidateSnapshot, and allows the
+ // INVALID fuzz target to reach more potential code coverage.
+ const auto& coinbase{g_chain->back()->vtx.back()};
+ outfile << coinbase->GetHash();
+ WriteCompactSize(outfile, 1); // number of coins for the hash
+ WriteCompactSize(outfile, 999); // index of coin
+ outfile << Coin{coinbase->vout[0], /*nHeightIn=*/999, /*fCoinBaseIn=*/0};
+ }
}
const auto ActivateFuzzedSnapshot{[&] {
AutoFile infile{fsbridge::fopen(snapshot_path, "rb")};
- auto msg_start = Params().MessageStart();
+ auto msg_start = chainman.GetParams().MessageStart();
SnapshotMetadata metadata{msg_start};
try {
infile >> metadata;
} catch (const std::ios_base::failure&) {
return false;
}
- return chainman.ActivateSnapshot(infile, metadata, /*in_memory=*/true);
+ return !!chainman.ActivateSnapshot(infile, metadata, /*in_memory=*/true);
}};
if (fuzzed_data_provider.ConsumeBool()) {
- for (const auto& block : *g_chain) {
- BlockValidationState dummy;
- bool processed{chainman.ProcessNewBlockHeaders({*block}, true, dummy)};
- Assert(processed);
- const auto* index{WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(block->GetHash()))};
- Assert(index);
+ // Consume the bool, but skip the code for the INVALID fuzz target
+ if constexpr (!INVALID) {
+ for (const auto& block : *g_chain) {
+ BlockValidationState dummy;
+ bool processed{chainman.ProcessNewBlockHeaders({{block->GetBlockHeader()}}, true, dummy)};
+ Assert(processed);
+ const auto* index{WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(block->GetHash()))};
+ Assert(index);
+ }
+ dirty_chainman = true;
}
}
@@ -73,21 +152,49 @@ FUZZ_TARGET(utxo_snapshot, .init = initialize_chain)
Assert(*chainman.ActiveChainstate().m_from_snapshot_blockhash ==
*chainman.SnapshotBlockhash());
const auto& coinscache{chainman.ActiveChainstate().CoinsTip()};
- int64_t chain_tx{};
for (const auto& block : *g_chain) {
Assert(coinscache.HaveCoin(COutPoint{block->vtx.at(0)->GetHash(), 0}));
const auto* index{chainman.m_blockman.LookupBlockIndex(block->GetHash())};
- const auto num_tx{Assert(index)->nTx};
- Assert(num_tx == 1);
- chain_tx += num_tx;
+ Assert(index);
+ Assert(index->nTx == 0);
+ if (index->nHeight == chainman.GetSnapshotBaseHeight()) {
+ auto params{chainman.GetParams().AssumeutxoForHeight(index->nHeight)};
+ Assert(params.has_value());
+ Assert(params.value().m_chain_tx_count == index->m_chain_tx_count);
+ } else {
+ Assert(index->m_chain_tx_count == 0);
+ }
}
Assert(g_chain->size() == coinscache.GetCacheSize());
- Assert(chain_tx == chainman.ActiveTip()->nChainTx);
+ dirty_chainman = true;
} else {
Assert(!chainman.SnapshotBlockhash());
Assert(!chainman.ActiveChainstate().m_from_snapshot_blockhash);
}
// Snapshot should refuse to load a second time regardless of validity
Assert(!ActivateFuzzedSnapshot());
+ if constexpr (INVALID) {
+ // Activating the snapshot, or any other action that makes the chainman
+ // "dirty" can and must not happen for the INVALID fuzz target
+ Assert(!dirty_chainman);
+ }
+ if (dirty_chainman) {
+ setup.m_node.chainman.reset();
+ setup.m_make_chainman();
+ setup.LoadVerifyActivateChainstate();
+ }
}
+
+// There are two fuzz targets:
+//
+// The target 'utxo_snapshot', which allows valid snapshots, but is slow,
+// because it has to reset the chainstate manager on almost all fuzz inputs.
+// Otherwise, a dirty header tree or dirty chainstate could leak from one fuzz
+// input execution into the next, which makes execution non-deterministic.
+//
+// The target 'utxo_snapshot_invalid', which is fast and does not require any
+// expensive state to be reset.
+FUZZ_TARGET(utxo_snapshot /*valid*/, .init = initialize_chain<false>) { utxo_snapshot_fuzz<false>(buffer); }
+FUZZ_TARGET(utxo_snapshot_invalid, .init = initialize_chain<true>) { utxo_snapshot_fuzz<true>(buffer); }
+
} // namespace
diff --git a/src/test/fuzz/utxo_total_supply.cpp b/src/test/fuzz/utxo_total_supply.cpp
index 48ed266abe..b0f1a1251a 100644
--- a/src/test/fuzz/utxo_total_supply.cpp
+++ b/src/test/fuzz/utxo_total_supply.cpp
@@ -23,7 +23,7 @@ FUZZ_TARGET(utxo_total_supply)
ChainTestingSetup test_setup{
ChainType::REGTEST,
{
- "-testactivationheight=bip34@2",
+ .extra_args = {"-testactivationheight=bip34@2"},
},
};
// Create chainstate
diff --git a/src/test/fuzz/validation_load_mempool.cpp b/src/test/fuzz/validation_load_mempool.cpp
index 51140ae039..c70d9ddf1e 100644
--- a/src/test/fuzz/validation_load_mempool.cpp
+++ b/src/test/fuzz/validation_load_mempool.cpp
@@ -2,7 +2,7 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <kernel/mempool_persist.h>
+#include <node/mempool_persist.h>
#include <node/mempool_args.h>
#include <node/mempool_persist_args.h>
@@ -21,8 +21,8 @@
#include <cstdint>
#include <vector>
-using kernel::DumpMempool;
-using kernel::LoadMempool;
+using node::DumpMempool;
+using node::LoadMempool;
using node::MempoolPath;
diff --git a/src/test/fuzz/vecdeque.cpp b/src/test/fuzz/vecdeque.cpp
index 1d9a98931f..3bb858ee8a 100644
--- a/src/test/fuzz/vecdeque.cpp
+++ b/src/test/fuzz/vecdeque.cpp
@@ -2,9 +2,9 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <random.h>
#include <span.h>
#include <test/fuzz/util.h>
-#include <test/util/xoroshiro128plusplus.h>
#include <util/vecdeque.h>
#include <deque>
@@ -28,7 +28,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
{
FuzzedDataProvider provider(buffer.data(), buffer.size());
// Local RNG, only used for the seeds to initialize T objects with.
- XoRoShiRo128PlusPlus rng(provider.ConsumeIntegral<uint64_t>() ^ rng_tweak);
+ InsecureRandomContext rng(provider.ConsumeIntegral<uint64_t>() ^ rng_tweak);
// Real circular buffers.
std::vector<VecDeque<T>> real;
@@ -175,7 +175,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_full && command-- == 0) {
/* push_back() (copying) */
- tmp = T(rng());
+ tmp = T(rng.rand64());
size_t old_size = real[idx].size();
size_t old_cap = real[idx].capacity();
real[idx].push_back(*tmp);
@@ -191,7 +191,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_full && command-- == 0) {
/* push_back() (moving) */
- tmp = T(rng());
+ tmp = T(rng.rand64());
size_t old_size = real[idx].size();
size_t old_cap = real[idx].capacity();
sim[idx].push_back(*tmp);
@@ -207,7 +207,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_full && command-- == 0) {
/* emplace_back() */
- uint64_t seed{rng()};
+ uint64_t seed{rng.rand64()};
size_t old_size = real[idx].size();
size_t old_cap = real[idx].capacity();
sim[idx].emplace_back(seed);
@@ -223,7 +223,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_full && command-- == 0) {
/* push_front() (copying) */
- tmp = T(rng());
+ tmp = T(rng.rand64());
size_t old_size = real[idx].size();
size_t old_cap = real[idx].capacity();
real[idx].push_front(*tmp);
@@ -239,7 +239,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_full && command-- == 0) {
/* push_front() (moving) */
- tmp = T(rng());
+ tmp = T(rng.rand64());
size_t old_size = real[idx].size();
size_t old_cap = real[idx].capacity();
sim[idx].push_front(*tmp);
@@ -255,7 +255,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_full && command-- == 0) {
/* emplace_front() */
- uint64_t seed{rng()};
+ uint64_t seed{rng.rand64()};
size_t old_size = real[idx].size();
size_t old_cap = real[idx].capacity();
sim[idx].emplace_front(seed);
@@ -271,7 +271,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_empty && command-- == 0) {
/* front() [modifying] */
- tmp = T(rng());
+ tmp = T(rng.rand64());
size_t old_size = real[idx].size();
assert(sim[idx].front() == real[idx].front());
sim[idx].front() = *tmp;
@@ -281,7 +281,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_empty && command-- == 0) {
/* back() [modifying] */
- tmp = T(rng());
+ tmp = T(rng.rand64());
size_t old_size = real[idx].size();
assert(sim[idx].back() == real[idx].back());
sim[idx].back() = *tmp;
@@ -291,7 +291,7 @@ void TestType(Span<const uint8_t> buffer, uint64_t rng_tweak)
}
if (existing_buffer_non_empty && command-- == 0) {
/* operator[] [modifying] */
- tmp = T(rng());
+ tmp = T(rng.rand64());
size_t pos = provider.ConsumeIntegralInRange<size_t>(0, sim[idx].size() - 1);
size_t old_size = real[idx].size();
assert(sim[idx][pos] == real[idx][pos]);
diff --git a/src/test/hash_tests.cpp b/src/test/hash_tests.cpp
index 51f1d4c840..f56f7232c3 100644
--- a/src/test/hash_tests.cpp
+++ b/src/test/hash_tests.cpp
@@ -11,7 +11,7 @@
#include <boost/test/unit_test.hpp>
-BOOST_AUTO_TEST_SUITE(hash_tests)
+BOOST_FIXTURE_TEST_SUITE(hash_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(murmurhash3)
{
@@ -104,7 +104,7 @@ BOOST_AUTO_TEST_CASE(siphash)
hasher.Write(0x2F2E2D2C2B2A2928ULL);
BOOST_CHECK_EQUAL(hasher.Finalize(), 0xe612a3cb9ecba951ull);
- BOOST_CHECK_EQUAL(SipHashUint256(0x0706050403020100ULL, 0x0F0E0D0C0B0A0908ULL, uint256S("1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100")), 0x7127512f72f27cceull);
+ BOOST_CHECK_EQUAL(SipHashUint256(0x0706050403020100ULL, 0x0F0E0D0C0B0A0908ULL, uint256{"1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100"}), 0x7127512f72f27cceull);
// Check test vectors from spec, one byte at a time
CSipHasher hasher2(0x0706050403020100ULL, 0x0F0E0D0C0B0A0908ULL);
@@ -135,7 +135,7 @@ BOOST_AUTO_TEST_CASE(siphash)
for (int i = 0; i < 16; ++i) {
uint64_t k1 = ctx.rand64();
uint64_t k2 = ctx.rand64();
- uint256 x = InsecureRand256();
+ uint256 x = m_rng.rand256();
uint32_t n = ctx.rand32();
uint8_t nb[4];
WriteLE32(nb, n);
diff --git a/src/test/i2p_tests.cpp b/src/test/i2p_tests.cpp
index 0512c6134f..bb9ca88019 100644
--- a/src/test/i2p_tests.cpp
+++ b/src/test/i2p_tests.cpp
@@ -23,8 +23,8 @@ class EnvTestingSetup : public BasicTestingSetup
{
public:
explicit EnvTestingSetup(const ChainType chainType = ChainType::MAIN,
- const std::vector<const char*>& extra_args = {})
- : BasicTestingSetup{chainType, extra_args},
+ TestOpts opts = {})
+ : BasicTestingSetup{chainType, opts},
m_prev_log_level{LogInstance().LogLevel()},
m_create_sock_orig{CreateSock}
{
diff --git a/src/test/ipc_test.capnp b/src/test/ipc_test.capnp
index 55a3dc2683..46cd08b94a 100644
--- a/src/test/ipc_test.capnp
+++ b/src/test/ipc_test.capnp
@@ -9,10 +9,15 @@ $Cxx.namespace("gen");
using Proxy = import "/mp/proxy.capnp";
$Proxy.include("test/ipc_test.h");
-$Proxy.includeTypes("ipc/capnp/common-types.h");
+$Proxy.includeTypes("test/ipc_test_types.h");
+
+using Mining = import "../ipc/capnp/mining.capnp";
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);
+ passTransaction @3 (arg :Data) -> (result :Data);
+ passVectorChar @4 (arg :Data) -> (result :Data);
+ passBlockState @5 (arg :Mining.BlockValidationState) -> (result :Mining.BlockValidationState);
}
diff --git a/src/test/ipc_test.cpp b/src/test/ipc_test.cpp
index ce4edaceb0..91eba9214f 100644
--- a/src/test/ipc_test.cpp
+++ b/src/test/ipc_test.cpp
@@ -2,19 +2,47 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <interfaces/init.h>
+#include <ipc/capnp/protocol.h>
+#include <ipc/process.h>
+#include <ipc/protocol.h>
#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 <tinyformat.h>
+#include <validation.h>
#include <future>
+#include <thread>
#include <kj/common.h>
#include <kj/memory.h>
#include <kj/test.h>
+#include <stdexcept>
#include <boost/test/unit_test.hpp>
+//! Remote init class.
+class TestInit : public interfaces::Init
+{
+public:
+ std::unique_ptr<interfaces::Echo> makeEcho() override { return interfaces::MakeEcho(); }
+};
+
+//! Generate a temporary path with temp_directory_path and mkstemp
+static std::string TempPath(std::string_view pattern)
+{
+ std::string temp{fs::PathToString(fs::path{fs::temp_directory_path()} / fs::PathFromString(std::string{pattern}))};
+ temp.push_back('\0');
+ int fd{mkstemp(temp.data())};
+ BOOST_CHECK_GE(fd, 0);
+ BOOST_CHECK_EQUAL(close(fd), 0);
+ temp.resize(temp.size() - 1);
+ fs::remove(fs::PathFromString(temp));
+ return temp;
+}
+
//! 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
@@ -23,13 +51,13 @@
//! 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()
+void IpcPipeTest()
{
// 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); });
+ mp::EventLoop loop("IpcPipeTest", [](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]));
@@ -61,7 +89,107 @@ void IpcTest()
UniValue uni2{foo->passUniValue(uni1)};
BOOST_CHECK_EQUAL(uni1.write(), uni2.write());
+ CMutableTransaction mtx;
+ mtx.version = 2;
+ mtx.nLockTime = 3;
+ mtx.vin.emplace_back(txout1);
+ mtx.vout.emplace_back(COIN, CScript());
+ CTransactionRef tx1{MakeTransactionRef(mtx)};
+ CTransactionRef tx2{foo->passTransaction(tx1)};
+ BOOST_CHECK(*Assert(tx1) == *Assert(tx2));
+
+ std::vector<char> vec1{'H', 'e', 'l', 'l', 'o'};
+ std::vector<char> vec2{foo->passVectorChar(vec1)};
+ BOOST_CHECK_EQUAL(std::string_view(vec1.begin(), vec1.end()), std::string_view(vec2.begin(), vec2.end()));
+
+ BlockValidationState bs1;
+ bs1.Invalid(BlockValidationResult::BLOCK_CHECKPOINT, "reject reason", "debug message");
+ BlockValidationState bs2{foo->passBlockState(bs1)};
+ BOOST_CHECK_EQUAL(bs1.IsValid(), bs2.IsValid());
+ BOOST_CHECK_EQUAL(bs1.IsError(), bs2.IsError());
+ BOOST_CHECK_EQUAL(bs1.IsInvalid(), bs2.IsInvalid());
+ BOOST_CHECK_EQUAL(static_cast<int>(bs1.GetResult()), static_cast<int>(bs2.GetResult()));
+ BOOST_CHECK_EQUAL(bs1.GetRejectReason(), bs2.GetRejectReason());
+ BOOST_CHECK_EQUAL(bs1.GetDebugMessage(), bs2.GetDebugMessage());
+
+ BlockValidationState bs3;
+ BlockValidationState bs4{foo->passBlockState(bs3)};
+ BOOST_CHECK_EQUAL(bs3.IsValid(), bs4.IsValid());
+ BOOST_CHECK_EQUAL(bs3.IsError(), bs4.IsError());
+ BOOST_CHECK_EQUAL(bs3.IsInvalid(), bs4.IsInvalid());
+ BOOST_CHECK_EQUAL(static_cast<int>(bs3.GetResult()), static_cast<int>(bs4.GetResult()));
+ BOOST_CHECK_EQUAL(bs3.GetRejectReason(), bs4.GetRejectReason());
+ BOOST_CHECK_EQUAL(bs3.GetDebugMessage(), bs4.GetDebugMessage());
+
// Test cleanup: disconnect pipe and join thread
disconnect_client();
thread.join();
}
+
+//! Test ipc::Protocol connect() and serve() methods connecting over a socketpair.
+void IpcSocketPairTest()
+{
+ int fds[2];
+ BOOST_CHECK_EQUAL(socketpair(AF_UNIX, SOCK_STREAM, 0, fds), 0);
+ std::unique_ptr<interfaces::Init> init{std::make_unique<TestInit>()};
+ std::unique_ptr<ipc::Protocol> protocol{ipc::capnp::MakeCapnpProtocol()};
+ std::promise<void> promise;
+ std::thread thread([&]() {
+ protocol->serve(fds[0], "test-serve", *init, [&] { promise.set_value(); });
+ });
+ promise.get_future().wait();
+ std::unique_ptr<interfaces::Init> remote_init{protocol->connect(fds[1], "test-connect")};
+ std::unique_ptr<interfaces::Echo> remote_echo{remote_init->makeEcho()};
+ BOOST_CHECK_EQUAL(remote_echo->echo("echo test"), "echo test");
+ remote_echo.reset();
+ remote_init.reset();
+ thread.join();
+}
+
+//! Test ipc::Process bind() and connect() methods connecting over a unix socket.
+void IpcSocketTest(const fs::path& datadir)
+{
+ std::unique_ptr<interfaces::Init> init{std::make_unique<TestInit>()};
+ std::unique_ptr<ipc::Protocol> protocol{ipc::capnp::MakeCapnpProtocol()};
+ std::unique_ptr<ipc::Process> process{ipc::MakeProcess()};
+
+ std::string invalid_bind{"invalid:"};
+ BOOST_CHECK_THROW(process->bind(datadir, "test_bitcoin", invalid_bind), std::invalid_argument);
+ BOOST_CHECK_THROW(process->connect(datadir, "test_bitcoin", invalid_bind), std::invalid_argument);
+
+ auto bind_and_listen{[&](const std::string& bind_address) {
+ std::string address{bind_address};
+ int serve_fd = process->bind(datadir, "test_bitcoin", address);
+ BOOST_CHECK_GE(serve_fd, 0);
+ BOOST_CHECK_EQUAL(address, bind_address);
+ protocol->listen(serve_fd, "test-serve", *init);
+ }};
+
+ auto connect_and_test{[&](const std::string& connect_address) {
+ std::string address{connect_address};
+ int connect_fd{process->connect(datadir, "test_bitcoin", address)};
+ BOOST_CHECK_EQUAL(address, connect_address);
+ std::unique_ptr<interfaces::Init> remote_init{protocol->connect(connect_fd, "test-connect")};
+ std::unique_ptr<interfaces::Echo> remote_echo{remote_init->makeEcho()};
+ BOOST_CHECK_EQUAL(remote_echo->echo("echo test"), "echo test");
+ }};
+
+ // Need to specify explicit socket addresses outside the data directory, because the data
+ // directory path is so long that the default socket address and any other
+ // addresses in the data directory would fail with errors like:
+ // Address 'unix' path '"/tmp/test_common_Bitcoin Core/ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff/test_bitcoin.sock"' exceeded maximum socket path length
+ std::vector<std::string> addresses{
+ strprintf("unix:%s", TempPath("bitcoin_sock0_XXXXXX")),
+ strprintf("unix:%s", TempPath("bitcoin_sock1_XXXXXX")),
+ };
+
+ // Bind and listen on multiple addresses
+ for (const auto& address : addresses) {
+ bind_and_listen(address);
+ }
+
+ // Connect and test each address multiple times.
+ for (int i : {0, 1, 0, 0, 1}) {
+ connect_and_test(addresses[i]);
+ }
+}
diff --git a/src/test/ipc_test.h b/src/test/ipc_test.h
index bcfcc2125c..2d215a20f1 100644
--- a/src/test/ipc_test.h
+++ b/src/test/ipc_test.h
@@ -7,6 +7,8 @@
#include <primitives/transaction.h>
#include <univalue.h>
+#include <util/fs.h>
+#include <validation.h>
class FooImplementation
{
@@ -14,8 +16,13 @@ public:
int add(int a, int b) { return a + b; }
COutPoint passOutPoint(COutPoint o) { return o; }
UniValue passUniValue(UniValue v) { return v; }
+ CTransactionRef passTransaction(CTransactionRef t) { return t; }
+ std::vector<char> passVectorChar(std::vector<char> v) { return v; }
+ BlockValidationState passBlockState(BlockValidationState s) { return s; }
};
-void IpcTest();
+void IpcPipeTest();
+void IpcSocketPairTest();
+void IpcSocketTest(const fs::path& datadir);
#endif // BITCOIN_TEST_IPC_TEST_H
diff --git a/src/test/ipc_test_types.h b/src/test/ipc_test_types.h
new file mode 100644
index 0000000000..b1d4829aa7
--- /dev/null
+++ b/src/test/ipc_test_types.h
@@ -0,0 +1,12 @@
+// 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.
+
+#ifndef BITCOIN_TEST_IPC_TEST_TYPES_H
+#define BITCOIN_TEST_IPC_TEST_TYPES_H
+
+#include <ipc/capnp/common-types.h>
+#include <ipc/capnp/mining-types.h>
+#include <test/ipc_test.capnp.h>
+
+#endif // BITCOIN_TEST_IPC_TEST_TYPES_H
diff --git a/src/test/ipc_tests.cpp b/src/test/ipc_tests.cpp
index 6e144b0f41..35a4f61117 100644
--- a/src/test/ipc_tests.cpp
+++ b/src/test/ipc_tests.cpp
@@ -2,12 +2,41 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include <ipc/process.h>
#include <test/ipc_test.h>
+
+#include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp>
-BOOST_AUTO_TEST_SUITE(ipc_tests)
+BOOST_FIXTURE_TEST_SUITE(ipc_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(ipc_tests)
{
- IpcTest();
+ IpcPipeTest();
+ IpcSocketPairTest();
+ IpcSocketTest(m_args.GetDataDirNet());
}
+
+// Test address parsing.
+BOOST_AUTO_TEST_CASE(parse_address_test)
+{
+ std::unique_ptr<ipc::Process> process{ipc::MakeProcess()};
+ fs::path datadir{"/var/empty/notexist"};
+ auto check_notexist{[](const std::system_error& e) { return e.code() == std::errc::no_such_file_or_directory; }};
+ auto check_address{[&](std::string address, std::string expect_address, std::string expect_error) {
+ if (expect_error.empty()) {
+ BOOST_CHECK_EXCEPTION(process->connect(datadir, "test_bitcoin", address), std::system_error, check_notexist);
+ } else {
+ BOOST_CHECK_EXCEPTION(process->connect(datadir, "test_bitcoin", address), std::invalid_argument, HasReason(expect_error));
+ }
+ BOOST_CHECK_EQUAL(address, expect_address);
+ }};
+ check_address("unix", "unix:/var/empty/notexist/test_bitcoin.sock", "");
+ check_address("unix:", "unix:/var/empty/notexist/test_bitcoin.sock", "");
+ check_address("unix:path.sock", "unix:/var/empty/notexist/path.sock", "");
+ check_address("unix:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.sock",
+ "unix:/var/empty/notexist/0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.sock",
+ "Unix address path \"/var/empty/notexist/0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.sock\" exceeded maximum socket path length");
+ check_address("invalid", "invalid", "Unrecognized address 'invalid'");
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/key_io_tests.cpp b/src/test/key_io_tests.cpp
index 66b4e09ebf..4dd77edc16 100644
--- a/src/test/key_io_tests.cpp
+++ b/src/test/key_io_tests.cpp
@@ -10,12 +10,13 @@
#include <script/script.h>
#include <test/util/json.h>
#include <test/util/setup_common.h>
+#include <univalue.h>
#include <util/chaintype.h>
#include <util/strencodings.h>
#include <boost/test/unit_test.hpp>
-#include <univalue.h>
+#include <algorithm>
BOOST_FIXTURE_TEST_SUITE(key_io_tests, BasicTestingSetup)
@@ -46,7 +47,7 @@ BOOST_AUTO_TEST_CASE(key_io_valid_parse)
privkey = DecodeSecret(exp_base58string);
BOOST_CHECK_MESSAGE(privkey.IsValid(), "!IsValid:" + strTest);
BOOST_CHECK_MESSAGE(privkey.IsCompressed() == isCompressed, "compressed mismatch:" + strTest);
- BOOST_CHECK_MESSAGE(Span{privkey} == Span{exp_payload}, "key mismatch:" + strTest);
+ BOOST_CHECK_MESSAGE(std::ranges::equal(privkey, exp_payload), "key mismatch:" + strTest);
// Private key must be invalid public key
destination = DecodeDestination(exp_base58string);
diff --git a/src/test/key_tests.cpp b/src/test/key_tests.cpp
index b897a0a153..90e04bed87 100644
--- a/src/test/key_tests.cpp
+++ b/src/test/key_tests.cpp
@@ -8,6 +8,7 @@
#include <key_io.h>
#include <span.h>
#include <streams.h>
+#include <secp256k1_extrakeys.h>
#include <test/util/random.h>
#include <test/util/setup_common.h>
#include <uint256.h>
@@ -19,6 +20,7 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
using util::ToString;
static const std::string strSecret1 = "5HxWvvfubhXpYYpS3tJkw6fq9jE9j18THftkZjHHfmFiWtmAbrj";
@@ -142,19 +144,22 @@ BOOST_AUTO_TEST_CASE(key_test1)
BOOST_CHECK(key1.Sign(hashMsg, detsig));
BOOST_CHECK(key1C.Sign(hashMsg, detsigc));
BOOST_CHECK(detsig == detsigc);
- BOOST_CHECK(detsig == ParseHex("304402205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d022014ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
+ BOOST_CHECK_EQUAL(HexStr(detsig), "304402205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d022014ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6");
+
BOOST_CHECK(key2.Sign(hashMsg, detsig));
BOOST_CHECK(key2C.Sign(hashMsg, detsigc));
BOOST_CHECK(detsig == detsigc);
- BOOST_CHECK(detsig == ParseHex("3044022052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd5022061d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
+ BOOST_CHECK_EQUAL(HexStr(detsig), "3044022052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd5022061d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d");
+
BOOST_CHECK(key1.SignCompact(hashMsg, detsig));
BOOST_CHECK(key1C.SignCompact(hashMsg, detsigc));
- BOOST_CHECK(detsig == ParseHex("1c5dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
- BOOST_CHECK(detsigc == ParseHex("205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
+ BOOST_CHECK_EQUAL(HexStr(detsig), "1c5dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6");
+ BOOST_CHECK_EQUAL(HexStr(detsigc), "205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6");
+
BOOST_CHECK(key2.SignCompact(hashMsg, detsig));
BOOST_CHECK(key2C.SignCompact(hashMsg, detsigc));
- BOOST_CHECK(detsig == ParseHex("1c52d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
- BOOST_CHECK(detsigc == ParseHex("2052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
+ BOOST_CHECK_EQUAL(HexStr(detsig), "1c52d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d");
+ BOOST_CHECK_EQUAL(HexStr(detsigc), "2052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d");
}
BOOST_AUTO_TEST_CASE(key_signature_tests)
@@ -299,19 +304,32 @@ BOOST_AUTO_TEST_CASE(bip340_test_vectors)
// Verify those signatures for good measure.
BOOST_CHECK(pubkey.VerifySchnorr(msg256, sig64));
+ // Repeat the same check, but use the KeyPair directly without any merkle tweak
+ KeyPair keypair = key.ComputeKeyPair(/*merkle_root=*/nullptr);
+ bool kp_ok = keypair.SignSchnorr(msg256, sig64, aux256);
+ BOOST_CHECK(kp_ok);
+ BOOST_CHECK(pubkey.VerifySchnorr(msg256, sig64));
+ BOOST_CHECK(std::vector<unsigned char>(sig64, sig64 + 64) == sig);
+
// Do 10 iterations where we sign with a random Merkle root to tweak,
// and compare against the resulting tweaked keys, with random aux.
// In iteration i=0 we tweak with empty Merkle tree.
for (int i = 0; i < 10; ++i) {
uint256 merkle_root;
- if (i) merkle_root = InsecureRand256();
+ if (i) merkle_root = m_rng.rand256();
auto tweaked = pubkey.CreateTapTweak(i ? &merkle_root : nullptr);
BOOST_CHECK(tweaked);
XOnlyPubKey tweaked_key = tweaked->first;
- aux256 = InsecureRand256();
+ aux256 = m_rng.rand256();
bool ok = key.SignSchnorr(msg256, sig64, &merkle_root, aux256);
BOOST_CHECK(ok);
BOOST_CHECK(tweaked_key.VerifySchnorr(msg256, sig64));
+
+ // Repeat the same check, but use the KeyPair class directly
+ KeyPair keypair = key.ComputeKeyPair(&merkle_root);
+ bool kp_ok = keypair.SignSchnorr(msg256, sig64, aux256);
+ BOOST_CHECK(kp_ok);
+ BOOST_CHECK(tweaked_key.VerifySchnorr(msg256, sig64));
}
}
}
@@ -322,7 +340,7 @@ BOOST_AUTO_TEST_CASE(key_ellswift)
CKey key = DecodeSecret(secret);
BOOST_CHECK(key.IsValid());
- uint256 ent32 = InsecureRand256();
+ uint256 ent32 = m_rng.rand256();
auto ellswift = key.EllSwiftCreate(AsBytes(Span{ent32}));
CPubKey decoded_pubkey = ellswift.Decode();
@@ -338,11 +356,38 @@ BOOST_AUTO_TEST_CASE(key_ellswift)
BOOST_AUTO_TEST_CASE(bip341_test_h)
{
- std::vector<unsigned char> G_uncompressed = ParseHex("0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8");
+ constexpr auto G_uncompressed{"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"_hex};
HashWriter hw;
- hw.write(MakeByteSpan(G_uncompressed));
+ hw.write(G_uncompressed);
XOnlyPubKey H{hw.GetSHA256()};
BOOST_CHECK(XOnlyPubKey::NUMS_H == H);
}
+BOOST_AUTO_TEST_CASE(key_schnorr_tweak_smoke_test)
+{
+ // Sanity check to ensure we get the same tweak using CPubKey vs secp256k1 functions
+ secp256k1_context* secp256k1_context_sign = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
+
+ CKey key;
+ key.MakeNewKey(true);
+ uint256 merkle_root = m_rng.rand256();
+
+ // secp256k1 functions
+ secp256k1_keypair keypair;
+ BOOST_CHECK(secp256k1_keypair_create(secp256k1_context_sign, &keypair, UCharCast(key.begin())));
+ secp256k1_xonly_pubkey xonly_pubkey;
+ BOOST_CHECK(secp256k1_keypair_xonly_pub(secp256k1_context_sign, &xonly_pubkey, nullptr, &keypair));
+ unsigned char xonly_bytes[32];
+ BOOST_CHECK(secp256k1_xonly_pubkey_serialize(secp256k1_context_sign, xonly_bytes, &xonly_pubkey));
+ uint256 tweak_old = XOnlyPubKey(xonly_bytes).ComputeTapTweakHash(&merkle_root);
+
+ // CPubKey
+ CPubKey pubkey = key.GetPubKey();
+ uint256 tweak_new = XOnlyPubKey(pubkey).ComputeTapTweakHash(&merkle_root);
+
+ BOOST_CHECK_EQUAL(tweak_old, tweak_new);
+
+ secp256k1_context_destroy(secp256k1_context_sign);
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/logging_tests.cpp b/src/test/logging_tests.cpp
index cebd000df8..77ec81e597 100644
--- a/src/test/logging_tests.cpp
+++ b/src/test/logging_tests.cpp
@@ -83,15 +83,15 @@ BOOST_AUTO_TEST_CASE(logging_timer)
BOOST_CHECK_EQUAL(micro_timer.LogMsg("msg").substr(0, result_prefix.size()), result_prefix);
}
-BOOST_FIXTURE_TEST_CASE(logging_LogPrintf_, LogSetup)
+BOOST_FIXTURE_TEST_CASE(logging_LogPrintStr, 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::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");
+ LogInstance().LogPrintStr("foo1: bar1", "fn1", "src1", 1, BCLog::LogFlags::NET, BCLog::Level::Debug);
+ LogInstance().LogPrintStr("foo2: bar2", "fn2", "src2", 2, BCLog::LogFlags::NET, BCLog::Level::Info);
+ LogInstance().LogPrintStr("foo3: bar3", "fn3", "src3", 3, BCLog::LogFlags::ALL, BCLog::Level::Debug);
+ LogInstance().LogPrintStr("foo4: bar4", "fn4", "src4", 4, BCLog::LogFlags::ALL, BCLog::Level::Info);
+ LogInstance().LogPrintStr("foo5: bar5", "fn5", "src5", 5, BCLog::LogFlags::NONE, BCLog::Level::Debug);
+ LogInstance().LogPrintStr("foo6: bar6", "fn6", "src6", 6, BCLog::LogFlags::NONE, BCLog::Level::Info);
std::ifstream file{tmp_log_path};
std::vector<std::string> log_lines;
for (std::string log; std::getline(file, log);) {
@@ -111,13 +111,11 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintf_, 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");
LogPrintLevel(BCLog::NET, BCLog::Level::Error, "foo10: %s\n", "bar10");
- LogPrintfCategory(BCLog::VALIDATION, "foo11: %s\n", "bar11");
std::ifstream file{tmp_log_path};
std::vector<std::string> log_lines;
for (std::string log; std::getline(file, log);) {
@@ -125,23 +123,21 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacrosDeprecated, LogSetup)
}
std::vector<std::string> expected = {
"foo5: bar5",
- "[net] foo6: bar6",
"[net] foo7: bar7",
"[net:info] foo8: bar8",
"[net:warning] foo9: bar9",
"[net:error] foo10: bar10",
- "[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");
+ LogTrace(BCLog::NET, "foo6: %s", "bar6"); // not logged
+ LogDebug(BCLog::NET, "foo7: %s", "bar7");
+ LogInfo("foo8: %s", "bar8");
+ LogWarning("foo9: %s", "bar9");
+ LogError("foo10: %s", "bar10");
std::ifstream file{tmp_log_path};
std::vector<std::string> log_lines;
for (std::string log; std::getline(file, log);) {
@@ -171,7 +167,7 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacros_CategoryName, LogSetup)
std::vector<std::string> expected;
for (const auto& [category, name] : expected_category_names) {
- LogPrint(category, "foo: %s\n", "bar");
+ LogDebug(category, "foo: %s\n", "bar");
std::string expected_log = "[";
expected_log += name;
expected_log += "] foo: bar";
diff --git a/src/test/merkle_tests.cpp b/src/test/merkle_tests.cpp
index 66f7be3c4e..70308cb29a 100644
--- a/src/test/merkle_tests.cpp
+++ b/src/test/merkle_tests.cpp
@@ -184,7 +184,7 @@ BOOST_AUTO_TEST_CASE(merkle_test)
{
for (int i = 0; i < 32; i++) {
// Try 32 block sizes: all sizes from 0 to 16 inclusive, and then 15 random sizes.
- int ntx = (i <= 16) ? i : 17 + (InsecureRandRange(4000));
+ int ntx = (i <= 16) ? i : 17 + (m_rng.randrange(4000));
// Try up to 3 mutations.
for (int mutate = 0; mutate <= 3; mutate++) {
int duplicate1 = mutate >= 1 ? 1 << ctz(ntx) : 0; // The last how many transactions to duplicate first.
@@ -237,7 +237,7 @@ BOOST_AUTO_TEST_CASE(merkle_test)
// If ntx <= 16, try all branches. Otherwise, try 16 random ones.
int mtx = loop;
if (ntx > 16) {
- mtx = InsecureRandRange(ntx);
+ mtx = m_rng.randrange(ntx);
}
std::vector<uint256> newBranch = BlockMerkleBranch(block, mtx);
std::vector<uint256> oldBranch = BlockGetMerkleBranch(block, merkleTree, mtx);
diff --git a/src/test/merkleblock_tests.cpp b/src/test/merkleblock_tests.cpp
index 9c6008bdca..73dbe33714 100644
--- a/src/test/merkleblock_tests.cpp
+++ b/src/test/merkleblock_tests.cpp
@@ -24,10 +24,10 @@ BOOST_AUTO_TEST_CASE(merkleblock_construct_from_txids_found)
std::set<Txid> txids;
// Last txn in block.
- Txid txhash1{TxidFromString("0x74d681e0e03bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20")};
+ Txid txhash1{Txid::FromHex("74d681e0e03bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20").value()};
// Second txn in block.
- Txid txhash2{TxidFromString("0xf9fc751cb7dc372406a9f8d738d5e6f8f63bab71986a39cf36ee70ee17036d07")};
+ Txid txhash2{Txid::FromHex("f9fc751cb7dc372406a9f8d738d5e6f8f63bab71986a39cf36ee70ee17036d07").value()};
txids.insert(txhash1);
txids.insert(txhash2);
@@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(merkleblock_construct_from_txids_not_found)
CBlock block = getBlock13b8a();
std::set<Txid> txids2;
- txids2.insert(TxidFromString("0xc0ffee00003bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20"));
+ txids2.insert(Txid::FromHex("c0ffee00003bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20").value());
CMerkleBlock merkleBlock(block, txids2);
BOOST_CHECK_EQUAL(merkleBlock.header.GetHash().GetHex(), block.GetHash().GetHex());
diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp
index c4cf6f8a40..6cf2757b2d 100644
--- a/src/test/miner_tests.cpp
+++ b/src/test/miner_tests.cpp
@@ -27,6 +27,7 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
using node::BlockAssembler;
using node::CBlockTemplate;
@@ -367,7 +368,7 @@ void MinerTestingSetup::TestBasicMining(const CScript& scriptPubKey, const std::
while (m_node.chainman->ActiveChain().Tip()->nHeight < 209999) {
CBlockIndex* prev = m_node.chainman->ActiveChain().Tip();
CBlockIndex* next = new CBlockIndex();
- next->phashBlock = new uint256(InsecureRand256());
+ next->phashBlock = new uint256(m_rng.rand256());
m_node.chainman->ActiveChainstate().CoinsTip().SetBestBlock(next->GetBlockHash());
next->pprev = prev;
next->nHeight = prev->nHeight + 1;
@@ -379,7 +380,7 @@ void MinerTestingSetup::TestBasicMining(const CScript& scriptPubKey, const std::
while (m_node.chainman->ActiveChain().Tip()->nHeight < 210000) {
CBlockIndex* prev = m_node.chainman->ActiveChain().Tip();
CBlockIndex* next = new CBlockIndex();
- next->phashBlock = new uint256(InsecureRand256());
+ next->phashBlock = new uint256(m_rng.rand256());
m_node.chainman->ActiveChainstate().CoinsTip().SetBestBlock(next->GetBlockHash());
next->pprev = prev;
next->nHeight = prev->nHeight + 1;
@@ -607,7 +608,7 @@ void MinerTestingSetup::TestPrioritisedMining(const CScript& scriptPubKey, const
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
{
// Note that by default, these tests run with size accounting enabled.
- CScript scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
+ CScript scriptPubKey = CScript() << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex << OP_CHECKSIG;
std::unique_ptr<CBlockTemplate> pblocktemplate;
CTxMemPool& tx_mempool{*m_node.mempool};
diff --git a/src/test/miniscript_tests.cpp b/src/test/miniscript_tests.cpp
index 7e39e9e4de..ba3507d49d 100644
--- a/src/test/miniscript_tests.cpp
+++ b/src/test/miniscript_tests.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.
-#include <stdint.h>
-#include <string>
-#include <vector>
-
#include <test/util/random.h>
#include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp>
@@ -22,6 +18,13 @@
#include <script/script_error.h>
#include <script/signingprovider.h>
+#include <algorithm>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+using namespace util::hex_literals;
+
namespace {
/** TestData groups various kinds of precomputed data necessary in this test. */
@@ -48,9 +51,9 @@ struct TestData {
TestData()
{
// All our signatures sign (and are required to sign) this constant message.
- auto const MESSAGE_HASH = uint256S("f5cd94e18b6fe77dd7aca9e35c2b0c9cbd86356c80a71065");
+ constexpr uint256 MESSAGE_HASH{"0000000000000000f5cd94e18b6fe77dd7aca9e35c2b0c9cbd86356c80a71065"};
// We don't pass additional randomness when creating a schnorr signature.
- auto const EMPTY_AUX{uint256S("")};
+ const auto EMPTY_AUX{uint256::ZERO};
// We generate 255 public keys and 255 hashes of each type.
for (int i = 1; i <= 255; ++i) {
@@ -274,7 +277,7 @@ public:
XOnlyPubKey pk{pubkey};
auto it = g_testdata->schnorr_signatures.find(pk);
if (it == g_testdata->schnorr_signatures.end()) return false;
- return sig == it->second;
+ return std::ranges::equal(sig, it->second);
}
bool CheckLockTime(const CScriptNum& locktime) const override {
@@ -340,13 +343,14 @@ void SatisfactionToWitness(miniscript::MiniscriptContext ctx, CScriptWitness& wi
witness.stack.push_back(*builder.GetSpendData().scripts.begin()->second.begin());
}
+struct MiniScriptTest : BasicTestingSetup {
/** Run random satisfaction tests. */
void TestSatisfy(const KeyConverter& converter, const std::string& testcase, const NodeRef& node) {
auto script = node->ToScript(converter);
auto challenges = FindChallenges(node); // Find all challenges in the generated miniscript.
std::vector<Challenge> challist(challenges.begin(), challenges.end());
for (int iter = 0; iter < 3; ++iter) {
- Shuffle(challist.begin(), challist.end(), g_insecure_rand_ctx);
+ std::shuffle(challist.begin(), challist.end(), m_rng);
Satisfier satisfier(converter.MsContext());
TestSignatureChecker checker(satisfier);
bool prev_mal_success = false, prev_nonmal_success = false;
@@ -488,10 +492,11 @@ void Test(const std::string& ms, const std::string& hexscript, const std::string
/*opslimit=*/-1, /*stacklimit=*/-1,
/*max_wit_size=*/std::nullopt, /*max_tap_wit_size=*/std::nullopt, /*stack_exec=*/std::nullopt);
}
+}; // struct MiniScriptTest
} // namespace
-BOOST_FIXTURE_TEST_SUITE(miniscript_tests, BasicTestingSetup)
+BOOST_FIXTURE_TEST_SUITE(miniscript_tests, MiniScriptTest)
BOOST_AUTO_TEST_CASE(fixed_tests)
{
@@ -593,11 +598,11 @@ BOOST_AUTO_TEST_CASE(fixed_tests)
// - no pubkey before the CHECKSIG
constexpr KeyConverter tap_converter{miniscript::MiniscriptContext::TAPSCRIPT};
constexpr KeyConverter wsh_converter{miniscript::MiniscriptContext::P2WSH};
- const auto no_pubkey{ParseHex("ac519c")};
+ const auto no_pubkey{"ac519c"_hex_u8};
BOOST_CHECK(miniscript::FromScript({no_pubkey.begin(), no_pubkey.end()}, tap_converter) == nullptr);
- const auto incomplete_multi_a{ParseHex("ba20c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5ba519c")};
+ const auto incomplete_multi_a{"ba20c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5ba519c"_hex_u8};
BOOST_CHECK(miniscript::FromScript({incomplete_multi_a.begin(), incomplete_multi_a.end()}, tap_converter) == nullptr);
- const auto incomplete_multi_a_2{ParseHex("ac2079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac20c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5ba519c")};
+ const auto incomplete_multi_a_2{"ac2079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac20c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5ba519c"_hex_u8};
BOOST_CHECK(miniscript::FromScript({incomplete_multi_a_2.begin(), incomplete_multi_a_2.end()}, tap_converter) == nullptr);
// Can use multi_a under Tapscript but not P2WSH.
Test("and_v(v:multi_a(2,03d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85a,025601570cb47f238d2b0286db4a990fa0f3ba28d1a319f5e7cf55c2a2444da7cc),after(1231488000))", "?", "20d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85aac205601570cb47f238d2b0286db4a990fa0f3ba28d1a319f5e7cf55c2a2444da7ccba529d0400046749b1", TESTMODE_VALID | TESTMODE_NONMAL | TESTMODE_NEEDSIG | TESTMODE_P2WSH_INVALID, 4, 2, {}, {}, 3);
@@ -642,12 +647,12 @@ BOOST_AUTO_TEST_CASE(fixed_tests)
// Misc unit tests
// A Script with a non minimal push is invalid
- std::vector<unsigned char> nonminpush = ParseHex("0000210232780000feff00ffffffffffff21ff005f00ae21ae00000000060602060406564c2102320000060900fe00005f00ae21ae00100000060606060606000000000000000000000000000000000000000000000000000000000000000000");
+ constexpr auto nonminpush{"0000210232780000feff00ffffffffffff21ff005f00ae21ae00000000060602060406564c2102320000060900fe00005f00ae21ae00100000060606060606000000000000000000000000000000000000000000000000000000000000000000"_hex_u8};
const CScript nonminpush_script(nonminpush.begin(), nonminpush.end());
BOOST_CHECK(miniscript::FromScript(nonminpush_script, wsh_converter) == nullptr);
BOOST_CHECK(miniscript::FromScript(nonminpush_script, tap_converter) == nullptr);
// A non-minimal VERIFY (<key> CHECKSIG VERIFY 1)
- std::vector<unsigned char> nonminverify = ParseHex("2103a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7ac6951");
+ constexpr auto nonminverify{"2103a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7ac6951"_hex_u8};
const CScript nonminverify_script(nonminverify.begin(), nonminverify.end());
BOOST_CHECK(miniscript::FromScript(nonminverify_script, wsh_converter) == nullptr);
BOOST_CHECK(miniscript::FromScript(nonminverify_script, tap_converter) == nullptr);
@@ -699,6 +704,12 @@ BOOST_AUTO_TEST_CASE(fixed_tests)
const auto insane_sub = ms_ins->FindInsaneSub();
BOOST_CHECK(insane_sub && *insane_sub->ToString(wsh_converter) == "and_b(after(1),a:after(1000000000))");
+ // Numbers can't be prefixed by a sign.
+ BOOST_CHECK(!miniscript::FromString("after(-1)", wsh_converter));
+ BOOST_CHECK(!miniscript::FromString("after(+1)", wsh_converter));
+ BOOST_CHECK(!miniscript::FromString("thresh(-1,pk(03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204))", wsh_converter));
+ BOOST_CHECK(!miniscript::FromString("multi(+1,03cdabb7f2dce7bfbd8a0b9570c6fd1e712e5d64045e9d6b517b3d5072251dc204)", wsh_converter));
+
// Timelock tests
Test("after(100)", "?", "?", TESTMODE_VALID | TESTMODE_NONMAL); // only heightlock
Test("after(1000000000)", "?", "?", TESTMODE_VALID | TESTMODE_NONMAL); // only timelock
diff --git a/src/test/minisketch_tests.cpp b/src/test/minisketch_tests.cpp
index 10506da783..3d2a835113 100644
--- a/src/test/minisketch_tests.cpp
+++ b/src/test/minisketch_tests.cpp
@@ -14,16 +14,16 @@
using node::MakeMinisketch32;
-BOOST_AUTO_TEST_SUITE(minisketch_tests)
+BOOST_FIXTURE_TEST_SUITE(minisketch_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(minisketch_test)
{
for (int i = 0; i < 100; ++i) {
- uint32_t errors = 0 + InsecureRandRange(11);
- uint32_t start_a = 1 + InsecureRandRange(1000000000);
- uint32_t a_not_b = InsecureRandRange(errors + 1);
+ uint32_t errors = 0 + m_rng.randrange(11);
+ uint32_t start_a = 1 + m_rng.randrange(1000000000);
+ uint32_t a_not_b = m_rng.randrange(errors + 1);
uint32_t b_not_a = errors - a_not_b;
- uint32_t both = InsecureRandRange(10000);
+ uint32_t both = m_rng.randrange(10000);
uint32_t end_a = start_a + a_not_b + both;
uint32_t start_b = start_a + a_not_b;
uint32_t end_b = start_b + both + b_not_a;
diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp
index 7a3e8e3a47..29a73d03d2 100644
--- a/src/test/multisig_tests.cpp
+++ b/src/test/multisig_tests.cpp
@@ -10,6 +10,7 @@
#include <script/sign.h>
#include <script/signingprovider.h>
#include <test/util/setup_common.h>
+#include <test/util/transaction_utils.h>
#include <tinyformat.h>
#include <uint256.h>
diff --git a/src/test/net_peer_connection_tests.cpp b/src/test/net_peer_connection_tests.cpp
index 5f38ce112c..e60ce8b99d 100644
--- a/src/test/net_peer_connection_tests.cpp
+++ b/src/test/net_peer_connection_tests.cpp
@@ -31,7 +31,7 @@
struct LogIPsTestingSetup : public TestingSetup {
LogIPsTestingSetup()
- : TestingSetup{ChainType::MAIN, /*extra_args=*/{"-logips"}} {}
+ : TestingSetup{ChainType::MAIN, {.extra_args = {"-logips"}}} {}
};
BOOST_FIXTURE_TEST_SUITE(net_peer_connection_tests, LogIPsTestingSetup)
@@ -43,20 +43,21 @@ static CService ip(uint32_t i)
return CService{CNetAddr{s}, Params().GetDefaultPort()};
}
+struct PeerTest : LogIPsTestingSetup {
/** Create a peer and connect to it. If the optional `address` (IP/CJDNS only) isn't passed, a random address is created. */
-static void AddPeer(NodeId& id, std::vector<CNode*>& nodes, PeerManager& peerman, ConnmanTestMsg& connman, ConnectionType conn_type, bool onion_peer = false, std::optional<std::string> address = std::nullopt)
+void AddPeer(NodeId& id, std::vector<CNode*>& nodes, PeerManager& peerman, ConnmanTestMsg& connman, ConnectionType conn_type, bool onion_peer = false, std::optional<std::string> address = std::nullopt)
{
CAddress addr{};
if (address.has_value()) {
addr = CAddress{MaybeFlipIPv6toCJDNS(LookupNumeric(address.value(), Params().GetDefaultPort())), NODE_NONE};
} else if (onion_peer) {
- auto tor_addr{g_insecure_rand_ctx.randbytes(ADDR_TORV3_SIZE)};
+ auto tor_addr{m_rng.randbytes(ADDR_TORV3_SIZE)};
BOOST_REQUIRE(addr.SetSpecial(OnionToString(tor_addr)));
}
while (!addr.IsLocal() && !addr.IsRoutable()) {
- addr = CAddress{ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE};
+ addr = CAddress{ip(m_rng.randbits(32)), NODE_NONE};
}
BOOST_REQUIRE(addr.IsValid());
@@ -80,8 +81,9 @@ static void AddPeer(NodeId& id, std::vector<CNode*>& nodes, PeerManager& peerman
connman.AddTestNode(node);
}
+}; // struct PeerTest
-BOOST_AUTO_TEST_CASE(test_addnode_getaddednodeinfo_and_connection_detection)
+BOOST_FIXTURE_TEST_CASE(test_addnode_getaddednodeinfo_and_connection_detection, PeerTest)
{
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman, Params());
auto peerman = PeerManager::make(*connman, *m_node.addrman, nullptr, *m_node.chainman, *m_node.mempool, *m_node.warnings, {});
diff --git a/src/test/net_peer_eviction_tests.cpp b/src/test/net_peer_eviction_tests.cpp
index 51d6c4384a..d9e1c2332e 100644
--- a/src/test/net_peer_eviction_tests.cpp
+++ b/src/test/net_peer_eviction_tests.cpp
@@ -31,7 +31,7 @@ bool IsProtected(int num_peers,
for (NodeEvictionCandidate& candidate : candidates) {
candidate_setup_fn(candidate);
}
- Shuffle(candidates.begin(), candidates.end(), random_context);
+ std::shuffle(candidates.begin(), candidates.end(), random_context);
const size_t size{candidates.size()};
const size_t expected{size - size / 2}; // Expect half the candidates will be protected.
@@ -572,7 +572,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// Returns true if any of the node ids in node_ids are selected for eviction.
bool IsEvicted(std::vector<NodeEvictionCandidate> candidates, const std::unordered_set<NodeId>& node_ids, FastRandomContext& random_context)
{
- Shuffle(candidates.begin(), candidates.end(), random_context);
+ std::shuffle(candidates.begin(), candidates.end(), random_context);
const std::optional<NodeId> evicted_node_id = SelectNodeToEvict(std::move(candidates));
if (!evicted_node_id) {
return false;
diff --git a/src/test/net_tests.cpp b/src/test/net_tests.cpp
index 46a6a33b34..4c72d03ab1 100644
--- a/src/test/net_tests.cpp
+++ b/src/test/net_tests.cpp
@@ -32,6 +32,7 @@
#include <string>
using namespace std::literals;
+using namespace util::hex_literals;
using util::ToString;
BOOST_FIXTURE_TEST_SUITE(net_tests, RegTestingSetup)
@@ -400,9 +401,9 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
const auto ser_params{CAddress::V2_NETWORK};
// Valid IPv4.
- s << Span{ParseHex("01" // network type (IPv4)
- "04" // address length
- "01020304")}; // address
+ s << "01" // network type (IPv4)
+ "04" // address length
+ "01020304"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsIPv4());
@@ -411,35 +412,35 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid IPv4, valid length but address itself is shorter.
- s << Span{ParseHex("01" // network type (IPv4)
- "04" // address length
- "0102")}; // address
+ s << "01" // network type (IPv4)
+ "04" // address length
+ "0102"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure, HasReason("end of data"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Invalid IPv4, with bogus length.
- s << Span{ParseHex("01" // network type (IPv4)
- "05" // address length
- "01020304")}; // address
+ s << "01" // network type (IPv4)
+ "05" // address length
+ "01020304"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 IPv4 address with length 5 (should be 4)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Invalid IPv4, with extreme length.
- s << Span{ParseHex("01" // network type (IPv4)
- "fd0102" // address length (513 as CompactSize)
- "01020304")}; // address
+ s << "01" // network type (IPv4)
+ "fd0102" // address length (513 as CompactSize)
+ "01020304"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("Address too long: 513 > 512"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Valid IPv6.
- s << Span{ParseHex("02" // network type (IPv6)
- "10" // address length
- "0102030405060708090a0b0c0d0e0f10")}; // address
+ s << "02" // network type (IPv6)
+ "10" // address length
+ "0102030405060708090a0b0c0d0e0f10"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsIPv6());
@@ -448,11 +449,10 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Valid IPv6, contains embedded "internal".
- s << Span{ParseHex(
- "02" // network type (IPv6)
- "10" // address length
- "fd6b88c08724ca978112ca1bbdcafac2")}; // address: 0xfd + sha256("bitcoin")[0:5] +
- // sha256(name)[0:10]
+ s << "02" // network type (IPv6)
+ "10" // address length
+ "fd6b88c08724ca978112ca1bbdcafac2"_hex; // address: 0xfd + sha256("bitcoin")[0:5] +
+ // sha256(name)[0:10]
s >> ser_params(addr);
BOOST_CHECK(addr.IsInternal());
BOOST_CHECK(addr.IsAddrV1Compatible());
@@ -460,44 +460,43 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid IPv6, with bogus length.
- s << Span{ParseHex("02" // network type (IPv6)
- "04" // address length
- "00")}; // address
+ s << "02" // network type (IPv6)
+ "04" // address length
+ "00"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 IPv6 address with length 4 (should be 16)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Invalid IPv6, contains embedded IPv4.
- s << Span{ParseHex("02" // network type (IPv6)
- "10" // address length
- "00000000000000000000ffff01020304")}; // address
+ s << "02" // network type (IPv6)
+ "10" // address length
+ "00000000000000000000ffff01020304"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// Invalid IPv6, contains embedded TORv2.
- s << Span{ParseHex("02" // network type (IPv6)
- "10" // address length
- "fd87d87eeb430102030405060708090a")}; // address
+ s << "02" // network type (IPv6)
+ "10" // address length
+ "fd87d87eeb430102030405060708090a"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// TORv2, no longer supported.
- s << Span{ParseHex("03" // network type (TORv2)
- "0a" // address length
- "f1f2f3f4f5f6f7f8f9fa")}; // address
+ s << "03" // network type (TORv2)
+ "0a" // address length
+ "f1f2f3f4f5f6f7f8f9fa"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// Valid TORv3.
- s << Span{ParseHex("04" // network type (TORv3)
- "20" // address length
- "79bcc625184b05194975c28b66b66b04" // address
- "69f7f6556fb1ac3189a79b40dda32f1f"
- )};
+ s << "04" // network type (TORv3)
+ "20" // address length
+ "79bcc625184b05194975c28b66b66b04" // address
+ "69f7f6556fb1ac3189a79b40dda32f1f"_hex;
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsTor());
@@ -507,20 +506,19 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid TORv3, with bogus length.
- s << Span{ParseHex("04" // network type (TORv3)
- "00" // address length
- "00" // address
- )};
+ s << "04" // network type (TORv3)
+ "00" // address length
+ "00"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 TORv3 address with length 0 (should be 32)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Valid I2P.
- s << Span{ParseHex("05" // network type (I2P)
- "20" // address length
- "a2894dabaec08c0051a481a6dac88b64" // address
- "f98232ae42d4b6fd2fa81952dfe36a87")};
+ s << "05" // network type (I2P)
+ "20" // address length
+ "a2894dabaec08c0051a481a6dac88b64" // address
+ "f98232ae42d4b6fd2fa81952dfe36a87"_hex;
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsI2P());
@@ -530,20 +528,18 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid I2P, with bogus length.
- s << Span{ParseHex("05" // network type (I2P)
- "03" // address length
- "00" // address
- )};
+ s << "05" // network type (I2P)
+ "03" // address length
+ "00"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 I2P address with length 3 (should be 32)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Valid CJDNS.
- s << Span{ParseHex("06" // network type (CJDNS)
- "10" // address length
- "fc000001000200030004000500060007" // address
- )};
+ s << "06" // network type (CJDNS)
+ "10" // address length
+ "fc000001000200030004000500060007"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(addr.IsValid());
BOOST_CHECK(addr.IsCJDNS());
@@ -552,49 +548,44 @@ BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2)
BOOST_REQUIRE(s.empty());
// Invalid CJDNS, wrong prefix.
- s << Span{ParseHex("06" // network type (CJDNS)
- "10" // address length
- "aa000001000200030004000500060007" // address
- )};
+ s << "06" // network type (CJDNS)
+ "10" // address length
+ "aa000001000200030004000500060007"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(addr.IsCJDNS());
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// Invalid CJDNS, with bogus length.
- s << Span{ParseHex("06" // network type (CJDNS)
- "01" // address length
- "00" // address
- )};
+ s << "06" // network type (CJDNS)
+ "01" // address length
+ "00"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("BIP155 CJDNS address with length 1 (should be 16)"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Unknown, with extreme length.
- s << Span{ParseHex("aa" // network type (unknown)
- "fe00000002" // address length (CompactSize's MAX_SIZE)
- "01020304050607" // address
- )};
+ s << "aa" // network type (unknown)
+ "fe00000002" // address length (CompactSize's MAX_SIZE)
+ "01020304050607"_hex; // address
BOOST_CHECK_EXCEPTION(s >> ser_params(addr), std::ios_base::failure,
HasReason("Address too long: 33554432 > 512"));
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input.
s.clear();
// Unknown, with reasonable length.
- s << Span{ParseHex("aa" // network type (unknown)
- "04" // address length
- "01020304" // address
- )};
+ s << "aa" // network type (unknown)
+ "04" // address length
+ "01020304"_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
// Unknown, with zero length.
- s << Span{ParseHex("aa" // network type (unknown)
- "00" // address length
- "" // address
- )};
+ s << "aa" // network type (unknown)
+ "00" // address length
+ ""_hex; // address
s >> ser_params(addr);
BOOST_CHECK(!addr.IsValid());
BOOST_REQUIRE(s.empty());
@@ -1011,10 +1002,10 @@ BOOST_AUTO_TEST_CASE(advertise_local_address)
namespace {
-CKey GenerateRandomTestKey() noexcept
+CKey GenerateRandomTestKey(FastRandomContext& rng) noexcept
{
CKey key;
- uint256 key_data = InsecureRand256();
+ uint256 key_data = rng.rand256();
key.Set(key_data.begin(), key_data.end(), true);
return key;
}
@@ -1029,6 +1020,7 @@ CKey GenerateRandomTestKey() noexcept
*/
class V2TransportTester
{
+ FastRandomContext& m_rng;
V2Transport m_transport; //!< V2Transport being tested
BIP324Cipher m_cipher; //!< Cipher to help with the other side
bool m_test_initiator; //!< Whether m_transport is the initiator (true) or responder (false)
@@ -1042,9 +1034,10 @@ class V2TransportTester
public:
/** Construct a tester object. test_initiator: whether the tested transport is initiator. */
- explicit V2TransportTester(bool test_initiator)
- : m_transport{0, test_initiator},
- m_cipher{GenerateRandomTestKey(), MakeByteSpan(InsecureRand256())},
+ explicit V2TransportTester(FastRandomContext& rng, bool test_initiator)
+ : m_rng{rng},
+ m_transport{0, test_initiator},
+ m_cipher{GenerateRandomTestKey(m_rng), MakeByteSpan(m_rng.rand256())},
m_test_initiator(test_initiator) {}
/** Data type returned by Interact:
@@ -1068,7 +1061,7 @@ public:
bool progress{false};
// Send bytes from m_to_send to the transport.
if (!m_to_send.empty()) {
- Span<const uint8_t> to_send = Span{m_to_send}.first(1 + InsecureRandRange(m_to_send.size()));
+ Span<const uint8_t> to_send = Span{m_to_send}.first(1 + m_rng.randrange(m_to_send.size()));
size_t old_len = to_send.size();
if (!m_transport.ReceivedBytes(to_send)) {
return std::nullopt; // transport error occurred
@@ -1079,7 +1072,7 @@ public:
}
}
// Retrieve messages received by the transport.
- if (m_transport.ReceivedMessageComplete() && (!progress || InsecureRandBool())) {
+ if (m_transport.ReceivedMessageComplete() && (!progress || m_rng.randbool())) {
bool reject{false};
auto msg = m_transport.GetReceivedMessage({}, reject);
if (reject) {
@@ -1090,7 +1083,7 @@ public:
progress = true;
}
// Enqueue a message to be sent by the transport to us.
- if (!m_msg_to_send.empty() && (!progress || InsecureRandBool())) {
+ if (!m_msg_to_send.empty() && (!progress || m_rng.randbool())) {
if (m_transport.SetMessageToSend(m_msg_to_send.front())) {
m_msg_to_send.pop_front();
progress = true;
@@ -1098,8 +1091,8 @@ public:
}
// Receive bytes from the transport.
const auto& [recv_bytes, _more, _msg_type] = m_transport.GetBytesToSend(!m_msg_to_send.empty());
- if (!recv_bytes.empty() && (!progress || InsecureRandBool())) {
- size_t to_receive = 1 + InsecureRandRange(recv_bytes.size());
+ if (!recv_bytes.empty() && (!progress || m_rng.randbool())) {
+ size_t to_receive = 1 + m_rng.randrange(recv_bytes.size());
m_received.insert(m_received.end(), recv_bytes.begin(), recv_bytes.begin() + to_receive);
progress = true;
m_transport.MarkBytesSent(to_receive);
@@ -1121,7 +1114,7 @@ public:
/** Send V1 version message header to the transport. */
void SendV1Version(const MessageStartChars& magic)
{
- CMessageHeader hdr(magic, "version", 126 + InsecureRandRange(11));
+ CMessageHeader hdr(magic, "version", 126 + m_rng.randrange(11));
DataStream ser{};
ser << hdr;
m_to_send.insert(m_to_send.end(), UCharCast(ser.data()), UCharCast(ser.data() + ser.size()));
@@ -1146,13 +1139,13 @@ public:
void SendGarbage(size_t garbage_len)
{
// Generate random garbage and send it.
- SendGarbage(g_insecure_rand_ctx.randbytes<uint8_t>(garbage_len));
+ SendGarbage(m_rng.randbytes<uint8_t>(garbage_len));
}
/** Schedule garbage (with valid random length) to be sent to the transport. */
void SendGarbage()
{
- SendGarbage(InsecureRandRange(V2Transport::MAX_GARBAGE_LEN + 1));
+ SendGarbage(m_rng.randrange(V2Transport::MAX_GARBAGE_LEN + 1));
}
/** Schedule a message to be sent to us by the transport. */
@@ -1255,7 +1248,7 @@ public:
for (garblen = 0; garblen <= V2Transport::MAX_GARBAGE_LEN; ++garblen) {
BOOST_REQUIRE(m_received.size() >= garblen + BIP324Cipher::GARBAGE_TERMINATOR_LEN);
auto term_span = MakeByteSpan(Span{m_received}.subspan(garblen, BIP324Cipher::GARBAGE_TERMINATOR_LEN));
- if (term_span == m_cipher.GetReceiveGarbageTerminator()) break;
+ if (std::ranges::equal(term_span, m_cipher.GetReceiveGarbageTerminator())) break;
}
// Copy the garbage to a buffer.
m_recv_garbage.assign(m_received.begin(), m_received.begin() + garblen);
@@ -1280,7 +1273,7 @@ public:
auto ret = ReceivePacket();
BOOST_CHECK(ret.size() == payload.size() + 1);
BOOST_CHECK(ret[0] == short_id);
- BOOST_CHECK(Span{ret}.subspan(1) == payload);
+ BOOST_CHECK(std::ranges::equal(Span{ret}.subspan(1), payload));
}
/** Expect application packet to have been received, with specified 12-char message type and
@@ -1297,7 +1290,7 @@ public:
BOOST_CHECK(ret[1 + i] == 0);
}
}
- BOOST_CHECK(Span{ret}.subspan(1 + CMessageHeader::COMMAND_SIZE) == payload);
+ BOOST_CHECK(std::ranges::equal(Span{ret}.subspan(1 + CMessageHeader::COMMAND_SIZE), payload));
}
/** Schedule an encrypted packet with specified message type and payload to be sent to
@@ -1335,7 +1328,7 @@ public:
/** Introduce a bit error in the data scheduled to be sent. */
void Damage()
{
- m_to_send[InsecureRandRange(m_to_send.size())] ^= (uint8_t{1} << InsecureRandRange(8));
+ m_to_send[m_rng.randrange(m_to_send.size())] ^= (uint8_t{1} << m_rng.randrange(8));
}
};
@@ -1345,7 +1338,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
{
// A mostly normal scenario, testing a transport in initiator mode.
for (int i = 0; i < 10; ++i) {
- V2TransportTester tester(true);
+ V2TransportTester tester(m_rng, true);
auto ret = tester.Interact();
BOOST_REQUIRE(ret && ret->empty());
tester.SendKey();
@@ -1358,16 +1351,16 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveGarbage();
tester.ReceiveVersion();
tester.CompareSessionIDs();
- auto msg_data_1 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(100000));
- auto msg_data_2 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto msg_data_1 = m_rng.randbytes<uint8_t>(m_rng.randrange(100000));
+ auto msg_data_2 = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendMessage(uint8_t(4), msg_data_1); // cmpctblock short id
tester.SendMessage(0, {}); // Invalidly encoded message
tester.SendMessage("tx", msg_data_2); // 12-character encoded message type
ret = tester.Interact();
BOOST_REQUIRE(ret && ret->size() == 3);
- BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "cmpctblock" && Span{(*ret)[0]->m_recv} == MakeByteSpan(msg_data_1));
+ BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "cmpctblock" && std::ranges::equal((*ret)[0]->m_recv, MakeByteSpan(msg_data_1)));
BOOST_CHECK(!(*ret)[1]);
- BOOST_CHECK((*ret)[2] && (*ret)[2]->m_type == "tx" && Span{(*ret)[2]->m_recv} == MakeByteSpan(msg_data_2));
+ BOOST_CHECK((*ret)[2] && (*ret)[2]->m_type == "tx" && std::ranges::equal((*ret)[2]->m_recv, MakeByteSpan(msg_data_2)));
// Then send a message with a bit error, expecting failure. It's possible this failure does
// not occur immediately (when the length descriptor was modified), but it should come
@@ -1379,14 +1372,14 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
if (!ret) break; // failure
BOOST_CHECK(ret->size() == 0); // no message can be delivered
// Send another message.
- auto msg_data_3 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(10000));
+ auto msg_data_3 = m_rng.randbytes<uint8_t>(m_rng.randrange(10000));
tester.SendMessage(uint8_t(12), msg_data_3); // getheaders short id
}
}
// Normal scenario, with a transport in responder node.
for (int i = 0; i < 10; ++i) {
- V2TransportTester tester(false);
+ V2TransportTester tester(m_rng, false);
tester.SendKey();
tester.SendGarbage();
auto ret = tester.Interact();
@@ -1399,17 +1392,17 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveGarbage();
tester.ReceiveVersion();
tester.CompareSessionIDs();
- auto msg_data_1 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(100000));
- auto msg_data_2 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto msg_data_1 = m_rng.randbytes<uint8_t>(m_rng.randrange(100000));
+ auto msg_data_2 = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendMessage(uint8_t(14), msg_data_1); // inv short id
tester.SendMessage(uint8_t(19), msg_data_2); // pong short id
ret = tester.Interact();
BOOST_REQUIRE(ret && ret->size() == 2);
- BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "inv" && Span{(*ret)[0]->m_recv} == MakeByteSpan(msg_data_1));
- BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "pong" && Span{(*ret)[1]->m_recv} == MakeByteSpan(msg_data_2));
+ BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "inv" && std::ranges::equal((*ret)[0]->m_recv, MakeByteSpan(msg_data_1)));
+ BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "pong" && std::ranges::equal((*ret)[1]->m_recv, MakeByteSpan(msg_data_2)));
// Then send a too-large message.
- auto msg_data_3 = g_insecure_rand_ctx.randbytes<uint8_t>(4005000);
+ auto msg_data_3 = m_rng.randbytes<uint8_t>(4005000);
tester.SendMessage(uint8_t(11), msg_data_3); // getdata short id
ret = tester.Interact();
BOOST_CHECK(!ret);
@@ -1418,18 +1411,18 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Various valid but unusual scenarios.
for (int i = 0; i < 50; ++i) {
/** Whether an initiator or responder is being tested. */
- bool initiator = InsecureRandBool();
+ bool initiator = m_rng.randbool();
/** Use either 0 bytes or the maximum possible (4095 bytes) garbage length. */
- size_t garb_len = InsecureRandBool() ? 0 : V2Transport::MAX_GARBAGE_LEN;
+ size_t garb_len = m_rng.randbool() ? 0 : V2Transport::MAX_GARBAGE_LEN;
/** How many decoy packets to send before the version packet. */
- unsigned num_ignore_version = InsecureRandRange(10);
+ unsigned num_ignore_version = m_rng.randrange(10);
/** What data to send in the version packet (ignored by BIP324 peers, but reserved for future extensions). */
- auto ver_data = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandBool() ? 0 : InsecureRandRange(1000));
+ auto ver_data = m_rng.randbytes<uint8_t>(m_rng.randbool() ? 0 : m_rng.randrange(1000));
/** Whether to immediately send key and garbage out (required for responders, optional otherwise). */
- bool send_immediately = !initiator || InsecureRandBool();
+ bool send_immediately = !initiator || m_rng.randbool();
/** How many decoy packets to send before the first and second real message. */
- unsigned num_decoys_1 = InsecureRandRange(1000), num_decoys_2 = InsecureRandRange(1000);
- V2TransportTester tester(initiator);
+ unsigned num_decoys_1 = m_rng.randrange(1000), num_decoys_2 = m_rng.randrange(1000);
+ V2TransportTester tester(m_rng, initiator);
if (send_immediately) {
tester.SendKey();
tester.SendGarbage(garb_len);
@@ -1443,8 +1436,8 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveKey();
tester.SendGarbageTerm();
for (unsigned v = 0; v < num_ignore_version; ++v) {
- size_t ver_ign_data_len = InsecureRandBool() ? 0 : InsecureRandRange(1000);
- auto ver_ign_data = g_insecure_rand_ctx.randbytes<uint8_t>(ver_ign_data_len);
+ size_t ver_ign_data_len = m_rng.randbool() ? 0 : m_rng.randrange(1000);
+ auto ver_ign_data = m_rng.randbytes<uint8_t>(ver_ign_data_len);
tester.SendVersion(ver_ign_data, true);
}
tester.SendVersion(ver_data, false);
@@ -1454,16 +1447,16 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveVersion();
tester.CompareSessionIDs();
for (unsigned d = 0; d < num_decoys_1; ++d) {
- auto decoy_data = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto decoy_data = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendPacket(/*content=*/decoy_data, /*aad=*/{}, /*ignore=*/true);
}
- auto msg_data_1 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(4000000));
+ auto msg_data_1 = m_rng.randbytes<uint8_t>(m_rng.randrange(4000000));
tester.SendMessage(uint8_t(28), msg_data_1);
for (unsigned d = 0; d < num_decoys_2; ++d) {
- auto decoy_data = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto decoy_data = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendPacket(/*content=*/decoy_data, /*aad=*/{}, /*ignore=*/true);
}
- auto msg_data_2 = g_insecure_rand_ctx.randbytes<uint8_t>(InsecureRandRange(1000));
+ auto msg_data_2 = m_rng.randbytes<uint8_t>(m_rng.randrange(1000));
tester.SendMessage(uint8_t(13), msg_data_2); // headers short id
// Send invalidly-encoded message
tester.SendMessage(std::string("blocktxn\x00\x00\x00a", CMessageHeader::COMMAND_SIZE), {});
@@ -1471,8 +1464,8 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.AddMessage("barfoo", {}); // test sending unknown message type
ret = tester.Interact();
BOOST_REQUIRE(ret && ret->size() == 4);
- BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "addrv2" && Span{(*ret)[0]->m_recv} == MakeByteSpan(msg_data_1));
- BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "headers" && Span{(*ret)[1]->m_recv} == MakeByteSpan(msg_data_2));
+ BOOST_CHECK((*ret)[0] && (*ret)[0]->m_type == "addrv2" && std::ranges::equal((*ret)[0]->m_recv, MakeByteSpan(msg_data_1)));
+ BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "headers" && std::ranges::equal((*ret)[1]->m_recv, MakeByteSpan(msg_data_2)));
BOOST_CHECK(!(*ret)[2]);
BOOST_CHECK((*ret)[3] && (*ret)[3]->m_type == "foobar" && (*ret)[3]->m_recv.empty());
tester.ReceiveMessage("barfoo", {});
@@ -1480,7 +1473,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Too long garbage (initiator).
{
- V2TransportTester tester(true);
+ V2TransportTester tester(m_rng, true);
auto ret = tester.Interact();
BOOST_REQUIRE(ret && ret->empty());
tester.SendKey();
@@ -1493,7 +1486,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Too long garbage (responder).
{
- V2TransportTester tester(false);
+ V2TransportTester tester(m_rng, false);
tester.SendKey();
tester.SendGarbage(V2Transport::MAX_GARBAGE_LEN + 1);
auto ret = tester.Interact();
@@ -1506,23 +1499,23 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Send garbage that includes the first 15 garbage terminator bytes somewhere.
{
- V2TransportTester tester(true);
+ V2TransportTester tester(m_rng, true);
auto ret = tester.Interact();
BOOST_REQUIRE(ret && ret->empty());
tester.SendKey();
tester.ReceiveKey();
/** The number of random garbage bytes before the included first 15 bytes of terminator. */
- size_t len_before = InsecureRandRange(V2Transport::MAX_GARBAGE_LEN - 16 + 1);
+ size_t len_before = m_rng.randrange(V2Transport::MAX_GARBAGE_LEN - 16 + 1);
/** The number of random garbage bytes after it. */
- size_t len_after = InsecureRandRange(V2Transport::MAX_GARBAGE_LEN - 16 - len_before + 1);
+ size_t len_after = m_rng.randrange(V2Transport::MAX_GARBAGE_LEN - 16 - len_before + 1);
// Construct len_before + 16 + len_after random bytes.
- auto garbage = g_insecure_rand_ctx.randbytes<uint8_t>(len_before + 16 + len_after);
+ auto garbage = m_rng.randbytes<uint8_t>(len_before + 16 + len_after);
// Replace the designed 16 bytes in the middle with the to-be-sent garbage terminator.
auto garb_term = MakeUCharSpan(tester.GetCipher().GetSendGarbageTerminator());
std::copy(garb_term.begin(), garb_term.begin() + 16, garbage.begin() + len_before);
// Introduce a bit error in the last byte of that copied garbage terminator, making only
// the first 15 of them match.
- garbage[len_before + 15] ^= (uint8_t(1) << InsecureRandRange(8));
+ garbage[len_before + 15] ^= (uint8_t(1) << m_rng.randrange(8));
tester.SendGarbage(garbage);
tester.SendGarbageTerm();
tester.SendVersion();
@@ -1531,21 +1524,21 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
tester.ReceiveGarbage();
tester.ReceiveVersion();
tester.CompareSessionIDs();
- auto msg_data_1 = g_insecure_rand_ctx.randbytes<uint8_t>(4000000); // test that receiving 4M payload works
- auto msg_data_2 = g_insecure_rand_ctx.randbytes<uint8_t>(4000000); // test that sending 4M payload works
- tester.SendMessage(uint8_t(InsecureRandRange(223) + 33), {}); // unknown short id
+ auto msg_data_1 = m_rng.randbytes<uint8_t>(4000000); // test that receiving 4M payload works
+ auto msg_data_2 = m_rng.randbytes<uint8_t>(4000000); // test that sending 4M payload works
+ tester.SendMessage(uint8_t(m_rng.randrange(223) + 33), {}); // unknown short id
tester.SendMessage(uint8_t(2), msg_data_1); // "block" short id
tester.AddMessage("blocktxn", msg_data_2); // schedule blocktxn to be sent to us
ret = tester.Interact();
BOOST_REQUIRE(ret && ret->size() == 2);
BOOST_CHECK(!(*ret)[0]);
- BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "block" && Span{(*ret)[1]->m_recv} == MakeByteSpan(msg_data_1));
+ BOOST_CHECK((*ret)[1] && (*ret)[1]->m_type == "block" && std::ranges::equal((*ret)[1]->m_recv, MakeByteSpan(msg_data_1)));
tester.ReceiveMessage(uint8_t(3), msg_data_2); // "blocktxn" short id
}
// Send correct network's V1 header
{
- V2TransportTester tester(false);
+ V2TransportTester tester(m_rng, false);
tester.SendV1Version(Params().MessageStart());
auto ret = tester.Interact();
BOOST_CHECK(ret);
@@ -1553,7 +1546,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
// Send wrong network's V1 header
{
- V2TransportTester tester(false);
+ V2TransportTester tester(m_rng, false);
tester.SendV1Version(CChainParams::Main()->MessageStart());
auto ret = tester.Interact();
BOOST_CHECK(!ret);
diff --git a/src/test/orphanage_tests.cpp b/src/test/orphanage_tests.cpp
index 450bf6a4fc..799f2c0fec 100644
--- a/src/test/orphanage_tests.cpp
+++ b/src/test/orphanage_tests.cpp
@@ -3,12 +3,15 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <arith_uint256.h>
+#include <consensus/validation.h>
+#include <policy/policy.h>
#include <primitives/transaction.h>
#include <pubkey.h>
#include <script/sign.h>
#include <script/signingprovider.h>
#include <test/util/random.h>
#include <test/util/setup_common.h>
+#include <test/util/transaction_utils.h>
#include <txorphanage.h>
#include <array>
@@ -21,24 +24,26 @@ BOOST_FIXTURE_TEST_SUITE(orphanage_tests, TestingSetup)
class TxOrphanageTest : public TxOrphanage
{
public:
- inline size_t CountOrphans() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
+ TxOrphanageTest(FastRandomContext& rng) : m_rng{rng} {}
+
+ inline size_t CountOrphans() const
{
- LOCK(m_mutex);
return m_orphans.size();
}
- CTransactionRef RandomOrphan() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
+ CTransactionRef RandomOrphan()
{
- LOCK(m_mutex);
std::map<Wtxid, OrphanTx>::iterator it;
- it = m_orphans.lower_bound(Wtxid::FromUint256(InsecureRand256()));
+ it = m_orphans.lower_bound(Wtxid::FromUint256(m_rng.rand256()));
if (it == m_orphans.end())
it = m_orphans.begin();
return it->second.tx;
}
+
+ FastRandomContext& m_rng;
};
-static void MakeNewKeyWithFastRandomContext(CKey& key, FastRandomContext& rand_ctx = g_insecure_rand_ctx)
+static void MakeNewKeyWithFastRandomContext(CKey& key, FastRandomContext& rand_ctx)
{
std::vector<unsigned char> keydata;
keydata = rand_ctx.randbytes(32);
@@ -106,21 +111,25 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
// ecdsa_signature_parse_der_lax are executed during this test.
// Specifically branches that run only when an ECDSA
// signature's R and S values have leading zeros.
- g_insecure_rand_ctx = FastRandomContext{uint256{33}};
+ m_rng.Reseed(uint256{33});
- TxOrphanageTest orphanage;
+ TxOrphanageTest orphanage{m_rng};
CKey key;
- MakeNewKeyWithFastRandomContext(key);
+ MakeNewKeyWithFastRandomContext(key, m_rng);
FillableSigningProvider keystore;
BOOST_CHECK(keystore.AddKey(key));
+ // Freeze time for length of test
+ auto now{GetTime<std::chrono::seconds>()};
+ SetMockTime(now);
+
// 50 orphan transactions:
for (int i = 0; i < 50; i++)
{
CMutableTransaction tx;
tx.vin.resize(1);
tx.vin[0].prevout.n = 0;
- tx.vin[0].prevout.hash = Txid::FromUint256(InsecureRand256());
+ tx.vin[0].prevout.hash = Txid::FromUint256(m_rng.rand256());
tx.vin[0].scriptSig << OP_1;
tx.vout.resize(1);
tx.vout[0].nValue = 1*CENT;
@@ -172,22 +181,52 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
BOOST_CHECK(!orphanage.AddTx(MakeTransactionRef(tx), i));
}
- // Test EraseOrphansFor:
+ size_t expected_num_orphans = orphanage.CountOrphans();
+
+ // Non-existent peer; nothing should be deleted
+ orphanage.EraseForPeer(/*peer=*/-1);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), expected_num_orphans);
+
+ // Each of first three peers stored
+ // two transactions each.
for (NodeId i = 0; i < 3; i++)
{
- size_t sizeBefore = orphanage.CountOrphans();
orphanage.EraseForPeer(i);
- BOOST_CHECK(orphanage.CountOrphans() < sizeBefore);
+ expected_num_orphans -= 2;
+ BOOST_CHECK(orphanage.CountOrphans() == expected_num_orphans);
}
- // Test LimitOrphanTxSize() function:
+ // Test LimitOrphanTxSize() function, nothing should timeout:
FastRandomContext rng{/*fDeterministic=*/true};
+ orphanage.LimitOrphans(/*max_orphans=*/expected_num_orphans, rng);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), expected_num_orphans);
+ expected_num_orphans -= 1;
+ orphanage.LimitOrphans(/*max_orphans=*/expected_num_orphans, rng);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), expected_num_orphans);
+ assert(expected_num_orphans > 40);
orphanage.LimitOrphans(40, rng);
- BOOST_CHECK(orphanage.CountOrphans() <= 40);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 40);
orphanage.LimitOrphans(10, rng);
- BOOST_CHECK(orphanage.CountOrphans() <= 10);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 10);
orphanage.LimitOrphans(0, rng);
- BOOST_CHECK(orphanage.CountOrphans() == 0);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 0);
+
+ // Add one more orphan, check timeout logic
+ auto timeout_tx = MakeTransactionSpending(/*outpoints=*/{}, rng);
+ orphanage.AddTx(timeout_tx, 0);
+ orphanage.LimitOrphans(1, rng);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 1);
+
+ // One second shy of expiration
+ SetMockTime(now + ORPHAN_TX_EXPIRE_TIME - 1s);
+ orphanage.LimitOrphans(1, rng);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 1);
+
+ // Jump one more second, orphan should be timed out on limiting
+ SetMockTime(now + ORPHAN_TX_EXPIRE_TIME);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 1);
+ orphanage.LimitOrphans(1, rng);
+ BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 0);
}
BOOST_AUTO_TEST_CASE(same_txid_diff_witness)
@@ -334,4 +373,21 @@ BOOST_AUTO_TEST_CASE(get_children)
}
}
+BOOST_AUTO_TEST_CASE(too_large_orphan_tx)
+{
+ TxOrphanage orphanage;
+ CMutableTransaction tx;
+ tx.vin.resize(1);
+
+ // check that txs larger than MAX_STANDARD_TX_WEIGHT are not added to the orphanage
+ BulkTransaction(tx, MAX_STANDARD_TX_WEIGHT + 4);
+ BOOST_CHECK_EQUAL(GetTransactionWeight(CTransaction(tx)), MAX_STANDARD_TX_WEIGHT + 4);
+ BOOST_CHECK(!orphanage.AddTx(MakeTransactionRef(tx), 0));
+
+ tx.vout.clear();
+ BulkTransaction(tx, MAX_STANDARD_TX_WEIGHT);
+ BOOST_CHECK_EQUAL(GetTransactionWeight(CTransaction(tx)), MAX_STANDARD_TX_WEIGHT);
+ BOOST_CHECK(orphanage.AddTx(MakeTransactionRef(tx), 0));
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/pmt_tests.cpp b/src/test/pmt_tests.cpp
index edecf70c6f..2ba48d717a 100644
--- a/src/test/pmt_tests.cpp
+++ b/src/test/pmt_tests.cpp
@@ -17,22 +17,26 @@
class CPartialMerkleTreeTester : public CPartialMerkleTree
{
public:
+ CPartialMerkleTreeTester(FastRandomContext& rng) : m_rng{rng} {}
+
// flip one bit in one of the hashes - this should break the authentication
void Damage() {
- unsigned int n = InsecureRandRange(vHash.size());
- int bit = InsecureRandBits(8);
+ unsigned int n = m_rng.randrange(vHash.size());
+ int bit = m_rng.randbits(8);
*(vHash[n].begin() + (bit>>3)) ^= 1<<(bit&7);
}
+
+ FastRandomContext& m_rng;
};
BOOST_FIXTURE_TEST_SUITE(pmt_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(pmt_test1)
{
- static const unsigned int nTxCounts[] = {1, 4, 7, 17, 56, 100, 127, 256, 312, 513, 1000, 4095};
+ static const unsigned int tx_counts[] = {1, 4, 7, 17, 56, 100, 127, 256, 312, 513, 1000, 4095};
for (int i = 0; i < 12; i++) {
- unsigned int nTx = nTxCounts[i];
+ unsigned int nTx = tx_counts[i];
// build a block with some dummy transactions
CBlock block;
@@ -59,7 +63,7 @@ BOOST_AUTO_TEST_CASE(pmt_test1)
std::vector<bool> vMatch(nTx, false);
std::vector<uint256> vMatchTxid1;
for (unsigned int j=0; j<nTx; j++) {
- bool fInclude = InsecureRandBits(att / 2) == 0;
+ bool fInclude = m_rng.randbits(att / 2) == 0;
vMatch[j] = fInclude;
if (fInclude)
vMatchTxid1.push_back(vTxid[j]);
@@ -77,7 +81,7 @@ BOOST_AUTO_TEST_CASE(pmt_test1)
BOOST_CHECK(ss.size() <= 10 + (258*n+7)/8);
// deserialize into a tester copy
- CPartialMerkleTreeTester pmt2;
+ CPartialMerkleTreeTester pmt2{m_rng};
ss >> pmt2;
// extract merkle root and matched txids from copy
diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp
index 6cadc3290a..83977c1c89 100644
--- a/src/test/policyestimator_tests.cpp
+++ b/src/test/policyestimator_tests.cpp
@@ -1,8 +1,9 @@
-// Copyright (c) 2011-2022 The Bitcoin Core developers
+// Copyright (c) 2011-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.
#include <policy/fees.h>
+#include <policy/fees_args.h>
#include <policy/policy.h>
#include <test/util/txmempool.h>
#include <txmempool.h>
@@ -18,7 +19,7 @@ BOOST_FIXTURE_TEST_SUITE(policyestimator_tests, ChainTestingSetup)
BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
{
- CBlockPolicyEstimator& feeEst = *Assert(m_node.fee_estimator);
+ CBlockPolicyEstimator feeEst{FeeestPath(*m_node.args), DEFAULT_ACCEPT_STALE_FEE_ESTIMATES};
CTxMemPool& mpool = *Assert(m_node.mempool);
m_node.validation_signals->RegisterValidationInterface(&feeEst);
TestMemPoolEntryHelper entry;
diff --git a/src/test/pool_tests.cpp b/src/test/pool_tests.cpp
index 5ad4afa3a1..9d15660126 100644
--- a/src/test/pool_tests.cpp
+++ b/src/test/pool_tests.cpp
@@ -129,17 +129,17 @@ BOOST_AUTO_TEST_CASE(random_allocations)
std::vector<PtrSizeAlignment> ptr_size_alignment{};
for (size_t i = 0; i < 1000; ++i) {
// make it a bit more likely to allocate than deallocate
- if (ptr_size_alignment.empty() || 0 != InsecureRandRange(4)) {
+ if (ptr_size_alignment.empty() || 0 != m_rng.randrange(4)) {
// allocate a random item
- std::size_t alignment = std::size_t{1} << InsecureRandRange(8); // 1, 2, ..., 128
- std::size_t size = (InsecureRandRange(200) / alignment + 1) * alignment; // multiple of alignment
+ std::size_t alignment = std::size_t{1} << m_rng.randrange(8); // 1, 2, ..., 128
+ std::size_t size = (m_rng.randrange(200) / alignment + 1) * alignment; // multiple of alignment
void* ptr = resource.Allocate(size, alignment);
BOOST_TEST(ptr != nullptr);
BOOST_TEST((reinterpret_cast<uintptr_t>(ptr) & (alignment - 1)) == 0);
ptr_size_alignment.push_back({ptr, size, alignment});
} else {
// deallocate a random item
- auto& x = ptr_size_alignment[InsecureRandRange(ptr_size_alignment.size())];
+ auto& x = ptr_size_alignment[m_rng.randrange(ptr_size_alignment.size())];
resource.Deallocate(x.ptr, x.bytes, x.alignment);
x = ptr_size_alignment.back();
ptr_size_alignment.pop_back();
diff --git a/src/test/pow_tests.cpp b/src/test/pow_tests.cpp
index 3a44d1da49..76e4600441 100644
--- a/src/test/pow_tests.cpp
+++ b/src/test/pow_tests.cpp
@@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_negative_target)
uint256 hash;
unsigned int nBits;
nBits = UintToArith256(consensus.powLimit).GetCompact(true);
- hash.SetHex("0x1");
+ hash = uint256{1};
BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
}
@@ -95,7 +95,7 @@ BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_overflow_target)
const auto consensus = CreateChainParams(*m_node.args, ChainType::MAIN)->GetConsensus();
uint256 hash;
unsigned int nBits{~0x00800000U};
- hash.SetHex("0x1");
+ hash = uint256{1};
BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
}
@@ -107,7 +107,7 @@ BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_too_easy_target)
arith_uint256 nBits_arith = UintToArith256(consensus.powLimit);
nBits_arith *= 2;
nBits = nBits_arith.GetCompact();
- hash.SetHex("0x1");
+ hash = uint256{1};
BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
}
@@ -147,9 +147,9 @@ BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test)
}
for (int j = 0; j < 1000; j++) {
- CBlockIndex *p1 = &blocks[InsecureRandRange(10000)];
- CBlockIndex *p2 = &blocks[InsecureRandRange(10000)];
- CBlockIndex *p3 = &blocks[InsecureRandRange(10000)];
+ CBlockIndex *p1 = &blocks[m_rng.randrange(10000)];
+ CBlockIndex *p2 = &blocks[m_rng.randrange(10000)];
+ CBlockIndex *p3 = &blocks[m_rng.randrange(10000)];
int64_t tdiff = GetBlockProofEquivalentTime(*p1, *p2, *p3, chainParams->GetConsensus());
BOOST_CHECK_EQUAL(tdiff, p1->GetBlockTime() - p2->GetBlockTime());
@@ -177,7 +177,7 @@ void sanity_check_chainparams(const ArgsManager& args, ChainType chain_type)
// check max target * 4*nPowTargetTimespan doesn't overflow -- see pow.cpp:CalculateNextWorkRequired()
if (!consensus.fPowNoRetargeting) {
- arith_uint256 targ_max{UintToArith256(uint256S("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"))};
+ arith_uint256 targ_max{UintToArith256(uint256{"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"})};
targ_max /= consensus.nPowTargetTimespan*4;
BOOST_CHECK(UintToArith256(consensus.powLimit) < targ_max);
}
@@ -198,6 +198,11 @@ BOOST_AUTO_TEST_CASE(ChainParams_TESTNET_sanity)
sanity_check_chainparams(*m_node.args, ChainType::TESTNET);
}
+BOOST_AUTO_TEST_CASE(ChainParams_TESTNET4_sanity)
+{
+ sanity_check_chainparams(*m_node.args, ChainType::TESTNET4);
+}
+
BOOST_AUTO_TEST_CASE(ChainParams_SIGNET_sanity)
{
sanity_check_chainparams(*m_node.args, ChainType::SIGNET);
diff --git a/src/test/prevector_tests.cpp b/src/test/prevector_tests.cpp
index 1559011fcd..0588bf9b4a 100644
--- a/src/test/prevector_tests.cpp
+++ b/src/test/prevector_tests.cpp
@@ -3,17 +3,16 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <prevector.h>
-#include <vector>
-
-#include <reverse_iterator.h>
#include <serialize.h>
#include <streams.h>
-
#include <test/util/random.h>
#include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp>
+#include <ranges>
+#include <vector>
+
BOOST_FIXTURE_TEST_SUITE(prevector_tests, TestingSetup)
template<unsigned int N, typename T>
@@ -28,7 +27,6 @@ class prevector_tester {
typedef typename pretype::size_type Size;
bool passed = true;
- FastRandomContext rand_cache;
uint256 rand_seed;
@@ -58,14 +56,14 @@ class prevector_tester {
for (const T& v : pre_vector) {
local_check(v == real_vector[pos++]);
}
- for (const T& v : reverse_iterate(pre_vector)) {
- local_check(v == real_vector[--pos]);
+ for (const T& v : pre_vector | std::views::reverse) {
+ local_check(v == real_vector[--pos]);
}
for (const T& v : const_pre_vector) {
local_check(v == real_vector[pos++]);
}
- for (const T& v : reverse_iterate(const_pre_vector)) {
- local_check(v == real_vector[--pos]);
+ for (const T& v : const_pre_vector | std::views::reverse) {
+ local_check(v == real_vector[--pos]);
}
DataStream ss1{};
DataStream ss2{};
@@ -209,84 +207,83 @@ public:
BOOST_CHECK_MESSAGE(passed, "insecure_rand: " + rand_seed.ToString());
}
- prevector_tester() {
- SeedInsecureRand();
- rand_seed = InsecureRand256();
- rand_cache = FastRandomContext(rand_seed);
+ prevector_tester(FastRandomContext& rng) {
+ rand_seed = rng.rand256();
+ rng.Reseed(rand_seed);
}
};
BOOST_AUTO_TEST_CASE(PrevectorTestInt)
{
for (int j = 0; j < 64; j++) {
- prevector_tester<8, int> test;
+ prevector_tester<8, int> test{m_rng};
for (int i = 0; i < 2048; i++) {
- if (InsecureRandBits(2) == 0) {
- test.insert(InsecureRandRange(test.size() + 1), int(InsecureRand32()));
+ if (m_rng.randbits(2) == 0) {
+ test.insert(m_rng.randrange(test.size() + 1), int(m_rng.rand32()));
}
- if (test.size() > 0 && InsecureRandBits(2) == 1) {
- test.erase(InsecureRandRange(test.size()));
+ if (test.size() > 0 && m_rng.randbits(2) == 1) {
+ test.erase(m_rng.randrange(test.size()));
}
- if (InsecureRandBits(3) == 2) {
- int new_size = std::max(0, std::min(30, (int)test.size() + (int)InsecureRandRange(5) - 2));
+ if (m_rng.randbits(3) == 2) {
+ int new_size = std::max(0, std::min(30, (int)test.size() + (int)m_rng.randrange(5) - 2));
test.resize(new_size);
}
- if (InsecureRandBits(3) == 3) {
- test.insert(InsecureRandRange(test.size() + 1), 1 + InsecureRandBool(), int(InsecureRand32()));
+ if (m_rng.randbits(3) == 3) {
+ test.insert(m_rng.randrange(test.size() + 1), 1 + m_rng.randbool(), int(m_rng.rand32()));
}
- if (InsecureRandBits(3) == 4) {
- int del = std::min<int>(test.size(), 1 + (InsecureRandBool()));
- int beg = InsecureRandRange(test.size() + 1 - del);
+ if (m_rng.randbits(3) == 4) {
+ int del = std::min<int>(test.size(), 1 + (m_rng.randbool()));
+ int beg = m_rng.randrange(test.size() + 1 - del);
test.erase(beg, beg + del);
}
- if (InsecureRandBits(4) == 5) {
- test.push_back(int(InsecureRand32()));
+ if (m_rng.randbits(4) == 5) {
+ test.push_back(int(m_rng.rand32()));
}
- if (test.size() > 0 && InsecureRandBits(4) == 6) {
+ if (test.size() > 0 && m_rng.randbits(4) == 6) {
test.pop_back();
}
- if (InsecureRandBits(5) == 7) {
+ if (m_rng.randbits(5) == 7) {
int values[4];
- int num = 1 + (InsecureRandBits(2));
+ int num = 1 + (m_rng.randbits(2));
for (int k = 0; k < num; k++) {
- values[k] = int(InsecureRand32());
+ values[k] = int(m_rng.rand32());
}
- test.insert_range(InsecureRandRange(test.size() + 1), values, values + num);
+ test.insert_range(m_rng.randrange(test.size() + 1), values, values + num);
}
- if (InsecureRandBits(5) == 8) {
- int del = std::min<int>(test.size(), 1 + (InsecureRandBits(2)));
- int beg = InsecureRandRange(test.size() + 1 - del);
+ if (m_rng.randbits(5) == 8) {
+ int del = std::min<int>(test.size(), 1 + (m_rng.randbits(2)));
+ int beg = m_rng.randrange(test.size() + 1 - del);
test.erase(beg, beg + del);
}
- if (InsecureRandBits(5) == 9) {
- test.reserve(InsecureRandBits(5));
+ if (m_rng.randbits(5) == 9) {
+ test.reserve(m_rng.randbits(5));
}
- if (InsecureRandBits(6) == 10) {
+ if (m_rng.randbits(6) == 10) {
test.shrink_to_fit();
}
if (test.size() > 0) {
- test.update(InsecureRandRange(test.size()), int(InsecureRand32()));
+ test.update(m_rng.randrange(test.size()), int(m_rng.rand32()));
}
- if (InsecureRandBits(10) == 11) {
+ if (m_rng.randbits(10) == 11) {
test.clear();
}
- if (InsecureRandBits(9) == 12) {
- test.assign(InsecureRandBits(5), int(InsecureRand32()));
+ if (m_rng.randbits(9) == 12) {
+ test.assign(m_rng.randbits(5), int(m_rng.rand32()));
}
- if (InsecureRandBits(3) == 3) {
+ if (m_rng.randbits(3) == 3) {
test.swap();
}
- if (InsecureRandBits(4) == 8) {
+ if (m_rng.randbits(4) == 8) {
test.copy();
}
- if (InsecureRandBits(5) == 18) {
+ if (m_rng.randbits(5) == 18) {
test.move();
}
- if (InsecureRandBits(5) == 19) {
- unsigned int num = 1 + (InsecureRandBits(4));
+ if (m_rng.randbits(5) == 19) {
+ unsigned int num = 1 + (m_rng.randbits(4));
std::vector<int> values(num);
for (int& v : values) {
- v = int(InsecureRand32());
+ v = int(m_rng.rand32());
}
test.resize_uninitialized(values);
}
diff --git a/src/test/raii_event_tests.cpp b/src/test/raii_event_tests.cpp
index ada61029ee..7d1079fbbe 100644
--- a/src/test/raii_event_tests.cpp
+++ b/src/test/raii_event_tests.cpp
@@ -86,14 +86,6 @@ BOOST_AUTO_TEST_CASE(raii_event_order)
event_set_mem_functions(malloc, realloc, free);
}
-#else
-
-BOOST_AUTO_TEST_CASE(raii_event_tests_SKIPPED)
-{
- // It would probably be ideal to report skipped, but boost::test doesn't seem to make that practical (at least not in versions available with common distros)
- BOOST_TEST_MESSAGE("Skipping raii_event_tess: libevent doesn't support event_set_mem_functions");
-}
-
#endif // EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/random_tests.cpp b/src/test/random_tests.cpp
index 43d887b5c9..3d8b543e64 100644
--- a/src/test/random_tests.cpp
+++ b/src/test/random_tests.cpp
@@ -20,28 +20,39 @@ BOOST_AUTO_TEST_CASE(osrandom_tests)
BOOST_CHECK(Random_SanityCheck());
}
-BOOST_AUTO_TEST_CASE(fastrandom_tests)
+BOOST_AUTO_TEST_CASE(fastrandom_tests_deterministic)
{
// Check that deterministic FastRandomContexts are deterministic
- g_mock_deterministic_tests = true;
- FastRandomContext ctx1(true);
- FastRandomContext ctx2(true);
-
- for (int i = 10; i > 0; --i) {
- BOOST_CHECK_EQUAL(GetRand<uint64_t>(), uint64_t{10393729187455219830U});
- BOOST_CHECK_EQUAL(GetRand<int>(), int{769702006});
- BOOST_CHECK_EQUAL(GetRandMicros(std::chrono::hours{1}).count(), 2917185654);
- BOOST_CHECK_EQUAL(GetRandMillis(std::chrono::hours{1}).count(), 2144374);
+ SeedRandomForTest(SeedRand::ZEROS);
+ FastRandomContext ctx1{true};
+ FastRandomContext ctx2{true};
+
+ {
+ BOOST_CHECK_EQUAL(FastRandomContext().rand<uint64_t>(), uint64_t{9330418229102544152u});
+ BOOST_CHECK_EQUAL(FastRandomContext().rand<int>(), int{618925161});
+ BOOST_CHECK_EQUAL(FastRandomContext().randrange<std::chrono::microseconds>(1h).count(), 1271170921);
+ BOOST_CHECK_EQUAL(FastRandomContext().randrange<std::chrono::milliseconds>(1h).count(), 2803534);
+
+ BOOST_CHECK_EQUAL(FastRandomContext().rand<uint64_t>(), uint64_t{10170981140880778086u});
+ BOOST_CHECK_EQUAL(FastRandomContext().rand<int>(), int{1689082725});
+ BOOST_CHECK_EQUAL(FastRandomContext().randrange<std::chrono::microseconds>(1h).count(), 2464643716);
+ BOOST_CHECK_EQUAL(FastRandomContext().randrange<std::chrono::milliseconds>(1h).count(), 2312205);
+
+ BOOST_CHECK_EQUAL(FastRandomContext().rand<uint64_t>(), uint64_t{5689404004456455543u});
+ BOOST_CHECK_EQUAL(FastRandomContext().rand<int>(), int{785839937});
+ BOOST_CHECK_EQUAL(FastRandomContext().randrange<std::chrono::microseconds>(1h).count(), 93558804);
+ BOOST_CHECK_EQUAL(FastRandomContext().randrange<std::chrono::milliseconds>(1h).count(), 507022);
}
+
{
constexpr SteadySeconds time_point{1s};
FastRandomContext ctx{true};
BOOST_CHECK_EQUAL(7, ctx.rand_uniform_delay(time_point, 9s).time_since_epoch().count());
BOOST_CHECK_EQUAL(-6, ctx.rand_uniform_delay(time_point, -9s).time_since_epoch().count());
BOOST_CHECK_EQUAL(1, ctx.rand_uniform_delay(time_point, 0s).time_since_epoch().count());
- BOOST_CHECK_EQUAL(1467825113502396065, ctx.rand_uniform_delay(time_point, 9223372036854775807s).time_since_epoch().count());
- BOOST_CHECK_EQUAL(-970181367944767837, ctx.rand_uniform_delay(time_point, -9223372036854775807s).time_since_epoch().count());
- BOOST_CHECK_EQUAL(24761, ctx.rand_uniform_delay(time_point, 9h).time_since_epoch().count());
+ BOOST_CHECK_EQUAL(4652286523065884857, ctx.rand_uniform_delay(time_point, 9223372036854775807s).time_since_epoch().count());
+ BOOST_CHECK_EQUAL(-8813961240025683129, ctx.rand_uniform_delay(time_point, -9223372036854775807s).time_since_epoch().count());
+ BOOST_CHECK_EQUAL(26443, ctx.rand_uniform_delay(time_point, 9h).time_since_epoch().count());
}
BOOST_CHECK_EQUAL(ctx1.rand32(), ctx2.rand32());
BOOST_CHECK_EQUAL(ctx1.rand32(), ctx2.rand32());
@@ -65,15 +76,28 @@ BOOST_AUTO_TEST_CASE(fastrandom_tests)
// Check with time-point type
BOOST_CHECK_EQUAL(2782, ctx.rand_uniform_duration<SteadySeconds>(9h).count());
}
+}
+BOOST_AUTO_TEST_CASE(fastrandom_tests_nondeterministic)
+{
// Check that a nondeterministic ones are not
- g_mock_deterministic_tests = false;
- for (int i = 10; i > 0; --i) {
- BOOST_CHECK(GetRand<uint64_t>() != uint64_t{10393729187455219830U});
- BOOST_CHECK(GetRand<int>() != int{769702006});
- BOOST_CHECK(GetRandMicros(std::chrono::hours{1}) != std::chrono::microseconds{2917185654});
- BOOST_CHECK(GetRandMillis(std::chrono::hours{1}) != std::chrono::milliseconds{2144374});
+ {
+ BOOST_CHECK(FastRandomContext().rand<uint64_t>() != uint64_t{9330418229102544152u});
+ BOOST_CHECK(FastRandomContext().rand<int>() != int{618925161});
+ BOOST_CHECK(FastRandomContext().randrange<std::chrono::microseconds>(1h).count() != 1271170921);
+ BOOST_CHECK(FastRandomContext().randrange<std::chrono::milliseconds>(1h).count() != 2803534);
+
+ BOOST_CHECK(FastRandomContext().rand<uint64_t>() != uint64_t{10170981140880778086u});
+ BOOST_CHECK(FastRandomContext().rand<int>() != int{1689082725});
+ BOOST_CHECK(FastRandomContext().randrange<std::chrono::microseconds>(1h).count() != 2464643716);
+ BOOST_CHECK(FastRandomContext().randrange<std::chrono::milliseconds>(1h).count() != 2312205);
+
+ BOOST_CHECK(FastRandomContext().rand<uint64_t>() != uint64_t{5689404004456455543u});
+ BOOST_CHECK(FastRandomContext().rand<int>() != int{785839937});
+ BOOST_CHECK(FastRandomContext().randrange<std::chrono::microseconds>(1h).count() != 93558804);
+ BOOST_CHECK(FastRandomContext().randrange<std::chrono::milliseconds>(1h).count() != 507022);
}
+
{
FastRandomContext ctx3, ctx4;
BOOST_CHECK(ctx3.rand64() != ctx4.rand64()); // extremely unlikely to be equal
@@ -103,6 +127,70 @@ BOOST_AUTO_TEST_CASE(fastrandom_randbits)
}
}
+/** Verify that RandomMixin::randbits returns 0 and 1 for every requested bit. */
+BOOST_AUTO_TEST_CASE(randbits_test)
+{
+ FastRandomContext ctx_lens; //!< RNG for producing the lengths requested from ctx_test.
+ FastRandomContext ctx_test1(true), ctx_test2(true); //!< The RNGs being tested.
+ int ctx_test_bitsleft{0}; //!< (Assumed value of) ctx_test::bitbuf_len
+
+ // Run the entire test 5 times.
+ for (int i = 0; i < 5; ++i) {
+ // count (first) how often it has occurred, and (second) how often it was true:
+ // - for every bit position, in every requested bits count (0 + 1 + 2 + ... + 64 = 2080)
+ // - for every value of ctx_test_bitsleft (0..63 = 64)
+ std::vector<std::pair<uint64_t, uint64_t>> seen(2080 * 64);
+ while (true) {
+ // Loop 1000 times, just to not continuously check std::all_of.
+ for (int j = 0; j < 1000; ++j) {
+ // Decide on a number of bits to request (0 through 64, inclusive; don't use randbits/randrange).
+ int bits = ctx_lens.rand64() % 65;
+ // Generate that many bits.
+ uint64_t gen = ctx_test1.randbits(bits);
+ // For certain bits counts, also test randbits<Bits> and compare.
+ uint64_t gen2;
+ if (bits == 0) {
+ gen2 = ctx_test2.randbits<0>();
+ } else if (bits == 1) {
+ gen2 = ctx_test2.randbits<1>();
+ } else if (bits == 7) {
+ gen2 = ctx_test2.randbits<7>();
+ } else if (bits == 32) {
+ gen2 = ctx_test2.randbits<32>();
+ } else if (bits == 51) {
+ gen2 = ctx_test2.randbits<51>();
+ } else if (bits == 64) {
+ gen2 = ctx_test2.randbits<64>();
+ } else {
+ gen2 = ctx_test2.randbits(bits);
+ }
+ BOOST_CHECK_EQUAL(gen, gen2);
+ // Make sure the result is in range.
+ if (bits < 64) BOOST_CHECK_EQUAL(gen >> bits, 0);
+ // Mark all the seen bits in the output.
+ for (int bit = 0; bit < bits; ++bit) {
+ int idx = bit + (bits * (bits - 1)) / 2 + 2080 * ctx_test_bitsleft;
+ seen[idx].first += 1;
+ seen[idx].second += (gen >> bit) & 1;
+ }
+ // Update ctx_test_bitself.
+ if (bits > ctx_test_bitsleft) {
+ ctx_test_bitsleft = ctx_test_bitsleft + 64 - bits;
+ } else {
+ ctx_test_bitsleft -= bits;
+ }
+ }
+ // Loop until every bit position/combination is seen 242 times.
+ if (std::all_of(seen.begin(), seen.end(), [](const auto& x) { return x.first >= 242; })) break;
+ }
+ // Check that each bit appears within 7.78 standard deviations of 50%
+ // (each will fail with P < 1/(2080 * 64 * 10^9)).
+ for (const auto& val : seen) {
+ assert(fabs(val.first * 0.5 - val.second) < sqrt(val.first * 0.25) * 7.78);
+ }
+ }
+}
+
/** Does-it-compile test for compatibility with standard library RNG interface. */
BOOST_AUTO_TEST_CASE(stdrandom_test)
{
@@ -118,10 +206,6 @@ BOOST_AUTO_TEST_CASE(stdrandom_test)
for (int j = 1; j <= 10; ++j) {
BOOST_CHECK(std::find(test.begin(), test.end(), j) != test.end());
}
- Shuffle(test.begin(), test.end(), ctx);
- for (int j = 1; j <= 10; ++j) {
- BOOST_CHECK(std::find(test.begin(), test.end(), j) != test.end());
- }
}
}
@@ -132,7 +216,7 @@ BOOST_AUTO_TEST_CASE(shuffle_stat_test)
uint32_t counts[5 * 5 * 5 * 5 * 5] = {0};
for (int i = 0; i < 12000; ++i) {
int data[5] = {0, 1, 2, 3, 4};
- Shuffle(std::begin(data), std::end(data), ctx);
+ std::shuffle(std::begin(data), std::end(data), ctx);
int pos = data[0] + data[1] * 5 + data[2] * 25 + data[3] * 125 + data[4] * 625;
++counts[pos];
}
@@ -155,4 +239,21 @@ BOOST_AUTO_TEST_CASE(shuffle_stat_test)
BOOST_CHECK_EQUAL(sum, 12000U);
}
+BOOST_AUTO_TEST_CASE(xoroshiro128plusplus_reference_values)
+{
+ // numbers generated from reference implementation
+ InsecureRandomContext rng(0);
+ BOOST_TEST(0x6f68e1e7e2646ee1 == rng());
+ BOOST_TEST(0xbf971b7f454094ad == rng());
+ BOOST_TEST(0x48f2de556f30de38 == rng());
+ BOOST_TEST(0x6ea7c59f89bbfc75 == rng());
+
+ // seed with a random number
+ rng.Reseed(0x1a26f3fa8546b47a);
+ BOOST_TEST(0xc8dc5e08d844ac7d == rng());
+ BOOST_TEST(0x5b5f1f6d499dad1b == rng());
+ BOOST_TEST(0xbeb0031f93313d6f == rng());
+ BOOST_TEST(0xbfbcf4f43a264497 == rng());
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/script_p2sh_tests.cpp b/src/test/script_p2sh_tests.cpp
index 54dcc218b9..096de0724f 100644
--- a/src/test/script_p2sh_tests.cpp
+++ b/src/test/script_p2sh_tests.cpp
@@ -11,6 +11,7 @@
#include <script/sign.h>
#include <script/signingprovider.h>
#include <test/util/setup_common.h>
+#include <test/util/transaction_utils.h>
#include <validation.h>
#include <vector>
@@ -113,13 +114,14 @@ BOOST_AUTO_TEST_CASE(sign)
}
// All of the above should be OK, and the txTos have valid signatures
// Check to make sure signature verification fails if we use the wrong ScriptSig:
+ SignatureCache signature_cache{DEFAULT_SIGNATURE_CACHE_BYTES};
for (int i = 0; i < 8; i++) {
PrecomputedTransactionData txdata(txTo[i]);
for (int j = 0; j < 8; j++)
{
CScript sigSave = txTo[i].vin[0].scriptSig;
txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig;
- bool sigOK = CScriptCheck(txFrom.vout[txTo[i].vin[0].prevout.n], CTransaction(txTo[i]), 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &txdata)();
+ bool sigOK = CScriptCheck(txFrom.vout[txTo[i].vin[0].prevout.n], CTransaction(txTo[i]), signature_cache, 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &txdata)();
if (i == j)
BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j));
else
diff --git a/src/test/script_standard_tests.cpp b/src/test/script_standard_tests.cpp
index 29e2d4a569..e9ce82ca8a 100644
--- a/src/test/script_standard_tests.cpp
+++ b/src/test/script_standard_tests.cpp
@@ -16,6 +16,7 @@
#include <univalue.h>
+using namespace util::hex_literals;
BOOST_FIXTURE_TEST_SUITE(script_standard_tests, BasicTestingSetup)
@@ -128,6 +129,20 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
BOOST_CHECK(solutions[0] == std::vector<unsigned char>{16});
BOOST_CHECK(solutions[1] == ToByteVector(uint256::ONE));
+ // TxoutType::ANCHOR
+ std::vector<unsigned char> anchor_bytes{0x4e, 0x73};
+ s.clear();
+ s << OP_1 << anchor_bytes;
+ BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::ANCHOR);
+ BOOST_CHECK(solutions.empty());
+
+ // Sanity-check IsPayToAnchor
+ int version{-1};
+ std::vector<unsigned char> witness_program;
+ BOOST_CHECK(s.IsPayToAnchor());
+ BOOST_CHECK(s.IsWitnessProgram(version, witness_program));
+ BOOST_CHECK(CScript::IsPayToAnchor(version, witness_program));
+
// TxoutType::NONSTANDARD
s.clear();
s << OP_9 << OP_ADD << OP_11 << OP_EQUAL;
@@ -186,6 +201,18 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_failure)
s.clear();
s << OP_0 << std::vector<unsigned char>(19, 0x01);
BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::NONSTANDARD);
+
+ // TxoutType::ANCHOR but wrong witness version
+ s.clear();
+ s << OP_2 << std::vector<unsigned char>{0x4e, 0x73};
+ BOOST_CHECK(!s.IsPayToAnchor());
+ BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::WITNESS_UNKNOWN);
+
+ // TxoutType::ANCHOR but wrong 2-byte data push
+ s.clear();
+ s << OP_1 << std::vector<unsigned char>{0xff, 0xff};
+ BOOST_CHECK(!s.IsPayToAnchor());
+ BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::WITNESS_UNKNOWN);
}
BOOST_AUTO_TEST_CASE(script_standard_ExtractDestination)
@@ -362,12 +389,12 @@ BOOST_AUTO_TEST_CASE(script_standard_taproot_builder)
BOOST_CHECK_EQUAL(TaprootBuilder::ValidDepths({128,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}), true);
BOOST_CHECK_EQUAL(TaprootBuilder::ValidDepths({129,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}), false);
- XOnlyPubKey key_inner{ParseHex("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798")};
- XOnlyPubKey key_1{ParseHex("c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5")};
- XOnlyPubKey key_2{ParseHex("f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9")};
+ XOnlyPubKey key_inner{"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"_hex_u8};
+ XOnlyPubKey key_1{"c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5"_hex_u8};
+ XOnlyPubKey key_2{"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9"_hex_u8};
CScript script_1 = CScript() << ToByteVector(key_1) << OP_CHECKSIG;
CScript script_2 = CScript() << ToByteVector(key_2) << OP_CHECKSIG;
- uint256 hash_3 = uint256S("31fe7061656bea2a36aa60a2f7ef940578049273746935d296426dc0afd86b68");
+ constexpr uint256 hash_3{"31fe7061656bea2a36aa60a2f7ef940578049273746935d296426dc0afd86b68"};
TaprootBuilder builder;
BOOST_CHECK(builder.IsValid() && builder.IsComplete());
diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp
index 39b53295e7..8c3806d22f 100644
--- a/src/test/script_tests.cpp
+++ b/src/test/script_tests.cpp
@@ -35,6 +35,8 @@
// Uncomment if you want to output updated JSON tests.
// #define UPDATE_JSON_TESTS
+using namespace util::hex_literals;
+
static const unsigned int gFlags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC;
unsigned int ParseScriptFlags(std::string strFlags);
@@ -110,8 +112,7 @@ static ScriptError_t ParseScriptError(const std::string& name)
return SCRIPT_ERR_UNKNOWN_ERROR;
}
-BOOST_FIXTURE_TEST_SUITE(script_tests, BasicTestingSetup)
-
+struct ScriptTest : BasicTestingSetup {
void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScriptWitness& scriptWitness, uint32_t flags, const std::string& message, int scriptError, CAmount nValue = 0)
{
bool expect = (scriptError == SCRIPT_ERR_OK);
@@ -128,7 +129,7 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScript
// Verify that removing flags from a passing test or adding flags to a failing test does not change the result.
for (int i = 0; i < 16; ++i) {
- uint32_t extra_flags(InsecureRandBits(16));
+ uint32_t extra_flags(m_rng.randbits(16));
uint32_t combined_flags{expect ? (flags & ~extra_flags) : (flags | extra_flags)};
// Weed out some invalid flag combinations.
if (combined_flags & SCRIPT_VERIFY_CLEANSTACK && ~combined_flags & (SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS)) continue;
@@ -136,6 +137,7 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScript
BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, &scriptWitness, combined_flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue, MissingDataBehavior::ASSERT_FAIL), &err) == expect, message + strprintf(" (with flags %x)", combined_flags));
}
}
+}; // struct ScriptTest
void static NegateSignatureS(std::vector<unsigned char>& vchSig) {
// Parse the signature.
@@ -369,11 +371,11 @@ public:
return *this;
}
- TestBuilder& Test()
+ TestBuilder& Test(ScriptTest& test)
{
TestBuilder copy = *this; // Make a copy so we can rollback the push.
DoPush();
- DoTest(creditTx->vout[0].scriptPubKey, spendTx.vin[0].scriptSig, scriptWitness, flags, comment, scriptError, nValue);
+ test.DoTest(creditTx->vout[0].scriptPubKey, spendTx.vin[0].scriptSig, scriptWitness, flags, comment, scriptError, nValue);
*this = copy;
return *this;
}
@@ -425,6 +427,8 @@ std::string JSONPrettyPrint(const UniValue& univalue)
}
} // namespace
+BOOST_FIXTURE_TEST_SUITE(script_tests, ScriptTest)
+
BOOST_AUTO_TEST_CASE(script_build)
{
const KeyData keys;
@@ -884,7 +888,7 @@ BOOST_AUTO_TEST_CASE(script_build)
std::string strGen;
#endif
for (TestBuilder& test : tests) {
- test.Test();
+ test.Test(*this);
std::string str = JSONPrettyPrint(test.GetJSON());
#ifdef UPDATE_JSON_TESTS
strGen += str + ",\n";
@@ -1265,7 +1269,7 @@ BOOST_AUTO_TEST_CASE(sign_invalid_miniscript)
// Create a Taproot output which contains a leaf in which a non-32 bytes push is used where a public key is expected
// by the Miniscript parser. This offending Script was found by the RPC fuzzer.
- const auto invalid_pubkey{ParseHex("173d36c8c9c9c9ffffffffffff0200000000021e1e37373721361818181818181e1e1e1e19000000000000000000b19292929292926b006c9b9b9292")};
+ const auto invalid_pubkey{"173d36c8c9c9c9ffffffffffff0200000000021e1e37373721361818181818181e1e1e1e19000000000000000000b19292929292926b006c9b9b9292"_hex_u8};
TaprootBuilder builder;
builder.Add(0, {invalid_pubkey}, 0xc0);
builder.Finalize(XOnlyPubKey::NUMS_H);
@@ -1277,6 +1281,19 @@ BOOST_AUTO_TEST_CASE(sign_invalid_miniscript)
BOOST_CHECK(!SignSignature(keystore, CTransaction(prev), curr, 0, SIGHASH_ALL, sig_data));
}
+/* P2A input should be considered signed. */
+BOOST_AUTO_TEST_CASE(sign_paytoanchor)
+{
+ FillableSigningProvider keystore;
+ SignatureData sig_data;
+ CMutableTransaction prev, curr;
+ prev.vout.emplace_back(0, GetScriptForDestination(PayToAnchor{}));
+
+ curr.vin.emplace_back(COutPoint{prev.GetHash(), 0});
+
+ BOOST_CHECK(SignSignature(keystore, CTransaction(prev), curr, 0, SIGHASH_ALL, sig_data));
+}
+
BOOST_AUTO_TEST_CASE(script_standard_push)
{
ScriptError err;
@@ -1339,10 +1356,23 @@ BOOST_AUTO_TEST_CASE(script_GetScriptAsm)
BOOST_CHECK_EQUAL(derSig + "83 " + pubKey, ScriptToAsmStr(CScript() << ToByteVector(ParseHex(derSig + "83")) << vchPubKey));
}
+template <typename T>
+CScript ToScript(const T& byte_container)
+{
+ auto span{MakeUCharSpan(byte_container)};
+ return {span.begin(), span.end()};
+}
+
static CScript ScriptFromHex(const std::string& str)
{
- std::vector<unsigned char> data = ParseHex(str);
- return CScript(data.begin(), data.end());
+ return ToScript(*Assert(TryParseHex(str)));
+}
+
+BOOST_AUTO_TEST_CASE(script_byte_array_u8_vector_equivalence)
+{
+ const CScript scriptPubKey1 = CScript() << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex_v_u8 << OP_CHECKSIG;
+ const CScript scriptPubKey2 = CScript() << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex << OP_CHECKSIG;
+ BOOST_CHECK(scriptPubKey1 == scriptPubKey2);
}
BOOST_AUTO_TEST_CASE(script_FindAndDelete)
@@ -1370,60 +1400,60 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 4);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0302ff03"); // PUSH 0x02ff03 onto stack
- d = ScriptFromHex("0302ff03");
+ s = ToScript("0302ff03"_hex); // PUSH 0x02ff03 onto stack
+ d = ToScript("0302ff03"_hex);
expect = CScript();
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0302ff030302ff03"); // PUSH 0x2ff03 PUSH 0x2ff03
- d = ScriptFromHex("0302ff03");
+ s = ToScript("0302ff030302ff03"_hex); // PUSH 0x02ff03 PUSH 0x02ff03
+ d = ToScript("0302ff03"_hex);
expect = CScript();
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0302ff030302ff03");
- d = ScriptFromHex("02");
+ s = ToScript("0302ff030302ff03"_hex);
+ d = ToScript("02"_hex);
expect = s; // FindAndDelete matches entire opcodes
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0302ff030302ff03");
- d = ScriptFromHex("ff");
+ s = ToScript("0302ff030302ff03"_hex);
+ d = ToScript("ff"_hex);
expect = s;
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
BOOST_CHECK(s == expect);
// This is an odd edge case: strip of the push-three-bytes
// prefix, leaving 02ff03 which is push-two-bytes:
- s = ScriptFromHex("0302ff030302ff03");
- d = ScriptFromHex("03");
- expect = CScript() << ParseHex("ff03") << ParseHex("ff03");
+ s = ToScript("0302ff030302ff03"_hex);
+ d = ToScript("03"_hex);
+ expect = CScript() << "ff03"_hex << "ff03"_hex;
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
BOOST_CHECK(s == expect);
// Byte sequence that spans multiple opcodes:
- s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
- d = ScriptFromHex("feed51");
+ s = ToScript("02feed5169"_hex); // PUSH(0xfeed) OP_1 OP_VERIFY
+ d = ToScript("feed51"_hex);
expect = s;
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0); // doesn't match 'inside' opcodes
BOOST_CHECK(s == expect);
- s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
- d = ScriptFromHex("02feed51");
- expect = ScriptFromHex("69");
+ s = ToScript("02feed5169"_hex); // PUSH(0xfeed) OP_1 OP_VERIFY
+ d = ToScript("02feed51"_hex);
+ expect = ToScript("69"_hex);
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("516902feed5169");
- d = ScriptFromHex("feed51");
+ s = ToScript("516902feed5169"_hex);
+ d = ToScript("feed51"_hex);
expect = s;
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("516902feed5169");
- d = ScriptFromHex("02feed51");
- expect = ScriptFromHex("516969");
+ s = ToScript("516902feed5169"_hex);
+ d = ToScript("02feed51"_hex);
+ expect = ToScript("516969"_hex);
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
@@ -1441,15 +1471,15 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
// Another weird edge case:
// End with invalid push (not enough data)...
- s = ScriptFromHex("0003feed");
- d = ScriptFromHex("03feed"); // ... can remove the invalid push
- expect = ScriptFromHex("00");
+ s = ToScript("0003feed"_hex);
+ d = ToScript("03feed"_hex); // ... can remove the invalid push
+ expect = ToScript("00"_hex);
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
- s = ScriptFromHex("0003feed");
- d = ScriptFromHex("00");
- expect = ScriptFromHex("03feed");
+ s = ToScript("0003feed"_hex);
+ d = ToScript("00"_hex);
+ expect = ToScript("03feed"_hex);
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
BOOST_CHECK(s == expect);
}
@@ -1458,13 +1488,13 @@ BOOST_AUTO_TEST_CASE(script_HasValidOps)
{
// Exercise the HasValidOps functionality
CScript script;
- script = ScriptFromHex("76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"); // Normal script
+ script = ToScript("76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"_hex); // Normal script
BOOST_CHECK(script.HasValidOps());
- script = ScriptFromHex("76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac");
+ script = ToScript("76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"_hex);
BOOST_CHECK(script.HasValidOps());
- script = ScriptFromHex("ff88ac"); // Script with OP_INVALIDOPCODE explicit
+ script = ToScript("ff88ac"_hex); // Script with OP_INVALIDOPCODE explicit
BOOST_CHECK(!script.HasValidOps());
- script = ScriptFromHex("88acc0"); // Script with undefined opcode
+ script = ToScript("88acc0"_hex); // Script with undefined opcode
BOOST_CHECK(!script.HasValidOps());
}
@@ -1526,7 +1556,7 @@ static std::vector<unsigned int> AllConsensusFlags()
/** Precomputed list of all valid combinations of consensus-relevant script validation flags. */
static const std::vector<unsigned int> ALL_CONSENSUS_FLAGS = AllConsensusFlags();
-static void AssetTest(const UniValue& test)
+static void AssetTest(const UniValue& test, SignatureCache& signature_cache)
{
BOOST_CHECK(test.isObject());
@@ -1543,7 +1573,7 @@ static void AssetTest(const UniValue& test)
CTransaction tx(mtx);
PrecomputedTransactionData txdata;
txdata.Init(tx, std::vector<CTxOut>(prevouts));
- CachingTransactionSignatureChecker txcheck(&tx, idx, prevouts[idx].nValue, true, txdata);
+ CachingTransactionSignatureChecker txcheck(&tx, idx, prevouts[idx].nValue, true, signature_cache, txdata);
for (const auto flags : ALL_CONSENSUS_FLAGS) {
// "final": true tests are valid for all flags. Others are only valid with flags that are
@@ -1561,7 +1591,7 @@ static void AssetTest(const UniValue& test)
CTransaction tx(mtx);
PrecomputedTransactionData txdata;
txdata.Init(tx, std::vector<CTxOut>(prevouts));
- CachingTransactionSignatureChecker txcheck(&tx, idx, prevouts[idx].nValue, true, txdata);
+ CachingTransactionSignatureChecker txcheck(&tx, idx, prevouts[idx].nValue, true, signature_cache, txdata);
for (const auto flags : ALL_CONSENSUS_FLAGS) {
// If a test is supposed to fail with test_flags, it should also fail with any superset thereof.
@@ -1577,6 +1607,7 @@ BOOST_AUTO_TEST_CASE(script_assets_test)
{
// See src/test/fuzz/script_assets_test_minimizer.cpp for information on how to generate
// the script_assets_test.json file used by this test.
+ SignatureCache signature_cache{DEFAULT_SIGNATURE_CACHE_BYTES};
const char* dir = std::getenv("DIR_UNIT_TEST_DATA");
BOOST_WARN_MESSAGE(dir != nullptr, "Variable DIR_UNIT_TEST_DATA unset, skipping script_assets_test");
@@ -1597,7 +1628,7 @@ BOOST_AUTO_TEST_CASE(script_assets_test)
BOOST_CHECK(tests.size() > 0);
for (size_t i = 0; i < tests.size(); i++) {
- AssetTest(tests[i]);
+ AssetTest(tests[i], signature_cache);
}
file.close();
}
@@ -1678,17 +1709,17 @@ BOOST_AUTO_TEST_CASE(bip341_keypath_test_vectors)
BOOST_AUTO_TEST_CASE(compute_tapbranch)
{
- uint256 hash1 = uint256S("8ad69ec7cf41c2a4001fd1f738bf1e505ce2277acdcaa63fe4765192497f47a7");
- uint256 hash2 = uint256S("f224a923cd0021ab202ab139cc56802ddb92dcfc172b9212261a539df79a112a");
- uint256 result = uint256S("a64c5b7b943315f9b805d7a7296bedfcfd08919270a1f7a1466e98f8693d8cd9");
+ constexpr uint256 hash1{"8ad69ec7cf41c2a4001fd1f738bf1e505ce2277acdcaa63fe4765192497f47a7"};
+ constexpr uint256 hash2{"f224a923cd0021ab202ab139cc56802ddb92dcfc172b9212261a539df79a112a"};
+ constexpr uint256 result{"a64c5b7b943315f9b805d7a7296bedfcfd08919270a1f7a1466e98f8693d8cd9"};
BOOST_CHECK_EQUAL(ComputeTapbranchHash(hash1, hash2), result);
}
BOOST_AUTO_TEST_CASE(compute_tapleaf)
{
- const uint8_t script[6] = {'f','o','o','b','a','r'};
- uint256 tlc0 = uint256S("edbc10c272a1215dcdcc11d605b9027b5ad6ed97cd45521203f136767b5b9c06");
- uint256 tlc2 = uint256S("8b5c4f90ae6bf76e259dbef5d8a59df06359c391b59263741b25eca76451b27a");
+ constexpr uint8_t script[6] = {'f','o','o','b','a','r'};
+ constexpr uint256 tlc0{"edbc10c272a1215dcdcc11d605b9027b5ad6ed97cd45521203f136767b5b9c06"};
+ constexpr uint256 tlc2{"8b5c4f90ae6bf76e259dbef5d8a59df06359c391b59263741b25eca76451b27a"};
BOOST_CHECK_EQUAL(ComputeTapleafHash(0xc0, Span(script)), tlc0);
BOOST_CHECK_EQUAL(ComputeTapleafHash(0xc2, Span(script)), tlc2);
diff --git a/src/test/serfloat_tests.cpp b/src/test/serfloat_tests.cpp
index 304541074f..4464b0a089 100644
--- a/src/test/serfloat_tests.cpp
+++ b/src/test/serfloat_tests.cpp
@@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE(double_serfloat_tests) {
// These specific bits are the sign bit, and the 2 top and bottom bits of
// exponent and mantissa in the IEEE754 binary64 format.
for (int x = 0; x < 512; ++x) {
- uint64_t v = InsecureRandBits(64);
+ uint64_t v = m_rng.randbits(64);
int x_pos = 0;
for (int v_pos : {0, 1, 50, 51, 52, 53, 61, 62, 63}) {
v &= ~(uint64_t{1} << v_pos);
@@ -139,7 +139,7 @@ BOOST_AUTO_TEST_CASE(doubles)
for (int i = 0; i < 1000; i++) {
ss << EncodeDouble(i);
}
- BOOST_CHECK(Hash(ss) == uint256S("43d0c82591953c4eafe114590d392676a01585d25b25d433557f0d7878b23f96"));
+ BOOST_CHECK(Hash(ss) == uint256{"43d0c82591953c4eafe114590d392676a01585d25b25d433557f0d7878b23f96"});
// decode
for (int i = 0; i < 1000; i++) {
diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp
index 70a18835d2..d3320878ec 100644
--- a/src/test/sighash_tests.cpp
+++ b/src/test/sighash_tests.cpp
@@ -82,39 +82,41 @@ uint256 static SignatureHashOld(CScript scriptCode, const CTransaction& txTo, un
return ss.GetHash();
}
-void static RandomScript(CScript &script) {
+struct SigHashTest : BasicTestingSetup {
+void RandomScript(CScript &script) {
static const opcodetype oplist[] = {OP_FALSE, OP_1, OP_2, OP_3, OP_CHECKSIG, OP_IF, OP_VERIF, OP_RETURN, OP_CODESEPARATOR};
script = CScript();
- int ops = (InsecureRandRange(10));
+ int ops = (m_rng.randrange(10));
for (int i=0; i<ops; i++)
- script << oplist[InsecureRandRange(std::size(oplist))];
+ script << oplist[m_rng.randrange(std::size(oplist))];
}
-void static RandomTransaction(CMutableTransaction& tx, bool fSingle)
+void RandomTransaction(CMutableTransaction& tx, bool fSingle)
{
- tx.version = InsecureRand32();
+ tx.version = m_rng.rand32();
tx.vin.clear();
tx.vout.clear();
- tx.nLockTime = (InsecureRandBool()) ? InsecureRand32() : 0;
- int ins = (InsecureRandBits(2)) + 1;
- int outs = fSingle ? ins : (InsecureRandBits(2)) + 1;
+ tx.nLockTime = (m_rng.randbool()) ? m_rng.rand32() : 0;
+ int ins = (m_rng.randbits(2)) + 1;
+ int outs = fSingle ? ins : (m_rng.randbits(2)) + 1;
for (int in = 0; in < ins; in++) {
tx.vin.emplace_back();
CTxIn &txin = tx.vin.back();
- txin.prevout.hash = Txid::FromUint256(InsecureRand256());
- txin.prevout.n = InsecureRandBits(2);
+ txin.prevout.hash = Txid::FromUint256(m_rng.rand256());
+ txin.prevout.n = m_rng.randbits(2);
RandomScript(txin.scriptSig);
- txin.nSequence = (InsecureRandBool()) ? InsecureRand32() : std::numeric_limits<uint32_t>::max();
+ txin.nSequence = (m_rng.randbool()) ? m_rng.rand32() : std::numeric_limits<uint32_t>::max();
}
for (int out = 0; out < outs; out++) {
tx.vout.emplace_back();
CTxOut &txout = tx.vout.back();
- txout.nValue = InsecureRandMoneyAmount();
+ txout.nValue = RandMoney(m_rng);
RandomScript(txout.scriptPubKey);
}
}
+}; // struct SigHashTest
-BOOST_FIXTURE_TEST_SUITE(sighash_tests, BasicTestingSetup)
+BOOST_FIXTURE_TEST_SUITE(sighash_tests, SigHashTest)
BOOST_AUTO_TEST_CASE(sighash_test)
{
@@ -126,12 +128,12 @@ BOOST_AUTO_TEST_CASE(sighash_test)
int nRandomTests = 50000;
#endif
for (int i=0; i<nRandomTests; i++) {
- int nHashType{int(InsecureRand32())};
+ int nHashType{int(m_rng.rand32())};
CMutableTransaction txTo;
RandomTransaction(txTo, (nHashType & 0x1f) == SIGHASH_SINGLE);
CScript scriptCode;
RandomScript(scriptCode);
- int nIn = InsecureRandRange(txTo.vin.size());
+ int nIn = m_rng.randrange(txTo.vin.size());
uint256 sh, sho;
sho = SignatureHashOld(scriptCode, CTransaction(txTo), nIn, nHashType);
diff --git a/src/test/skiplist_tests.cpp b/src/test/skiplist_tests.cpp
index 050033e43a..7ffa6f641e 100644
--- a/src/test/skiplist_tests.cpp
+++ b/src/test/skiplist_tests.cpp
@@ -34,8 +34,8 @@ BOOST_AUTO_TEST_CASE(skiplist_test)
}
for (int i=0; i < 1000; i++) {
- int from = InsecureRandRange(SKIPLIST_LENGTH - 1);
- int to = InsecureRandRange(from + 1);
+ int from = m_rng.randrange(SKIPLIST_LENGTH - 1);
+ int to = m_rng.randrange(from + 1);
BOOST_CHECK(vIndex[SKIPLIST_LENGTH - 1].GetAncestor(from) == &vIndex[from]);
BOOST_CHECK(vIndex[from].GetAncestor(to) == &vIndex[to]);
@@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE(getlocator_test)
// Test 100 random starting points for locators.
for (int n=0; n<100; n++) {
- int r = InsecureRandRange(150000);
+ int r = m_rng.randrange(150000);
CBlockIndex* tip = (r < 100000) ? &vBlocksMain[r] : &vBlocksSide[r - 100000];
CBlockLocator locator = GetLocator(tip);
@@ -115,7 +115,7 @@ BOOST_AUTO_TEST_CASE(findearliestatleast_test)
} else {
// randomly choose something in the range [MTP, MTP*2]
int64_t medianTimePast = vBlocksMain[i].GetMedianTimePast();
- int r{int(InsecureRandRange(medianTimePast))};
+ int r{int(m_rng.randrange(medianTimePast))};
vBlocksMain[i].nTime = uint32_t(r + medianTimePast);
vBlocksMain[i].nTimeMax = std::max(vBlocksMain[i].nTime, vBlocksMain[i-1].nTimeMax);
}
@@ -134,7 +134,7 @@ BOOST_AUTO_TEST_CASE(findearliestatleast_test)
// Verify that FindEarliestAtLeast is correct.
for (unsigned int i=0; i<10000; ++i) {
// Pick a random element in vBlocksMain.
- int r = InsecureRandRange(vBlocksMain.size());
+ int r = m_rng.randrange(vBlocksMain.size());
int64_t test_time = vBlocksMain[r].nTime;
CBlockIndex* ret = chain.FindEarliestAtLeast(test_time, 0);
BOOST_CHECK(ret->nTimeMax >= test_time);
diff --git a/src/test/streams_tests.cpp b/src/test/streams_tests.cpp
index e666e11758..777122df6d 100644
--- a/src/test/streams_tests.cpp
+++ b/src/test/streams_tests.cpp
@@ -30,8 +30,7 @@ BOOST_AUTO_TEST_CASE(xor_file)
}
{
#ifdef __MINGW64__
- // Our usage of mingw-w64 and the msvcrt runtime does not support
- // the x modifier for the _wfopen().
+ // Temporary workaround for https://github.com/bitcoin/bitcoin/issues/30210
const char* mode = "wb";
#else
const char* mode = "wbx";
@@ -262,7 +261,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file)
for (uint8_t j = 0; j < 40; ++j) {
file << j;
}
- std::rewind(file.Get());
+ file.seek(0, SEEK_SET);
// The buffer size (second arg) must be greater than the rewind
// amount (third arg).
@@ -392,7 +391,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_skip)
for (uint8_t j = 0; j < 40; ++j) {
file << j;
}
- std::rewind(file.Get());
+ file.seek(0, SEEK_SET);
// The buffer is 25 bytes, allow rewinding 10 bytes.
BufferedFile bf{file, 25, 10};
@@ -436,19 +435,19 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_skip)
BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
{
// Make this test deterministic.
- SeedInsecureRand(SeedRand::ZEROS);
+ SeedRandomForTest(SeedRand::ZEROS);
fs::path streams_test_filename = m_args.GetDataDirBase() / "streams_test_tmp";
for (int rep = 0; rep < 50; ++rep) {
AutoFile file{fsbridge::fopen(streams_test_filename, "w+b")};
- size_t fileSize = InsecureRandRange(256);
+ size_t fileSize = m_rng.randrange(256);
for (uint8_t i = 0; i < fileSize; ++i) {
file << i;
}
- std::rewind(file.Get());
+ file.seek(0, SEEK_SET);
- size_t bufSize = InsecureRandRange(300) + 1;
- size_t rewindSize = InsecureRandRange(bufSize);
+ size_t bufSize = m_rng.randrange(300) + 1;
+ size_t rewindSize = m_rng.randrange(bufSize);
BufferedFile bf{file, bufSize, rewindSize};
size_t currentPos = 0;
size_t maxPos = 0;
@@ -464,7 +463,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
// sizes; the boundaries of the objects can interact arbitrarily
// with the CBufferFile's internal buffer. These first three
// cases simulate objects of various sizes (1, 2, 5 bytes).
- switch (InsecureRandRange(6)) {
+ switch (m_rng.randrange(6)) {
case 0: {
uint8_t a[1];
if (currentPos + 1 > fileSize)
@@ -504,7 +503,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
case 3: {
// SkipTo is similar to the "read" cases above, except
// we don't receive the data.
- size_t skip_length{static_cast<size_t>(InsecureRandRange(5))};
+ size_t skip_length{static_cast<size_t>(m_rng.randrange(5))};
if (currentPos + skip_length > fileSize) continue;
bf.SetLimit(currentPos + skip_length);
bf.SkipTo(currentPos + skip_length);
@@ -513,7 +512,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
}
case 4: {
// Find a byte value (that is at or ahead of the current position).
- size_t find = currentPos + InsecureRandRange(8);
+ size_t find = currentPos + m_rng.randrange(8);
if (find >= fileSize)
find = fileSize - 1;
bf.FindByte(std::byte(find));
@@ -529,7 +528,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
break;
}
case 5: {
- size_t requestPos = InsecureRandRange(maxPos + 4);
+ size_t requestPos = m_rng.randrange(maxPos + 4);
bool okay = bf.SetPos(requestPos);
// The new position may differ from the requested position
// because we may not be able to rewind beyond the rewind
diff --git a/src/test/system_tests.cpp b/src/test/system_tests.cpp
index baa759e42c..7a9a14d5ac 100644
--- a/src/test/system_tests.cpp
+++ b/src/test/system_tests.cpp
@@ -16,13 +16,6 @@
BOOST_FIXTURE_TEST_SUITE(system_tests, BasicTestingSetup)
-// At least one test is required (in case ENABLE_EXTERNAL_SIGNER is not defined).
-// Workaround for https://github.com/bitcoin/bitcoin/issues/19128
-BOOST_AUTO_TEST_CASE(dummy)
-{
- BOOST_CHECK(true);
-}
-
#ifdef ENABLE_EXTERNAL_SIGNER
BOOST_AUTO_TEST_CASE(run_command)
@@ -54,8 +47,8 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// Return non-zero exit code, with error message for stderr
- const std::string command{"ls nosuchfile"};
- const std::string expected{"No such file or directory"};
+ const std::string command{"sh -c 'echo err 1>&2 && false'"};
+ const std::string expected{"err"};
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);
diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp
index 34176626f0..3430a5bbfa 100644
--- a/src/test/transaction_tests.cpp
+++ b/src/test/transaction_tests.cpp
@@ -17,6 +17,7 @@
#include <policy/settings.h>
#include <script/script.h>
#include <script/script_error.h>
+#include <script/sigcache.h>
#include <script/sign.h>
#include <script/signingprovider.h>
#include <script/solver.h>
@@ -38,6 +39,7 @@
#include <univalue.h>
+using namespace util::hex_literals;
using util::SplitString;
using util::ToString;
@@ -222,7 +224,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
fValid = false;
break;
}
- COutPoint outpoint{TxidFromString(vinput[0].get_str()), uint32_t(vinput[1].getInt<int>())};
+ COutPoint outpoint{Txid::FromHex(vinput[0].get_str()).value(), uint32_t(vinput[1].getInt<int>())};
mapprevOutScriptPubKeys[outpoint] = ParseScript(vinput[2].get_str());
if (vinput.size() >= 4)
{
@@ -262,7 +264,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
BOOST_ERROR("Tx unexpectedly failed with flag " << name << " unset: " << strTest);
}
// Removing random combinations of flags
- flags = TrimFlags(~(verify_flags | (unsigned int)InsecureRandBits(mapFlagNames.size())));
+ flags = TrimFlags(~(verify_flags | (unsigned int)m_rng.randbits(mapFlagNames.size())));
if (!CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues, flags, txdata, strTest, /*expect_valid=*/true)) {
BOOST_ERROR("Tx unexpectedly failed with random flags " << ToString(flags) << ": " << strTest);
}
@@ -310,7 +312,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
fValid = false;
break;
}
- COutPoint outpoint{TxidFromString(vinput[0].get_str()), uint32_t(vinput[1].getInt<int>())};
+ COutPoint outpoint{Txid::FromHex(vinput[0].get_str()).value(), uint32_t(vinput[1].getInt<int>())};
mapprevOutScriptPubKeys[outpoint] = ParseScript(vinput[2].get_str());
if (vinput.size() >= 4)
{
@@ -353,7 +355,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
BOOST_ERROR("Tx unexpectedly passed with flag " << name << " set: " << strTest);
}
// Adding random combinations of flags
- flags = FillFlags(verify_flags | (unsigned int)InsecureRandBits(mapFlagNames.size()));
+ flags = FillFlags(verify_flags | (unsigned int)m_rng.randbits(mapFlagNames.size()));
if (!CheckTxScripts(tx, mapprevOutScriptPubKeys, mapprevOutValues, flags, txdata, strTest, /*expect_valid=*/false)) {
BOOST_ERROR("Tx unexpectedly passed with random flags " << name << ": " << strTest);
}
@@ -541,7 +543,7 @@ BOOST_AUTO_TEST_CASE(test_big_witness_transaction)
// create a big transaction of 4500 inputs signed by the same key
for(uint32_t ij = 0; ij < 4500; ij++) {
uint32_t i = mtx.vin.size();
- COutPoint outpoint(TxidFromString("0000000000000000000000000000000000000000000000000000000000000100"), i);
+ COutPoint outpoint(Txid::FromHex("0000000000000000000000000000000000000000000000000000000000000100").value(), i);
mtx.vin.resize(mtx.vin.size() + 1);
mtx.vin[i].prevout = outpoint;
@@ -578,9 +580,11 @@ BOOST_AUTO_TEST_CASE(test_big_witness_transaction)
coins.emplace_back(std::move(coin));
}
+ SignatureCache signature_cache{DEFAULT_SIGNATURE_CACHE_BYTES};
+
for(uint32_t i = 0; i < mtx.vin.size(); i++) {
std::vector<CScriptCheck> vChecks;
- vChecks.emplace_back(coins[tx.vin[i].prevout.n].out, tx, i, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false, &txdata);
+ vChecks.emplace_back(coins[tx.vin[i].prevout.n].out, tx, signature_cache, i, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false, &txdata);
control.Add(std::move(vChecks));
}
@@ -848,24 +852,24 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
CheckIsNotStandard(t, "scriptpubkey");
// MAX_OP_RETURN_RELAY-byte TxoutType::NULL_DATA (standard)
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"_hex;
BOOST_CHECK_EQUAL(MAX_OP_RETURN_RELAY, t.vout[0].scriptPubKey.size());
CheckIsStandard(t);
// MAX_OP_RETURN_RELAY+1-byte TxoutType::NULL_DATA (non-standard)
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3800");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3800"_hex;
BOOST_CHECK_EQUAL(MAX_OP_RETURN_RELAY + 1, t.vout[0].scriptPubKey.size());
CheckIsNotStandard(t, "scriptpubkey");
// Data payload can be encoded in any way...
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << ""_hex;
CheckIsStandard(t);
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("00") << ParseHex("01");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "00"_hex << "01"_hex;
CheckIsStandard(t);
// OP_RESERVED *is* considered to be a PUSHDATA type opcode by IsPushOnly()!
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << OP_RESERVED << -1 << 0 << ParseHex("01") << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16;
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << OP_RESERVED << -1 << 0 << "01"_hex << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16;
CheckIsStandard(t);
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << 0 << ParseHex("01") << 2 << ParseHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << 0 << "01"_hex << 2 << "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"_hex;
CheckIsStandard(t);
// ...so long as it only contains PUSHDATA's
@@ -879,13 +883,13 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
// Only one TxoutType::NULL_DATA permitted in all cases
t.vout.resize(2);
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"_hex;
t.vout[0].nValue = 0;
- t.vout[1].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
+ t.vout[1].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"_hex;
t.vout[1].nValue = 0;
CheckIsNotStandard(t, "multi-op-return");
- t.vout[0].scriptPubKey = CScript() << OP_RETURN << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38");
+ t.vout[0].scriptPubKey = CScript() << OP_RETURN << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"_hex;
t.vout[1].scriptPubKey = CScript() << OP_RETURN;
CheckIsNotStandard(t, "multi-op-return");
@@ -1023,6 +1027,14 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
t.vout[0].nValue = 239;
CheckIsNotStandard(t, "dust");
}
+
+ // Check anchor outputs
+ t.vout[0].scriptPubKey = CScript() << OP_1 << std::vector<unsigned char>{0x4e, 0x73};
+ BOOST_CHECK(t.vout[0].scriptPubKey.IsPayToAnchor());
+ t.vout[0].nValue = 240;
+ CheckIsStandard(t);
+ t.vout[0].nValue = 239;
+ CheckIsNotStandard(t, "dust");
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/txpackage_tests.cpp b/src/test/txpackage_tests.cpp
index 478121cc6f..ea211aedf3 100644
--- a/src/test/txpackage_tests.cpp
+++ b/src/test/txpackage_tests.cpp
@@ -20,20 +20,22 @@
#include <boost/test/unit_test.hpp>
-BOOST_AUTO_TEST_SUITE(txpackage_tests)
+using namespace util::hex_literals;
+
// A fee amount that is above 1sat/vB but below 5sat/vB for most transactions created within these
// unit tests.
static const CAmount low_fee_amt{200};
+struct TxPackageTest : TestChain100Setup {
// Create placeholder transactions that have no meaning.
inline CTransactionRef create_placeholder_tx(size_t num_inputs, size_t num_outputs)
{
CMutableTransaction mtx = CMutableTransaction();
mtx.vin.resize(num_inputs);
mtx.vout.resize(num_outputs);
- auto random_script = CScript() << ToByteVector(InsecureRand256()) << ToByteVector(InsecureRand256());
+ auto random_script = CScript() << ToByteVector(m_rng.rand256()) << ToByteVector(m_rng.rand256());
for (size_t i{0}; i < num_inputs; ++i) {
- mtx.vin[i].prevout.hash = Txid::FromUint256(InsecureRand256());
+ mtx.vin[i].prevout.hash = Txid::FromUint256(m_rng.rand256());
mtx.vin[i].prevout.n = 0;
mtx.vin[i].scriptSig = random_script;
}
@@ -43,40 +45,37 @@ inline CTransactionRef create_placeholder_tx(size_t num_inputs, size_t num_outpu
}
return MakeTransactionRef(mtx);
}
+}; // struct TxPackageTest
-// Create a Wtxid from a hex string
-inline Wtxid WtxidFromString(std::string_view str)
-{
- return Wtxid::FromUint256(uint256S(str.data()));
-}
+BOOST_FIXTURE_TEST_SUITE(txpackage_tests, TxPackageTest)
-BOOST_FIXTURE_TEST_CASE(package_hash_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_hash_tests)
{
// Random real segwit transaction
DataStream stream_1{
- ParseHex("02000000000101964b8aa63509579ca6086e6012eeaa4c2f4dd1e283da29b67c8eea38b3c6fd220000000000fdffffff0294c618000000000017a9145afbbb42f4e83312666d0697f9e66259912ecde38768fa2c0000000000160014897388a0889390fd0e153a22bb2cf9d8f019faf50247304402200547406380719f84d68cf4e96cc3e4a1688309ef475b150be2b471c70ea562aa02206d255f5acc40fd95981874d77201d2eb07883657ce1c796513f32b6079545cdf0121023ae77335cefcb5ab4c1dc1fb0d2acfece184e593727d7d5906c78e564c7c11d125cf0c00"),
+ "02000000000101964b8aa63509579ca6086e6012eeaa4c2f4dd1e283da29b67c8eea38b3c6fd220000000000fdffffff0294c618000000000017a9145afbbb42f4e83312666d0697f9e66259912ecde38768fa2c0000000000160014897388a0889390fd0e153a22bb2cf9d8f019faf50247304402200547406380719f84d68cf4e96cc3e4a1688309ef475b150be2b471c70ea562aa02206d255f5acc40fd95981874d77201d2eb07883657ce1c796513f32b6079545cdf0121023ae77335cefcb5ab4c1dc1fb0d2acfece184e593727d7d5906c78e564c7c11d125cf0c00"_hex,
};
CTransaction tx_1(deserialize, TX_WITH_WITNESS, stream_1);
CTransactionRef ptx_1{MakeTransactionRef(tx_1)};
// Random real nonsegwit transaction
DataStream stream_2{
- ParseHex("01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"),
+ "01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"_hex,
};
CTransaction tx_2(deserialize, TX_WITH_WITNESS, stream_2);
CTransactionRef ptx_2{MakeTransactionRef(tx_2)};
// Random real segwit transaction
DataStream stream_3{
- ParseHex("0200000000010177862801f77c2c068a70372b4c435ef8dd621291c36a64eb4dd491f02218f5324600000000fdffffff014a0100000000000022512035ea312034cfac01e956a269f3bf147f569c2fbb00180677421262da042290d803402be713325ff285e66b0380f53f2fae0d0fb4e16f378a440fed51ce835061437566729d4883bc917632f3cff474d6384bc8b989961a1d730d4a87ed38ad28bd337b20f1d658c6c138b1c312e072b4446f50f01ae0da03a42e6274f8788aae53416a7fac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800357b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a224342414c222c22616d74223a2236393639227d6821c1f1d658c6c138b1c312e072b4446f50f01ae0da03a42e6274f8788aae53416a7f00000000"),
+ "0200000000010177862801f77c2c068a70372b4c435ef8dd621291c36a64eb4dd491f02218f5324600000000fdffffff014a0100000000000022512035ea312034cfac01e956a269f3bf147f569c2fbb00180677421262da042290d803402be713325ff285e66b0380f53f2fae0d0fb4e16f378a440fed51ce835061437566729d4883bc917632f3cff474d6384bc8b989961a1d730d4a87ed38ad28bd337b20f1d658c6c138b1c312e072b4446f50f01ae0da03a42e6274f8788aae53416a7fac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800357b2270223a226272632d3230222c226f70223a226d696e74222c227469636b223a224342414c222c22616d74223a2236393639227d6821c1f1d658c6c138b1c312e072b4446f50f01ae0da03a42e6274f8788aae53416a7f00000000"_hex,
};
CTransaction tx_3(deserialize, TX_WITH_WITNESS, stream_3);
CTransactionRef ptx_3{MakeTransactionRef(tx_3)};
// It's easy to see that wtxids are sorted in lexicographical order:
- Wtxid wtxid_1{WtxidFromString("0x85cd1a31eb38f74ed5742ec9cb546712ab5aaf747de28a9168b53e846cbda17f")};
- Wtxid wtxid_2{WtxidFromString("0xb4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b")};
- Wtxid wtxid_3{WtxidFromString("0xe065bac15f62bb4e761d761db928ddee65a47296b2b776785abb912cdec474e3")};
+ Wtxid wtxid_1{Wtxid::FromHex("85cd1a31eb38f74ed5742ec9cb546712ab5aaf747de28a9168b53e846cbda17f").value()};
+ Wtxid wtxid_2{Wtxid::FromHex("b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b").value()};
+ Wtxid wtxid_3{Wtxid::FromHex("e065bac15f62bb4e761d761db928ddee65a47296b2b776785abb912cdec474e3").value()};
BOOST_CHECK_EQUAL(tx_1.GetWitnessHash(), wtxid_1);
BOOST_CHECK_EQUAL(tx_2.GetWitnessHash(), wtxid_2);
BOOST_CHECK_EQUAL(tx_3.GetWitnessHash(), wtxid_3);
@@ -85,9 +84,9 @@ BOOST_FIXTURE_TEST_CASE(package_hash_tests, TestChain100Setup)
BOOST_CHECK(wtxid_2.GetHex() < wtxid_3.GetHex());
// The txids are not (we want to test that sorting and hashing use wtxid, not txid):
- Txid txid_1{TxidFromString("0xbd0f71c1d5e50589063e134fad22053cdae5ab2320db5bf5e540198b0b5a4e69")};
- Txid txid_2{TxidFromString("0xb4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b")};
- Txid txid_3{TxidFromString("0xee707be5201160e32c4fc715bec227d1aeea5940fb4295605e7373edce3b1a93")};
+ Txid txid_1{Txid::FromHex("bd0f71c1d5e50589063e134fad22053cdae5ab2320db5bf5e540198b0b5a4e69").value()};
+ Txid txid_2{Txid::FromHex("b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b").value()};
+ Txid txid_3{Txid::FromHex("ee707be5201160e32c4fc715bec227d1aeea5940fb4295605e7373edce3b1a93").value()};
BOOST_CHECK_EQUAL(tx_1.GetHash(), txid_1);
BOOST_CHECK_EQUAL(tx_2.GetHash(), txid_2);
BOOST_CHECK_EQUAL(tx_3.GetHash(), txid_3);
@@ -131,7 +130,7 @@ BOOST_FIXTURE_TEST_CASE(package_hash_tests, TestChain100Setup)
BOOST_CHECK_EQUAL(calculated_hash_123, GetPackageHash(package_321));
}
-BOOST_FIXTURE_TEST_CASE(package_sanitization_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_sanitization_tests)
{
// Packages can't have more than 25 transactions.
Package package_too_many;
@@ -174,7 +173,7 @@ BOOST_FIXTURE_TEST_CASE(package_sanitization_tests, TestChain100Setup)
// Packages can't have transactions spending the same prevout
CMutableTransaction tx_zero_1;
CMutableTransaction tx_zero_2;
- COutPoint same_prevout{Txid::FromUint256(InsecureRand256()), 0};
+ COutPoint same_prevout{Txid::FromUint256(m_rng.rand256()), 0};
tx_zero_1.vin.emplace_back(same_prevout);
tx_zero_2.vin.emplace_back(same_prevout);
// Different vouts (not the same tx)
@@ -192,7 +191,7 @@ BOOST_FIXTURE_TEST_CASE(package_sanitization_tests, TestChain100Setup)
// IsConsistentPackage only cares about conflicts between transactions, not about a transaction
// conflicting with itself (i.e. duplicate prevouts in vin).
CMutableTransaction dup_tx;
- const COutPoint rand_prevout{Txid::FromUint256(InsecureRand256()), 0};
+ const COutPoint rand_prevout{Txid::FromUint256(m_rng.rand256()), 0};
dup_tx.vin.emplace_back(rand_prevout);
dup_tx.vin.emplace_back(rand_prevout);
Package package_with_dup_tx{MakeTransactionRef(dup_tx)};
@@ -201,7 +200,7 @@ BOOST_FIXTURE_TEST_CASE(package_sanitization_tests, TestChain100Setup)
BOOST_CHECK(IsConsistentPackage(package_with_dup_tx));
}
-BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_validation_tests)
{
LOCK(cs_main);
unsigned int initialPoolSize = m_node.mempool->size();
@@ -256,7 +255,7 @@ BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
BOOST_CHECK_EQUAL(m_node.mempool->size(), initialPoolSize);
}
-BOOST_FIXTURE_TEST_CASE(noncontextual_package_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(noncontextual_package_tests)
{
// The signatures won't be verified so we can just use a placeholder
CKey placeholder_key = GenerateRandomKey();
@@ -303,7 +302,7 @@ BOOST_FIXTURE_TEST_CASE(noncontextual_package_tests, TestChain100Setup)
// The parents can be in any order.
FastRandomContext rng;
- Shuffle(package.begin(), package.end(), rng);
+ std::shuffle(package.begin(), package.end(), rng);
package.push_back(MakeTransactionRef(child));
PackageValidationState state;
@@ -352,7 +351,7 @@ BOOST_FIXTURE_TEST_CASE(noncontextual_package_tests, TestChain100Setup)
}
}
-BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_submission_tests)
{
LOCK(cs_main);
unsigned int expected_pool_size = m_node.mempool->size();
@@ -495,7 +494,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
// Tests for packages containing transactions that have same-txid-different-witness equivalents in
// the mempool.
-BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_witness_swap_tests)
{
// Mine blocks to mature coinbases.
mineBlocks(5);
@@ -729,7 +728,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
}
}
-BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_cpfp_tests)
{
mineBlocks(5);
MockMempoolMinFee(CFeeRate(5000));
@@ -940,7 +939,7 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
}
}
-BOOST_FIXTURE_TEST_CASE(package_rbf_tests, TestChain100Setup)
+BOOST_AUTO_TEST_CASE(package_rbf_tests)
{
mineBlocks(5);
LOCK(::cs_main);
diff --git a/src/test/txrequest_tests.cpp b/src/test/txrequest_tests.cpp
index dc257a0d51..6bb732ba69 100644
--- a/src/test/txrequest_tests.cpp
+++ b/src/test/txrequest_tests.cpp
@@ -15,10 +15,23 @@
#include <boost/test/unit_test.hpp>
-BOOST_FIXTURE_TEST_SUITE(txrequest_tests, BasicTestingSetup)
-
namespace {
+class Scenario;
+
+struct TxRequestTest : BasicTestingSetup {
+ std::chrono::microseconds RandomTime8s();
+ std::chrono::microseconds RandomTime1y();
+ void BuildSingleTest(Scenario& scenario, int config);
+ void BuildPriorityTest(Scenario& scenario, int config);
+ void BuildBigPriorityTest(Scenario& scenario, int peers);
+ void BuildRequestOrderTest(Scenario& scenario, int config);
+ void BuildWtxidTest(Scenario& scenario, int config);
+ void BuildTimeBackwardsTest(Scenario& scenario);
+ void BuildWeirdRequestsTest(Scenario& scenario);
+ void TestInterleavedScenarios();
+};
+
constexpr std::chrono::microseconds MIN_TIME = std::chrono::microseconds::min();
constexpr std::chrono::microseconds MAX_TIME = std::chrono::microseconds::max();
constexpr std::chrono::microseconds MICROSECOND = std::chrono::microseconds{1};
@@ -51,8 +64,8 @@ struct Runner
std::multiset<std::pair<NodeId, GenTxid>> expired;
};
-std::chrono::microseconds RandomTime8s() { return std::chrono::microseconds{1 + InsecureRandBits(23)}; }
-std::chrono::microseconds RandomTime1y() { return std::chrono::microseconds{1 + InsecureRandBits(45)}; }
+std::chrono::microseconds TxRequestTest::RandomTime8s() { return std::chrono::microseconds{1 + m_rng.randbits(23)}; }
+std::chrono::microseconds TxRequestTest::RandomTime1y() { return std::chrono::microseconds{1 + m_rng.randbits(45)}; }
/** A proxy for a Runner that helps build a sequence of consecutive test actions on a TxRequestTracker.
*
@@ -65,12 +78,13 @@ std::chrono::microseconds RandomTime1y() { return std::chrono::microseconds{1 +
*/
class Scenario
{
+ FastRandomContext& m_rng;
Runner& m_runner;
std::chrono::microseconds m_now;
std::string m_testname;
public:
- Scenario(Runner& runner, std::chrono::microseconds starttime) : m_runner(runner), m_now(starttime) {}
+ Scenario(FastRandomContext& rng, Runner& runner, std::chrono::microseconds starttime) : m_rng(rng), m_runner(runner), m_now(starttime) {}
/** Set a name for the current test, to give more clear error messages. */
void SetTestName(std::string testname)
@@ -199,7 +213,7 @@ public:
uint256 ret;
bool ok;
do {
- ret = InsecureRand256();
+ ret = m_rng.rand256();
ok = true;
for (const auto& order : orders) {
for (size_t pos = 1; pos < order.size(); ++pos) {
@@ -222,7 +236,7 @@ public:
/** Generate a random GenTxid; the txhash follows NewTxHash; the is_wtxid flag is random. */
GenTxid NewGTxid(const std::vector<std::vector<NodeId>>& orders = {})
{
- return InsecureRandBool() ? GenTxid::Wtxid(NewTxHash(orders)) : GenTxid::Txid(NewTxHash(orders));
+ return m_rng.randbool() ? GenTxid::Wtxid(NewTxHash(orders)) : GenTxid::Txid(NewTxHash(orders));
}
/** Generate a new random NodeId to use as peer. The same NodeId is never returned twice
@@ -232,7 +246,7 @@ public:
bool ok;
NodeId ret;
do {
- ret = InsecureRandBits(63);
+ ret = m_rng.randbits(63);
ok = m_runner.peerset.insert(ret).second;
} while(!ok);
return ret;
@@ -245,7 +259,7 @@ public:
*
* config is an integer in [0, 32), which controls which variant of the test is used.
*/
-void BuildSingleTest(Scenario& scenario, int config)
+void TxRequestTest::BuildSingleTest(Scenario& scenario, int config)
{
auto peer = scenario.NewPeer();
auto gtxid = scenario.NewGTxid();
@@ -282,7 +296,7 @@ void BuildSingleTest(Scenario& scenario, int config)
scenario.CheckExpired(peer, gtxid);
return;
} else {
- scenario.AdvanceTime(std::chrono::microseconds{InsecureRandRange(expiry.count())});
+ scenario.AdvanceTime(std::chrono::microseconds{m_rng.randrange(expiry.count())});
scenario.Check(peer, {}, 0, 1, 0, "s9");
if ((config >> 3) == 3) { // A response will arrive for the transaction
scenario.ReceivedResponse(peer, gtxid.GetHash());
@@ -305,7 +319,7 @@ void BuildSingleTest(Scenario& scenario, int config)
*
* config is an integer in [0, 32), which controls which variant of the test is used.
*/
-void BuildPriorityTest(Scenario& scenario, int config)
+void TxRequestTest::BuildPriorityTest(Scenario& scenario, int config)
{
scenario.SetTestName(strprintf("Priority(config=%i)", config));
@@ -319,7 +333,7 @@ void BuildPriorityTest(Scenario& scenario, int config)
scenario.ReceivedInv(peer1, gtxid, pref1, MIN_TIME);
scenario.Check(peer1, {gtxid}, 1, 0, 0, "p1");
- if (InsecureRandBool()) {
+ if (m_rng.randbool()) {
scenario.AdvanceTime(RandomTime8s());
scenario.Check(peer1, {gtxid}, 1, 0, 0, "p2");
}
@@ -335,7 +349,7 @@ void BuildPriorityTest(Scenario& scenario, int config)
NodeId priopeer = stage2_prio ? peer2 : peer1, otherpeer = stage2_prio ? peer1 : peer2;
scenario.Check(otherpeer, {}, 1, 0, 0, "p3");
scenario.Check(priopeer, {gtxid}, 1, 0, 0, "p4");
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.Check(otherpeer, {}, 1, 0, 0, "p5");
scenario.Check(priopeer, {gtxid}, 1, 0, 0, "p6");
@@ -344,7 +358,7 @@ void BuildPriorityTest(Scenario& scenario, int config)
scenario.RequestedTx(priopeer, gtxid.GetHash(), MAX_TIME);
scenario.Check(priopeer, {}, 0, 1, 0, "p7");
scenario.Check(otherpeer, {}, 1, 0, 0, "p8");
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
}
// The peer which was selected (or requested from) now goes offline, or a NOTFOUND is received from them.
@@ -353,28 +367,28 @@ void BuildPriorityTest(Scenario& scenario, int config)
} else {
scenario.ReceivedResponse(priopeer, gtxid.GetHash());
}
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.Check(priopeer, {}, 0, 0, !(config & 16), "p8");
scenario.Check(otherpeer, {gtxid}, 1, 0, 0, "p9");
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
// Now the other peer goes offline.
scenario.DisconnectedPeer(otherpeer);
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.Check(peer1, {}, 0, 0, 0, "p10");
scenario.Check(peer2, {}, 0, 0, 0, "p11");
}
/** Add to scenario a randomized test in which N peers announce the same transaction, to verify
* the order in which they are requested. */
-void BuildBigPriorityTest(Scenario& scenario, int peers)
+void TxRequestTest::BuildBigPriorityTest(Scenario& scenario, int peers)
{
scenario.SetTestName(strprintf("BigPriority(peers=%i)", peers));
// We will have N peers announce the same transaction.
std::map<NodeId, bool> preferred;
std::vector<NodeId> pref_peers, npref_peers;
- int num_pref = InsecureRandRange(peers + 1) ; // Some preferred, ...
+ int num_pref = m_rng.randrange(peers + 1) ; // Some preferred, ...
int num_npref = peers - num_pref; // some not preferred.
for (int i = 0; i < num_pref; ++i) {
pref_peers.push_back(scenario.NewPeer());
@@ -392,7 +406,7 @@ void BuildBigPriorityTest(Scenario& scenario, int peers)
// Determine the announcement order randomly.
std::vector<NodeId> announce_order = request_order;
- Shuffle(announce_order.begin(), announce_order.end(), g_insecure_rand_ctx);
+ std::shuffle(announce_order.begin(), announce_order.end(), m_rng);
// Find a gtxid whose txhash prioritization is consistent with the required ordering within pref_peers and
// within npref_peers.
@@ -427,11 +441,11 @@ void BuildBigPriorityTest(Scenario& scenario, int peers)
// Peers now in random order go offline, or send NOTFOUNDs. At every point in time the new to-be-requested-from
// peer should be the best remaining one, so verify this after every response.
for (int i = 0; i < peers; ++i) {
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
- const int pos = InsecureRandRange(request_order.size());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
+ const int pos = m_rng.randrange(request_order.size());
const auto peer = request_order[pos];
request_order.erase(request_order.begin() + pos);
- if (InsecureRandBool()) {
+ if (m_rng.randbool()) {
scenario.DisconnectedPeer(peer);
scenario.Check(peer, {}, 0, 0, 0, "b4");
} else {
@@ -454,7 +468,7 @@ void BuildBigPriorityTest(Scenario& scenario, int peers)
*
* config is an integer in [0, 4) inclusive, and selects the variant of the test.
*/
-void BuildRequestOrderTest(Scenario& scenario, int config)
+void TxRequestTest::BuildRequestOrderTest(Scenario& scenario, int config)
{
scenario.SetTestName(strprintf("RequestOrder(config=%i)", config));
@@ -489,7 +503,7 @@ void BuildRequestOrderTest(Scenario& scenario, int config)
*
* config is an integer in [0, 4) inclusive, and selects the variant of the test used.
*/
-void BuildWtxidTest(Scenario& scenario, int config)
+void TxRequestTest::BuildWtxidTest(Scenario& scenario, int config)
{
scenario.SetTestName(strprintf("Wtxid(config=%i)", config));
@@ -499,17 +513,17 @@ void BuildWtxidTest(Scenario& scenario, int config)
auto txid{GenTxid::Txid(txhash)};
auto wtxid{GenTxid::Wtxid(txhash)};
- auto reqtimeT = InsecureRandBool() ? MIN_TIME : scenario.Now() + RandomTime8s();
- auto reqtimeW = InsecureRandBool() ? MIN_TIME : scenario.Now() + RandomTime8s();
+ auto reqtimeT = m_rng.randbool() ? MIN_TIME : scenario.Now() + RandomTime8s();
+ auto reqtimeW = m_rng.randbool() ? MIN_TIME : scenario.Now() + RandomTime8s();
// Announce txid first or wtxid first.
if (config & 1) {
scenario.ReceivedInv(peerT, txid, config & 2, reqtimeT);
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peerW, wtxid, !(config & 2), reqtimeW);
} else {
scenario.ReceivedInv(peerW, wtxid, !(config & 2), reqtimeW);
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peerT, txid, config & 2, reqtimeT);
}
@@ -552,14 +566,14 @@ void BuildWtxidTest(Scenario& scenario, int config)
// If a good transaction with either that hash as wtxid or txid arrives, both
// announcements are gone.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ForgetTxHash(txhash);
scenario.Check(peerT, {}, 0, 0, 0, "w13");
scenario.Check(peerW, {}, 0, 0, 0, "w14");
}
/** Add to scenario a test that exercises clocks that go backwards. */
-void BuildTimeBackwardsTest(Scenario& scenario)
+void TxRequestTest::BuildTimeBackwardsTest(Scenario& scenario)
{
auto peer1 = scenario.NewPeer();
auto peer2 = scenario.NewPeer();
@@ -577,13 +591,13 @@ void BuildTimeBackwardsTest(Scenario& scenario)
scenario.Check(peer2, {gtxid}, 1, 0, 0, "r4");
// Announce from peer1.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peer1, gtxid, true, MAX_TIME);
scenario.Check(peer2, {gtxid}, 1, 0, 0, "r5");
scenario.Check(peer1, {}, 1, 0, 0, "r6");
// Request from peer1.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
auto expiry = scenario.Now() + RandomTime8s();
scenario.RequestedTx(peer1, gtxid.GetHash(), expiry);
scenario.Check(peer1, {}, 0, 1, 0, "r7");
@@ -598,14 +612,14 @@ void BuildTimeBackwardsTest(Scenario& scenario)
scenario.Check(peer2, {gtxid}, 1, 0, 0, "r12", -MICROSECOND);
// Peer2 goes offline, meaning no viable announcements remain.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.DisconnectedPeer(peer2);
scenario.Check(peer1, {}, 0, 0, 0, "r13");
scenario.Check(peer2, {}, 0, 0, 0, "r14");
}
/** Add to scenario a test that involves RequestedTx() calls for txhashes not returned by GetRequestable. */
-void BuildWeirdRequestsTest(Scenario& scenario)
+void TxRequestTest::BuildWeirdRequestsTest(Scenario& scenario)
{
auto peer1 = scenario.NewPeer();
auto peer2 = scenario.NewPeer();
@@ -617,19 +631,19 @@ void BuildWeirdRequestsTest(Scenario& scenario)
scenario.Check(peer1, {gtxid1}, 1, 0, 0, "q1");
// Announce gtxid2 by peer2.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peer2, gtxid2, true, MIN_TIME);
scenario.Check(peer1, {gtxid1}, 1, 0, 0, "q2");
scenario.Check(peer2, {gtxid2}, 1, 0, 0, "q3");
// We request gtxid2 from *peer1* - no effect.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.RequestedTx(peer1, gtxid2.GetHash(), MAX_TIME);
scenario.Check(peer1, {gtxid1}, 1, 0, 0, "q4");
scenario.Check(peer2, {gtxid2}, 1, 0, 0, "q5");
// Now request gtxid1 from peer1 - marks it as REQUESTED.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
auto expiryA = scenario.Now() + RandomTime8s();
scenario.RequestedTx(peer1, gtxid1.GetHash(), expiryA);
scenario.Check(peer1, {}, 0, 1, 0, "q6");
@@ -653,25 +667,25 @@ void BuildWeirdRequestsTest(Scenario& scenario)
scenario.CheckExpired(peer1, gtxid1);
// Requesting it yet again from peer1 doesn't do anything, as it's already COMPLETED.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.RequestedTx(peer1, gtxid1.GetHash(), MAX_TIME);
scenario.Check(peer1, {}, 0, 0, 1, "q14");
scenario.Check(peer2, {gtxid2, gtxid1}, 2, 0, 0, "q15");
// Now announce gtxid2 from peer1.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.ReceivedInv(peer1, gtxid2, true, MIN_TIME);
scenario.Check(peer1, {}, 1, 0, 1, "q16");
scenario.Check(peer2, {gtxid2, gtxid1}, 2, 0, 0, "q17");
// And request it from peer1 (weird as peer2 has the preference).
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.RequestedTx(peer1, gtxid2.GetHash(), MAX_TIME);
scenario.Check(peer1, {}, 0, 1, 1, "q18");
scenario.Check(peer2, {gtxid1}, 2, 0, 0, "q19");
// If peer2 now (normally) requests gtxid2, the existing request by peer1 becomes COMPLETED.
- if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s());
+ if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
scenario.RequestedTx(peer2, gtxid2.GetHash(), MAX_TIME);
scenario.Check(peer1, {}, 0, 0, 2, "q20");
scenario.Check(peer2, {gtxid1}, 1, 1, 0, "q21");
@@ -682,22 +696,22 @@ void BuildWeirdRequestsTest(Scenario& scenario)
scenario.Check(peer2, {}, 0, 0, 0, "q23");
}
-void TestInterleavedScenarios()
+void TxRequestTest::TestInterleavedScenarios()
{
// Create a list of functions which add tests to scenarios.
std::vector<std::function<void(Scenario&)>> builders;
// Add instances of every test, for every configuration.
for (int n = 0; n < 64; ++n) {
- builders.emplace_back([n](Scenario& scenario){ BuildWtxidTest(scenario, n); });
- builders.emplace_back([n](Scenario& scenario){ BuildRequestOrderTest(scenario, n & 3); });
- builders.emplace_back([n](Scenario& scenario){ BuildSingleTest(scenario, n & 31); });
- builders.emplace_back([n](Scenario& scenario){ BuildPriorityTest(scenario, n & 31); });
- builders.emplace_back([n](Scenario& scenario){ BuildBigPriorityTest(scenario, (n & 7) + 1); });
- builders.emplace_back([](Scenario& scenario){ BuildTimeBackwardsTest(scenario); });
- builders.emplace_back([](Scenario& scenario){ BuildWeirdRequestsTest(scenario); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildWtxidTest(scenario, n); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildRequestOrderTest(scenario, n & 3); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildSingleTest(scenario, n & 31); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildPriorityTest(scenario, n & 31); });
+ builders.emplace_back([this, n](Scenario& scenario) { BuildBigPriorityTest(scenario, (n & 7) + 1); });
+ builders.emplace_back([this](Scenario& scenario) { BuildTimeBackwardsTest(scenario); });
+ builders.emplace_back([this](Scenario& scenario) { BuildWeirdRequestsTest(scenario); });
}
// Randomly shuffle all those functions.
- Shuffle(builders.begin(), builders.end(), g_insecure_rand_ctx);
+ std::shuffle(builders.begin(), builders.end(), m_rng);
Runner runner;
auto starttime = RandomTime1y();
@@ -706,7 +720,7 @@ void TestInterleavedScenarios()
// Introduce some variation in the start time of each scenario, so they don't all start off
// concurrently, but get a more random interleaving.
auto scenario_start = starttime + RandomTime8s() + RandomTime8s() + RandomTime8s();
- Scenario scenario(runner, scenario_start);
+ Scenario scenario(m_rng, runner, scenario_start);
for (int j = 0; builders.size() && j < 10; ++j) {
builders.back()(scenario);
builders.pop_back();
@@ -730,6 +744,8 @@ void TestInterleavedScenarios()
} // namespace
+BOOST_FIXTURE_TEST_SUITE(txrequest_tests, TxRequestTest)
+
BOOST_AUTO_TEST_CASE(TxRequestTest)
{
for (int i = 0; i < 5; ++i) {
diff --git a/src/test/txvalidation_tests.cpp b/src/test/txvalidation_tests.cpp
index f429f94a2f..97b27ef370 100644
--- a/src/test/txvalidation_tests.cpp
+++ b/src/test/txvalidation_tests.cpp
@@ -4,9 +4,9 @@
#include <consensus/validation.h>
#include <key_io.h>
-#include <policy/v3_policy.h>
#include <policy/packages.h>
#include <policy/policy.h>
+#include <policy/truc_policy.h>
#include <primitives/transaction.h>
#include <random.h>
#include <script/script.h>
@@ -91,7 +91,7 @@ static inline CTransactionRef make_tx(const std::vector<COutPoint>& inputs, int3
BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
{
- // Test V3 policy helper functions
+ // Test TRUC policy helper functions
CTxMemPool& pool = *Assert(m_node.mempool);
LOCK2(cs_main, pool.cs);
TestMemPoolEntryHelper entry;
@@ -105,77 +105,77 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
// Default values.
CTxMemPool::Limits m_limits{};
- // Cannot spend from an unconfirmed v3 transaction unless this tx is also v3.
+ // Cannot spend from an unconfirmed TRUC transaction unless this tx is also TRUC.
{
// 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)",
+ const auto expected_error_str{strprintf("non-version=3 tx %s (wtxid=%s) cannot spend from version=3 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())};
- auto result_v2_from_v3{SingleV3Checks(tx_v2_from_v3, *ancestors_v2_from_v3, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v3))};
+ auto result_v2_from_v3{SingleTRUCChecks(tx_v2_from_v3, *ancestors_v2_from_v3, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v3))};
BOOST_CHECK_EQUAL(result_v2_from_v3->first, expected_error_str);
BOOST_CHECK_EQUAL(result_v2_from_v3->second, nullptr);
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);
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(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);
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(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)",
+ const auto expected_error_str_2{strprintf("non-version=3 tx %s (wtxid=%s) cannot spend from version=3 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())};
- auto result_v2_from_both{SingleV3Checks(tx_v2_from_v2_and_v3, *ancestors_v2_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v2_and_v3))};
+ auto result_v2_from_both{SingleTRUCChecks(tx_v2_from_v2_and_v3, *ancestors_v2_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v2_and_v3))};
BOOST_CHECK_EQUAL(result_v2_from_both->first, expected_error_str_2);
BOOST_CHECK_EQUAL(result_v2_from_both->second, nullptr);
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);
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(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.
+ // TRUC cannot spend from an unconfirmed non-TRUC 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)",
+ const auto expected_error_str{strprintf("version=3 tx %s (wtxid=%s) cannot spend from non-version=3 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())};
- auto result_v3_from_v2{SingleV3Checks(tx_v3_from_v2, *ancestors_v3_from_v2, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2))};
+ auto result_v3_from_v2{SingleTRUCChecks(tx_v3_from_v2, *ancestors_v3_from_v2, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2))};
BOOST_CHECK_EQUAL(result_v3_from_v2->first, expected_error_str);
BOOST_CHECK_EQUAL(result_v3_from_v2->second, nullptr);
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);
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(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);
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(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)",
+ const auto expected_error_str_2{strprintf("version=3 tx %s (wtxid=%s) cannot spend from non-version=3 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())};
- auto result_v3_from_both{SingleV3Checks(tx_v3_from_v2_and_v3, *ancestors_v3_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2_and_v3))};
+ auto result_v3_from_both{SingleTRUCChecks(tx_v3_from_v2_and_v3, *ancestors_v3_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2_and_v3))};
BOOST_CHECK_EQUAL(result_v3_from_both->first, expected_error_str_2);
BOOST_CHECK_EQUAL(result_v3_from_both->second, nullptr);
- // tx_v3_from_v2_and_v3 also violates V3_ANCESTOR_LIMIT.
+ // tx_v3_from_v2_and_v3 also violates TRUC_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);
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(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.
{
@@ -184,25 +184,25 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
// 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))
+ BOOST_CHECK(SingleTRUCChecks(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);
+ BOOST_CHECK(PackageTRUCChecks(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))
+ BOOST_CHECK(SingleTRUCChecks(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);
+ BOOST_CHECK(PackageTRUCChecks(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
+ // Tx spending TRUC cannot have too many mempool ancestors
// Configuration where the tx has multiple direct parents.
{
Package package_multi_parents;
@@ -221,11 +221,11 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
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())};
- auto result{SingleV3Checks(tx_v3_multi_parent, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_parent))};
+ auto result{SingleTRUCChecks(tx_v3_multi_parent, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_parent))};
BOOST_CHECK_EQUAL(result->first, expected_error_str);
BOOST_CHECK_EQUAL(result->second, nullptr);
- BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_multi_parent, GetVirtualTransactionSize(*tx_v3_multi_parent), package_multi_parents, empty_ancestors),
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(tx_v3_multi_parent, GetVirtualTransactionSize(*tx_v3_multi_parent), package_multi_parents, empty_ancestors),
expected_error_str);
}
@@ -246,34 +246,34 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
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())};
- auto result{SingleV3Checks(tx_v3_multi_gen, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_gen))};
+ auto result{SingleTRUCChecks(tx_v3_multi_gen, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_gen))};
BOOST_CHECK_EQUAL(result->first, expected_error_str);
BOOST_CHECK_EQUAL(result->second, nullptr);
// 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);
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(middle_tx, GetVirtualTransactionSize(*middle_tx), package_multi_gen, empty_ancestors), expected_error_str);
+ BOOST_CHECK(PackageTRUCChecks(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.
+ // Tx spending TRUC 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)};
- auto result{SingleV3Checks(tx_v3_child_big, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child_big))};
+ const auto expected_error_str{strprintf("version=3 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, TRUC_CHILD_MAX_VSIZE)};
+ auto result{SingleTRUCChecks(tx_v3_child_big, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child_big))};
BOOST_CHECK_EQUAL(result->first, expected_error_str);
BOOST_CHECK_EQUAL(result->second, nullptr);
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),
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(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.
+ // Tx spending TRUC 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);
@@ -302,34 +302,34 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
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);
+ BOOST_CHECK(SingleTRUCChecks(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",
+ const auto expected_error_str{strprintf("version=3 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)};
- auto result{SingleV3Checks(tx_many_sigops, *ancestors, empty_conflicts_set,
+ total_sigops * DEFAULT_BYTES_PER_SIGOP / WITNESS_SCALE_FACTOR, TRUC_CHILD_MAX_VSIZE)};
+ auto result{SingleTRUCChecks(tx_many_sigops, *ancestors, empty_conflicts_set,
GetVirtualTransactionSize(*tx_many_sigops, /*nSigOpCost=*/total_sigops, /*bytes_per_sigop=*/ DEFAULT_BYTES_PER_SIGOP))};
BOOST_CHECK_EQUAL(result->first, expected_error_str);
BOOST_CHECK_EQUAL(result->second, nullptr);
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),
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(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.
+ // Parent + child with TRUC in the mempool. Child is allowed as long as it is under TRUC_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);
+ BOOST_CHECK(GetTransactionWeight(*tx_mempool_v3_child) <= TRUC_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);
+ BOOST_CHECK(SingleTRUCChecks(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);
+ BOOST_CHECK(PackageTRUCChecks(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. Sibling is returned when exactly 1 exists.
+ // A TRUC transaction cannot have more than 1 descendant. Sibling is returned when exactly 1 exists.
{
auto tx_v3_child2 = make_tx({COutPoint{mempool_tx_v3->GetHash(), 1}}, /*version=*/3);
@@ -337,17 +337,17 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
auto ancestors_1sibling{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())};
- auto result_with_sibling_eviction{SingleV3Checks(tx_v3_child2, *ancestors_1sibling, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child2))};
+ auto result_with_sibling_eviction{SingleTRUCChecks(tx_v3_child2, *ancestors_1sibling, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child2))};
BOOST_CHECK_EQUAL(result_with_sibling_eviction->first, expected_error_str);
// The other mempool child is returned to allow for sibling eviction.
BOOST_CHECK_EQUAL(result_with_sibling_eviction->second, tx_mempool_v3_child);
// If directly replacing the child, make sure there is no double-counting.
- BOOST_CHECK(SingleV3Checks(tx_v3_child2, *ancestors_1sibling, {tx_mempool_v3_child->GetHash()}, GetVirtualTransactionSize(*tx_v3_child2))
+ BOOST_CHECK(SingleTRUCChecks(tx_v3_child2, *ancestors_1sibling, {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),
+ BOOST_CHECK_EQUAL(*PackageTRUCChecks(tx_v3_child2, GetVirtualTransactionSize(*tx_v3_child2), package_v3_1p2c, empty_ancestors),
expected_error_str);
// Configuration where parent already has 2 other children in mempool (no sibling eviction allowed). This may happen as the result of a reorg.
@@ -357,7 +357,7 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
BOOST_CHECK_EQUAL(entry_mempool_parent->GetCountWithDescendants(), 3);
auto ancestors_2siblings{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_child3), m_limits)};
- auto result_2children{SingleV3Checks(tx_v3_child3, *ancestors_2siblings, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child3))};
+ auto result_2children{SingleTRUCChecks(tx_v3_child3, *ancestors_2siblings, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child3))};
BOOST_CHECK_EQUAL(result_2children->first, expected_error_str);
// The other mempool child is not returned because sibling eviction is not allowed.
BOOST_CHECK_EQUAL(result_2children->second, nullptr);
@@ -377,7 +377,7 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
auto ancestors_3gen{pool.CalculateMemPoolAncestors(entry.FromTx(tx_to_submit), m_limits)};
const auto expected_error_str{strprintf("tx %s (wtxid=%s) would exceed descendant count limit",
tx_mempool_grandparent->GetHash().ToString(), tx_mempool_grandparent->GetWitnessHash().ToString())};
- auto result_3gen{SingleV3Checks(tx_to_submit, *ancestors_3gen, empty_conflicts_set, GetVirtualTransactionSize(*tx_to_submit))};
+ auto result_3gen{SingleTRUCChecks(tx_to_submit, *ancestors_3gen, empty_conflicts_set, GetVirtualTransactionSize(*tx_to_submit))};
BOOST_CHECK_EQUAL(result_3gen->first, expected_error_str);
// The other mempool child is not returned because sibling eviction is not allowed.
BOOST_CHECK_EQUAL(result_3gen->second, nullptr);
diff --git a/src/test/txvalidationcache_tests.cpp b/src/test/txvalidationcache_tests.cpp
index 78ef96a15d..af36a95693 100644
--- a/src/test/txvalidationcache_tests.cpp
+++ b/src/test/txvalidationcache_tests.cpp
@@ -5,6 +5,7 @@
#include <consensus/validation.h>
#include <key.h>
#include <random.h>
+#include <script/sigcache.h>
#include <script/sign.h>
#include <script/signingprovider.h>
#include <test/util/setup_common.h>
@@ -16,12 +17,13 @@
struct Dersig100Setup : public TestChain100Setup {
Dersig100Setup()
- : TestChain100Setup{ChainType::REGTEST, {"-testactivationheight=dersig@102"}} {}
+ : TestChain100Setup{ChainType::REGTEST, {.extra_args = {"-testactivationheight=dersig@102"}}} {}
};
bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
const CCoinsViewCache& inputs, unsigned int flags, bool cacheSigStore,
bool cacheFullScriptStore, PrecomputedTransactionData& txdata,
+ ValidationCache& validation_cache,
std::vector<CScriptCheck>* pvChecks) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
BOOST_AUTO_TEST_SUITE(txvalidationcache_tests)
@@ -118,7 +120,7 @@ BOOST_FIXTURE_TEST_CASE(tx_mempool_block_doublespend, Dersig100Setup)
// should fail.
// Capture this interaction with the upgraded_nop argument: set it when evaluating
// any script flag that is implemented as an upgraded NOP code.
-static void ValidateCheckInputsForAllFlags(const CTransaction &tx, uint32_t failing_flags, bool add_to_cache, CCoinsViewCache& active_coins_tip) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
+static void ValidateCheckInputsForAllFlags(const CTransaction &tx, uint32_t failing_flags, bool add_to_cache, CCoinsViewCache& active_coins_tip, ValidationCache& validation_cache) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
{
PrecomputedTransactionData txdata;
@@ -140,7 +142,7 @@ static void ValidateCheckInputsForAllFlags(const CTransaction &tx, uint32_t fail
// WITNESS requires P2SH
test_flags |= SCRIPT_VERIFY_P2SH;
}
- bool ret = CheckInputScripts(tx, state, &active_coins_tip, test_flags, true, add_to_cache, txdata, nullptr);
+ bool ret = CheckInputScripts(tx, state, &active_coins_tip, test_flags, true, add_to_cache, txdata, validation_cache, nullptr);
// CheckInputScripts should succeed iff test_flags doesn't intersect with
// failing_flags
bool expected_return_value = !(test_flags & failing_flags);
@@ -150,13 +152,13 @@ static void ValidateCheckInputsForAllFlags(const CTransaction &tx, uint32_t fail
if (ret && add_to_cache) {
// Check that we get a cache hit if the tx was valid
std::vector<CScriptCheck> scriptchecks;
- BOOST_CHECK(CheckInputScripts(tx, state, &active_coins_tip, test_flags, true, add_to_cache, txdata, &scriptchecks));
+ BOOST_CHECK(CheckInputScripts(tx, state, &active_coins_tip, test_flags, true, add_to_cache, txdata, validation_cache, &scriptchecks));
BOOST_CHECK(scriptchecks.empty());
} else {
// Check that we get script executions to check, if the transaction
// was invalid, or we didn't add to cache.
std::vector<CScriptCheck> scriptchecks;
- BOOST_CHECK(CheckInputScripts(tx, state, &active_coins_tip, test_flags, true, add_to_cache, txdata, &scriptchecks));
+ BOOST_CHECK(CheckInputScripts(tx, state, &active_coins_tip, test_flags, true, add_to_cache, txdata, validation_cache, &scriptchecks));
BOOST_CHECK_EQUAL(scriptchecks.size(), tx.vin.size());
}
}
@@ -214,20 +216,20 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
TxValidationState state;
PrecomputedTransactionData ptd_spend_tx;
- BOOST_CHECK(!CheckInputScripts(CTransaction(spend_tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, nullptr));
+ BOOST_CHECK(!CheckInputScripts(CTransaction(spend_tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, m_node.chainman->m_validation_cache, nullptr));
// If we call again asking for scriptchecks (as happens in
// ConnectBlock), we should add a script check object for this -- we're
// not caching invalidity (if that changes, delete this test case).
std::vector<CScriptCheck> scriptchecks;
- BOOST_CHECK(CheckInputScripts(CTransaction(spend_tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, &scriptchecks));
+ BOOST_CHECK(CheckInputScripts(CTransaction(spend_tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, m_node.chainman->m_validation_cache, &scriptchecks));
BOOST_CHECK_EQUAL(scriptchecks.size(), 1U);
// Test that CheckInputScripts returns true iff DERSIG-enforcing flags are
// not present. Don't add these checks to the cache, so that we can
// test later that block validation works fine in the absence of cached
// successes.
- ValidateCheckInputsForAllFlags(CTransaction(spend_tx), SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC, false, m_node.chainman->ActiveChainstate().CoinsTip());
+ ValidateCheckInputsForAllFlags(CTransaction(spend_tx), SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC, false, m_node.chainman->ActiveChainstate().CoinsTip(), m_node.chainman->m_validation_cache);
}
// And if we produce a block with this tx, it should be valid (DERSIG not
@@ -253,7 +255,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
std::vector<unsigned char> vchSig2(p2pk_scriptPubKey.begin(), p2pk_scriptPubKey.end());
invalid_under_p2sh_tx.vin[0].scriptSig << vchSig2;
- ValidateCheckInputsForAllFlags(CTransaction(invalid_under_p2sh_tx), SCRIPT_VERIFY_P2SH, true, m_node.chainman->ActiveChainstate().CoinsTip());
+ ValidateCheckInputsForAllFlags(CTransaction(invalid_under_p2sh_tx), SCRIPT_VERIFY_P2SH, true, m_node.chainman->ActiveChainstate().CoinsTip(), m_node.chainman->m_validation_cache);
}
// Test CHECKLOCKTIMEVERIFY
@@ -276,13 +278,13 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
vchSig.push_back((unsigned char)SIGHASH_ALL);
invalid_with_cltv_tx.vin[0].scriptSig = CScript() << vchSig << 101;
- ValidateCheckInputsForAllFlags(CTransaction(invalid_with_cltv_tx), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true, m_node.chainman->ActiveChainstate().CoinsTip());
+ ValidateCheckInputsForAllFlags(CTransaction(invalid_with_cltv_tx), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true, m_node.chainman->ActiveChainstate().CoinsTip(), m_node.chainman->m_validation_cache);
// Make it valid, and check again
invalid_with_cltv_tx.vin[0].scriptSig = CScript() << vchSig << 100;
TxValidationState state;
PrecomputedTransactionData txdata;
- BOOST_CHECK(CheckInputScripts(CTransaction(invalid_with_cltv_tx), state, m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true, true, txdata, nullptr));
+ BOOST_CHECK(CheckInputScripts(CTransaction(invalid_with_cltv_tx), state, m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true, true, txdata, m_node.chainman->m_validation_cache, nullptr));
}
// TEST CHECKSEQUENCEVERIFY
@@ -304,13 +306,13 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
vchSig.push_back((unsigned char)SIGHASH_ALL);
invalid_with_csv_tx.vin[0].scriptSig = CScript() << vchSig << 101;
- ValidateCheckInputsForAllFlags(CTransaction(invalid_with_csv_tx), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true, m_node.chainman->ActiveChainstate().CoinsTip());
+ ValidateCheckInputsForAllFlags(CTransaction(invalid_with_csv_tx), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true, m_node.chainman->ActiveChainstate().CoinsTip(), m_node.chainman->m_validation_cache);
// Make it valid, and check again
invalid_with_csv_tx.vin[0].scriptSig = CScript() << vchSig << 100;
TxValidationState state;
PrecomputedTransactionData txdata;
- BOOST_CHECK(CheckInputScripts(CTransaction(invalid_with_csv_tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true, true, txdata, nullptr));
+ BOOST_CHECK(CheckInputScripts(CTransaction(invalid_with_csv_tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true, true, txdata, m_node.chainman->m_validation_cache, nullptr));
}
// TODO: add tests for remaining script flags
@@ -333,11 +335,11 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
UpdateInput(valid_with_witness_tx.vin[0], sigdata);
// This should be valid under all script flags.
- ValidateCheckInputsForAllFlags(CTransaction(valid_with_witness_tx), 0, true, m_node.chainman->ActiveChainstate().CoinsTip());
+ ValidateCheckInputsForAllFlags(CTransaction(valid_with_witness_tx), 0, true, m_node.chainman->ActiveChainstate().CoinsTip(), m_node.chainman->m_validation_cache);
// Remove the witness, and check that it is now invalid.
valid_with_witness_tx.vin[0].scriptWitness.SetNull();
- ValidateCheckInputsForAllFlags(CTransaction(valid_with_witness_tx), SCRIPT_VERIFY_WITNESS, true, m_node.chainman->ActiveChainstate().CoinsTip());
+ ValidateCheckInputsForAllFlags(CTransaction(valid_with_witness_tx), SCRIPT_VERIFY_WITNESS, true, m_node.chainman->ActiveChainstate().CoinsTip(), m_node.chainman->m_validation_cache);
}
{
@@ -362,7 +364,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
}
// This should be valid under all script flags
- ValidateCheckInputsForAllFlags(CTransaction(tx), 0, true, m_node.chainman->ActiveChainstate().CoinsTip());
+ ValidateCheckInputsForAllFlags(CTransaction(tx), 0, true, m_node.chainman->ActiveChainstate().CoinsTip(), m_node.chainman->m_validation_cache);
// Check that if the second input is invalid, but the first input is
// valid, the transaction is not cached.
@@ -372,12 +374,12 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
TxValidationState state;
PrecomputedTransactionData txdata;
// This transaction is now invalid under segwit, because of the second input.
- BOOST_CHECK(!CheckInputScripts(CTransaction(tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, nullptr));
+ BOOST_CHECK(!CheckInputScripts(CTransaction(tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, m_node.chainman->m_validation_cache, nullptr));
std::vector<CScriptCheck> scriptchecks;
// Make sure this transaction was not cached (ie because the first
// input was valid)
- BOOST_CHECK(CheckInputScripts(CTransaction(tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, &scriptchecks));
+ BOOST_CHECK(CheckInputScripts(CTransaction(tx), state, &m_node.chainman->ActiveChainstate().CoinsTip(), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, m_node.chainman->m_validation_cache, &scriptchecks));
// Should get 2 script checks back -- caching is on a whole-transaction basis.
BOOST_CHECK_EQUAL(scriptchecks.size(), 2U);
}
diff --git a/src/test/uint256_tests.cpp b/src/test/uint256_tests.cpp
index b7892a2139..142d7a6fde 100644
--- a/src/test/uint256_tests.cpp
+++ b/src/test/uint256_tests.cpp
@@ -2,16 +2,18 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include <arith_uint256.h>
#include <streams.h>
#include <test/util/setup_common.h>
#include <uint256.h>
+#include <util/strencodings.h>
+#include <util/transaction_identifier.h>
#include <boost/test/unit_test.hpp>
#include <iomanip>
#include <sstream>
#include <string>
+#include <string_view>
#include <vector>
BOOST_AUTO_TEST_SUITE(uint256_tests)
@@ -58,69 +60,49 @@ static std::string ArrayToString(const unsigned char A[], unsigned int width)
return Stream.str();
}
-inline uint160 uint160S(const char *str)
-{
- uint160 rv;
- rv.SetHex(str);
- return rv;
-}
-inline uint160 uint160S(const std::string& str)
-{
- uint160 rv;
- rv.SetHex(str);
- return rv;
-}
-
BOOST_AUTO_TEST_CASE( basics ) // constructors, equality, inequality
{
- BOOST_CHECK(1 == 0+1);
// constructor uint256(vector<char>):
- BOOST_CHECK(R1L.ToString() == ArrayToString(R1Array,32));
- BOOST_CHECK(R1S.ToString() == ArrayToString(R1Array,20));
- BOOST_CHECK(R2L.ToString() == ArrayToString(R2Array,32));
- BOOST_CHECK(R2S.ToString() == ArrayToString(R2Array,20));
- BOOST_CHECK(ZeroL.ToString() == ArrayToString(ZeroArray,32));
- BOOST_CHECK(ZeroS.ToString() == ArrayToString(ZeroArray,20));
- BOOST_CHECK(OneL.ToString() == ArrayToString(OneArray,32));
- BOOST_CHECK(OneS.ToString() == ArrayToString(OneArray,20));
- BOOST_CHECK(MaxL.ToString() == ArrayToString(MaxArray,32));
- BOOST_CHECK(MaxS.ToString() == ArrayToString(MaxArray,20));
- BOOST_CHECK(OneL.ToString() != ArrayToString(ZeroArray,32));
- BOOST_CHECK(OneS.ToString() != ArrayToString(ZeroArray,20));
+ BOOST_CHECK_EQUAL(R1L.ToString(), ArrayToString(R1Array,32));
+ BOOST_CHECK_EQUAL(R1S.ToString(), ArrayToString(R1Array,20));
+ BOOST_CHECK_EQUAL(R2L.ToString(), ArrayToString(R2Array,32));
+ BOOST_CHECK_EQUAL(R2S.ToString(), ArrayToString(R2Array,20));
+ BOOST_CHECK_EQUAL(ZeroL.ToString(), ArrayToString(ZeroArray,32));
+ BOOST_CHECK_EQUAL(ZeroS.ToString(), ArrayToString(ZeroArray,20));
+ BOOST_CHECK_EQUAL(OneL.ToString(), ArrayToString(OneArray,32));
+ BOOST_CHECK_EQUAL(OneS.ToString(), ArrayToString(OneArray,20));
+ BOOST_CHECK_EQUAL(MaxL.ToString(), ArrayToString(MaxArray,32));
+ BOOST_CHECK_EQUAL(MaxS.ToString(), ArrayToString(MaxArray,20));
+ BOOST_CHECK_NE(OneL.ToString(), ArrayToString(ZeroArray,32));
+ BOOST_CHECK_NE(OneS.ToString(), ArrayToString(ZeroArray,20));
// == and !=
- BOOST_CHECK(R1L != R2L && R1S != R2S);
- BOOST_CHECK(ZeroL != OneL && ZeroS != OneS);
- BOOST_CHECK(OneL != ZeroL && OneS != ZeroS);
- BOOST_CHECK(MaxL != ZeroL && MaxS != ZeroS);
+ BOOST_CHECK_NE(R1L, R2L); BOOST_CHECK_NE(R1S, R2S);
+ BOOST_CHECK_NE(ZeroL, OneL); BOOST_CHECK_NE(ZeroS, OneS);
+ BOOST_CHECK_NE(OneL, ZeroL); BOOST_CHECK_NE(OneS, ZeroS);
+ BOOST_CHECK_NE(MaxL, ZeroL); BOOST_CHECK_NE(MaxS, ZeroS);
// String Constructor and Copy Constructor
- BOOST_CHECK(uint256S("0x"+R1L.ToString()) == R1L);
- BOOST_CHECK(uint256S("0x"+R2L.ToString()) == R2L);
- BOOST_CHECK(uint256S("0x"+ZeroL.ToString()) == ZeroL);
- BOOST_CHECK(uint256S("0x"+OneL.ToString()) == OneL);
- BOOST_CHECK(uint256S("0x"+MaxL.ToString()) == MaxL);
- BOOST_CHECK(uint256S(R1L.ToString()) == R1L);
- BOOST_CHECK(uint256S(" 0x"+R1L.ToString()+" ") == R1L);
- BOOST_CHECK(uint256S("") == ZeroL);
- BOOST_CHECK(R1L == uint256S(R1ArrayHex));
- BOOST_CHECK(uint256(R1L) == R1L);
- BOOST_CHECK(uint256(ZeroL) == ZeroL);
- BOOST_CHECK(uint256(OneL) == OneL);
-
- BOOST_CHECK(uint160S("0x"+R1S.ToString()) == R1S);
- BOOST_CHECK(uint160S("0x"+R2S.ToString()) == R2S);
- BOOST_CHECK(uint160S("0x"+ZeroS.ToString()) == ZeroS);
- BOOST_CHECK(uint160S("0x"+OneS.ToString()) == OneS);
- BOOST_CHECK(uint160S("0x"+MaxS.ToString()) == MaxS);
- BOOST_CHECK(uint160S(R1S.ToString()) == R1S);
- BOOST_CHECK(uint160S(" 0x"+R1S.ToString()+" ") == R1S);
- BOOST_CHECK(uint160S("") == ZeroS);
- BOOST_CHECK(R1S == uint160S(R1ArrayHex));
-
- BOOST_CHECK(uint160(R1S) == R1S);
- BOOST_CHECK(uint160(ZeroS) == ZeroS);
- BOOST_CHECK(uint160(OneS) == OneS);
+ BOOST_CHECK_EQUAL(uint256::FromHex(R1L.ToString()).value(), R1L);
+ BOOST_CHECK_EQUAL(uint256::FromHex(R2L.ToString()).value(), R2L);
+ BOOST_CHECK_EQUAL(uint256::FromHex(ZeroL.ToString()).value(), ZeroL);
+ BOOST_CHECK_EQUAL(uint256::FromHex(OneL.ToString()).value(), OneL);
+ BOOST_CHECK_EQUAL(uint256::FromHex(MaxL.ToString()).value(), MaxL);
+ BOOST_CHECK_EQUAL(uint256::FromHex(R1ArrayHex).value(), R1L);
+ BOOST_CHECK_EQUAL(uint256(R1L), R1L);
+ BOOST_CHECK_EQUAL(uint256(ZeroL), ZeroL);
+ BOOST_CHECK_EQUAL(uint256(OneL), OneL);
+
+ BOOST_CHECK_EQUAL(uint160::FromHex(R1S.ToString()).value(), R1S);
+ BOOST_CHECK_EQUAL(uint160::FromHex(R2S.ToString()).value(), R2S);
+ BOOST_CHECK_EQUAL(uint160::FromHex(ZeroS.ToString()).value(), ZeroS);
+ BOOST_CHECK_EQUAL(uint160::FromHex(OneS.ToString()).value(), OneS);
+ BOOST_CHECK_EQUAL(uint160::FromHex(MaxS.ToString()).value(), MaxS);
+ BOOST_CHECK_EQUAL(uint160::FromHex(std::string_view{R1ArrayHex + 24, 40}).value(), R1S);
+
+ BOOST_CHECK_EQUAL(uint160(R1S), R1S);
+ BOOST_CHECK_EQUAL(uint160(ZeroS), ZeroS);
+ BOOST_CHECK_EQUAL(uint160(OneS), OneS);
}
BOOST_AUTO_TEST_CASE( comparison ) // <= >= < >
@@ -129,206 +111,232 @@ BOOST_AUTO_TEST_CASE( comparison ) // <= >= < >
for (int i = 255; i >= 0; --i) {
uint256 TmpL;
*(TmpL.begin() + (i>>3)) |= 1<<(7-(i&7));
- BOOST_CHECK( LastL < TmpL );
+ BOOST_CHECK_LT(LastL, TmpL);
LastL = TmpL;
}
- BOOST_CHECK( ZeroL < R1L );
- BOOST_CHECK( R2L < R1L );
- BOOST_CHECK( ZeroL < OneL );
- BOOST_CHECK( OneL < MaxL );
- BOOST_CHECK( R1L < MaxL );
- BOOST_CHECK( R2L < MaxL );
+ BOOST_CHECK_LT(ZeroL, R1L);
+ BOOST_CHECK_LT(R2L, R1L);
+ BOOST_CHECK_LT(ZeroL, OneL);
+ BOOST_CHECK_LT(OneL, MaxL);
+ BOOST_CHECK_LT(R1L, MaxL);
+ BOOST_CHECK_LT(R2L, MaxL);
uint160 LastS;
for (int i = 159; i >= 0; --i) {
uint160 TmpS;
*(TmpS.begin() + (i>>3)) |= 1<<(7-(i&7));
- BOOST_CHECK( LastS < TmpS );
+ BOOST_CHECK_LT(LastS, TmpS);
LastS = TmpS;
}
- BOOST_CHECK( ZeroS < R1S );
- BOOST_CHECK( R2S < R1S );
- BOOST_CHECK( ZeroS < OneS );
- BOOST_CHECK( OneS < MaxS );
- BOOST_CHECK( R1S < MaxS );
- BOOST_CHECK( R2S < MaxS );
+ BOOST_CHECK_LT(ZeroS, R1S);
+ BOOST_CHECK_LT(R2S, R1S);
+ BOOST_CHECK_LT(ZeroS, OneS);
+ BOOST_CHECK_LT(OneS, MaxS);
+ BOOST_CHECK_LT(R1S, MaxS);
+ BOOST_CHECK_LT(R2S, MaxS);
+
+ // Non-arithmetic uint256s compare from the beginning of their inner arrays:
+ BOOST_CHECK_LT(R2L, R1L);
+ // Ensure first element comparisons give the same order as above:
+ BOOST_CHECK_LT(*R2L.begin(), *R1L.begin());
+ // Ensure last element comparisons give a different result (swapped params):
+ BOOST_CHECK_LT(*(R1L.end()-1), *(R2L.end()-1));
+ // Hex strings represent reverse-encoded bytes, with lexicographic ordering:
+ BOOST_CHECK_LT(uint256{"1000000000000000000000000000000000000000000000000000000000000000"},
+ uint256{"0000000000000000000000000000000000000000000000000000000000000001"});
}
-BOOST_AUTO_TEST_CASE( methods ) // GetHex SetHex begin() end() size() GetLow64 GetSerializeSize, Serialize, Unserialize
+BOOST_AUTO_TEST_CASE(methods) // GetHex SetHexDeprecated FromHex begin() end() size() GetLow64 GetSerializeSize, Serialize, Unserialize
{
- BOOST_CHECK(R1L.GetHex() == R1L.ToString());
- BOOST_CHECK(R2L.GetHex() == R2L.ToString());
- BOOST_CHECK(OneL.GetHex() == OneL.ToString());
- BOOST_CHECK(MaxL.GetHex() == MaxL.ToString());
+ BOOST_CHECK_EQUAL(R1L.GetHex(), R1L.ToString());
+ BOOST_CHECK_EQUAL(R2L.GetHex(), R2L.ToString());
+ BOOST_CHECK_EQUAL(OneL.GetHex(), OneL.ToString());
+ BOOST_CHECK_EQUAL(MaxL.GetHex(), MaxL.ToString());
uint256 TmpL(R1L);
- BOOST_CHECK(TmpL == R1L);
- TmpL.SetHex(R2L.ToString()); BOOST_CHECK(TmpL == R2L);
- TmpL.SetHex(ZeroL.ToString()); BOOST_CHECK(TmpL == uint256());
-
- TmpL.SetHex(R1L.ToString());
- BOOST_CHECK(memcmp(R1L.begin(), R1Array, 32)==0);
- BOOST_CHECK(memcmp(TmpL.begin(), R1Array, 32)==0);
- BOOST_CHECK(memcmp(R2L.begin(), R2Array, 32)==0);
- BOOST_CHECK(memcmp(ZeroL.begin(), ZeroArray, 32)==0);
- BOOST_CHECK(memcmp(OneL.begin(), OneArray, 32)==0);
- BOOST_CHECK(R1L.size() == sizeof(R1L));
- BOOST_CHECK(sizeof(R1L) == 32);
- BOOST_CHECK(R1L.size() == 32);
- BOOST_CHECK(R2L.size() == 32);
- BOOST_CHECK(ZeroL.size() == 32);
- BOOST_CHECK(MaxL.size() == 32);
- BOOST_CHECK(R1L.begin() + 32 == R1L.end());
- BOOST_CHECK(R2L.begin() + 32 == R2L.end());
- BOOST_CHECK(OneL.begin() + 32 == OneL.end());
- BOOST_CHECK(MaxL.begin() + 32 == MaxL.end());
- BOOST_CHECK(TmpL.begin() + 32 == TmpL.end());
- BOOST_CHECK(GetSerializeSize(R1L) == 32);
- BOOST_CHECK(GetSerializeSize(ZeroL) == 32);
+ BOOST_CHECK_EQUAL(TmpL, R1L);
+ // Verify previous values don't persist when setting to truncated string.
+ TmpL.SetHexDeprecated("21");
+ BOOST_CHECK_EQUAL(TmpL.ToString(), "0000000000000000000000000000000000000000000000000000000000000021");
+ BOOST_CHECK_EQUAL(uint256::FromHex(R2L.ToString()).value(), R2L);
+ BOOST_CHECK_EQUAL(uint256::FromHex(ZeroL.ToString()).value(), uint256());
+
+ TmpL = uint256::FromHex(R1L.ToString()).value();
+ BOOST_CHECK_EQUAL_COLLECTIONS(R1L.begin(), R1L.end(), R1Array, R1Array + uint256::size());
+ BOOST_CHECK_EQUAL_COLLECTIONS(TmpL.begin(), TmpL.end(), R1Array, R1Array + uint256::size());
+ BOOST_CHECK_EQUAL_COLLECTIONS(R2L.begin(), R2L.end(), R2Array, R2Array + uint256::size());
+ BOOST_CHECK_EQUAL_COLLECTIONS(ZeroL.begin(), ZeroL.end(), ZeroArray, ZeroArray + uint256::size());
+ BOOST_CHECK_EQUAL_COLLECTIONS(OneL.begin(), OneL.end(), OneArray, OneArray + uint256::size());
+ BOOST_CHECK_EQUAL(R1L.size(), sizeof(R1L));
+ BOOST_CHECK_EQUAL(sizeof(R1L), 32);
+ BOOST_CHECK_EQUAL(R1L.size(), 32);
+ BOOST_CHECK_EQUAL(R2L.size(), 32);
+ BOOST_CHECK_EQUAL(ZeroL.size(), 32);
+ BOOST_CHECK_EQUAL(MaxL.size(), 32);
+ BOOST_CHECK_EQUAL(R1L.begin() + 32, R1L.end());
+ BOOST_CHECK_EQUAL(R2L.begin() + 32, R2L.end());
+ BOOST_CHECK_EQUAL(OneL.begin() + 32, OneL.end());
+ BOOST_CHECK_EQUAL(MaxL.begin() + 32, MaxL.end());
+ BOOST_CHECK_EQUAL(TmpL.begin() + 32, TmpL.end());
+ BOOST_CHECK_EQUAL(GetSerializeSize(R1L), 32);
+ BOOST_CHECK_EQUAL(GetSerializeSize(ZeroL), 32);
DataStream ss{};
ss << R1L;
- BOOST_CHECK(ss.str() == std::string(R1Array,R1Array+32));
+ BOOST_CHECK_EQUAL(ss.str(), std::string(R1Array,R1Array+32));
ss >> TmpL;
- BOOST_CHECK(R1L == TmpL);
+ BOOST_CHECK_EQUAL(R1L, TmpL);
ss.clear();
ss << ZeroL;
- BOOST_CHECK(ss.str() == std::string(ZeroArray,ZeroArray+32));
+ BOOST_CHECK_EQUAL(ss.str(), std::string(ZeroArray,ZeroArray+32));
ss >> TmpL;
- BOOST_CHECK(ZeroL == TmpL);
+ BOOST_CHECK_EQUAL(ZeroL, TmpL);
ss.clear();
ss << MaxL;
- BOOST_CHECK(ss.str() == std::string(MaxArray,MaxArray+32));
+ BOOST_CHECK_EQUAL(ss.str(), std::string(MaxArray,MaxArray+32));
ss >> TmpL;
- BOOST_CHECK(MaxL == TmpL);
+ BOOST_CHECK_EQUAL(MaxL, TmpL);
ss.clear();
- BOOST_CHECK(R1S.GetHex() == R1S.ToString());
- BOOST_CHECK(R2S.GetHex() == R2S.ToString());
- BOOST_CHECK(OneS.GetHex() == OneS.ToString());
- BOOST_CHECK(MaxS.GetHex() == MaxS.ToString());
+ BOOST_CHECK_EQUAL(R1S.GetHex(), R1S.ToString());
+ BOOST_CHECK_EQUAL(R2S.GetHex(), R2S.ToString());
+ BOOST_CHECK_EQUAL(OneS.GetHex(), OneS.ToString());
+ BOOST_CHECK_EQUAL(MaxS.GetHex(), MaxS.ToString());
uint160 TmpS(R1S);
- BOOST_CHECK(TmpS == R1S);
- TmpS.SetHex(R2S.ToString()); BOOST_CHECK(TmpS == R2S);
- TmpS.SetHex(ZeroS.ToString()); BOOST_CHECK(TmpS == uint160());
-
- TmpS.SetHex(R1S.ToString());
- BOOST_CHECK(memcmp(R1S.begin(), R1Array, 20)==0);
- BOOST_CHECK(memcmp(TmpS.begin(), R1Array, 20)==0);
- BOOST_CHECK(memcmp(R2S.begin(), R2Array, 20)==0);
- BOOST_CHECK(memcmp(ZeroS.begin(), ZeroArray, 20)==0);
- BOOST_CHECK(memcmp(OneS.begin(), OneArray, 20)==0);
- BOOST_CHECK(R1S.size() == sizeof(R1S));
- BOOST_CHECK(sizeof(R1S) == 20);
- BOOST_CHECK(R1S.size() == 20);
- BOOST_CHECK(R2S.size() == 20);
- BOOST_CHECK(ZeroS.size() == 20);
- BOOST_CHECK(MaxS.size() == 20);
- BOOST_CHECK(R1S.begin() + 20 == R1S.end());
- BOOST_CHECK(R2S.begin() + 20 == R2S.end());
- BOOST_CHECK(OneS.begin() + 20 == OneS.end());
- BOOST_CHECK(MaxS.begin() + 20 == MaxS.end());
- BOOST_CHECK(TmpS.begin() + 20 == TmpS.end());
- BOOST_CHECK(GetSerializeSize(R1S) == 20);
- BOOST_CHECK(GetSerializeSize(ZeroS) == 20);
+ BOOST_CHECK_EQUAL(TmpS, R1S);
+ BOOST_CHECK_EQUAL(uint160::FromHex(R2S.ToString()).value(), R2S);
+ BOOST_CHECK_EQUAL(uint160::FromHex(ZeroS.ToString()).value(), uint160());
+
+ TmpS = uint160::FromHex(R1S.ToString()).value();
+ BOOST_CHECK_EQUAL_COLLECTIONS(R1S.begin(), R1S.end(), R1Array, R1Array + uint160::size());
+ BOOST_CHECK_EQUAL_COLLECTIONS(TmpS.begin(), TmpS.end(), R1Array, R1Array + uint160::size());
+ BOOST_CHECK_EQUAL_COLLECTIONS(R2S.begin(), R2S.end(), R2Array, R2Array + uint160::size());
+ BOOST_CHECK_EQUAL_COLLECTIONS(ZeroS.begin(), ZeroS.end(), ZeroArray, ZeroArray + uint160::size());
+ BOOST_CHECK_EQUAL_COLLECTIONS(OneS.begin(), OneS.end(), OneArray, OneArray + uint160::size());
+ BOOST_CHECK_EQUAL(R1S.size(), sizeof(R1S));
+ BOOST_CHECK_EQUAL(sizeof(R1S), 20);
+ BOOST_CHECK_EQUAL(R1S.size(), 20);
+ BOOST_CHECK_EQUAL(R2S.size(), 20);
+ BOOST_CHECK_EQUAL(ZeroS.size(), 20);
+ BOOST_CHECK_EQUAL(MaxS.size(), 20);
+ BOOST_CHECK_EQUAL(R1S.begin() + 20, R1S.end());
+ BOOST_CHECK_EQUAL(R2S.begin() + 20, R2S.end());
+ BOOST_CHECK_EQUAL(OneS.begin() + 20, OneS.end());
+ BOOST_CHECK_EQUAL(MaxS.begin() + 20, MaxS.end());
+ BOOST_CHECK_EQUAL(TmpS.begin() + 20, TmpS.end());
+ BOOST_CHECK_EQUAL(GetSerializeSize(R1S), 20);
+ BOOST_CHECK_EQUAL(GetSerializeSize(ZeroS), 20);
ss << R1S;
- BOOST_CHECK(ss.str() == std::string(R1Array,R1Array+20));
+ BOOST_CHECK_EQUAL(ss.str(), std::string(R1Array,R1Array+20));
ss >> TmpS;
- BOOST_CHECK(R1S == TmpS);
+ BOOST_CHECK_EQUAL(R1S, TmpS);
ss.clear();
ss << ZeroS;
- BOOST_CHECK(ss.str() == std::string(ZeroArray,ZeroArray+20));
+ BOOST_CHECK_EQUAL(ss.str(), std::string(ZeroArray,ZeroArray+20));
ss >> TmpS;
- BOOST_CHECK(ZeroS == TmpS);
+ BOOST_CHECK_EQUAL(ZeroS, TmpS);
ss.clear();
ss << MaxS;
- BOOST_CHECK(ss.str() == std::string(MaxArray,MaxArray+20));
+ BOOST_CHECK_EQUAL(ss.str(), std::string(MaxArray,MaxArray+20));
ss >> TmpS;
- BOOST_CHECK(MaxS == TmpS);
+ BOOST_CHECK_EQUAL(MaxS, TmpS);
ss.clear();
}
-BOOST_AUTO_TEST_CASE( conversion )
-{
- BOOST_CHECK(ArithToUint256(UintToArith256(ZeroL)) == ZeroL);
- BOOST_CHECK(ArithToUint256(UintToArith256(OneL)) == OneL);
- BOOST_CHECK(ArithToUint256(UintToArith256(R1L)) == R1L);
- BOOST_CHECK(ArithToUint256(UintToArith256(R2L)) == R2L);
- BOOST_CHECK(UintToArith256(ZeroL) == 0);
- BOOST_CHECK(UintToArith256(OneL) == 1);
- BOOST_CHECK(ArithToUint256(0) == ZeroL);
- BOOST_CHECK(ArithToUint256(1) == OneL);
- BOOST_CHECK(arith_uint256(UintToArith256(uint256S(R1L.GetHex()))) == UintToArith256(R1L));
- BOOST_CHECK(arith_uint256(UintToArith256(uint256S(R2L.GetHex()))) == UintToArith256(R2L));
- BOOST_CHECK(R1L.GetHex() == UintToArith256(R1L).GetHex());
- BOOST_CHECK(R2L.GetHex() == UintToArith256(R2L).GetHex());
-}
-
-BOOST_AUTO_TEST_CASE( operator_with_self )
-{
-
-/* Clang 16 and earlier detects v -= v and v /= v as self-assignments
- to 0 and 1 respectively.
- See: https://github.com/llvm/llvm-project/issues/42469
- and the fix in commit c5302325b2a62d77cf13dd16cd5c19141862fed0 .
-
- This makes some sense for arithmetic classes, but could be considered a bug
- elsewhere. Disable the warning here so that the code can be tested, but the
- warning should remain on as there will likely always be a better way to
- express this.
-*/
-
-#if defined(__clang__)
-# pragma clang diagnostic push
-# pragma clang diagnostic ignored "-Wself-assign-overloaded"
-#endif
- arith_uint256 v = UintToArith256(uint256S("02"));
- v *= v;
- BOOST_CHECK(v == UintToArith256(uint256S("04")));
- v /= v;
- BOOST_CHECK(v == UintToArith256(uint256S("01")));
- v += v;
- BOOST_CHECK(v == UintToArith256(uint256S("02")));
- v -= v;
- BOOST_CHECK(v == UintToArith256(uint256S("0")));
-#if defined(__clang__)
-# pragma clang diagnostic pop
-#endif
-}
-
-BOOST_AUTO_TEST_CASE(parse)
+/**
+ * Implemented as a templated function so it can be reused by other classes that have a FromHex()
+ * method that wraps base_blob::FromHex(), such as transaction_identifier::FromHex().
+ */
+template <typename T>
+void TestFromHex()
{
+ constexpr unsigned int num_chars{T::size() * 2};
+ static_assert(num_chars <= 64); // this test needs to be modified to allow for more than 64 hex chars
+ const std::string valid_64char_input{"0123456789abcdef0123456789ABCDEF0123456789abcdef0123456789ABCDEF"};
+ const auto valid_input{valid_64char_input.substr(0, num_chars)};
{
- std::string s_12{"0000000000000000000000000000000000000000000000000000000000000012"};
- BOOST_CHECK_EQUAL(uint256S("12\0").GetHex(), s_12);
- BOOST_CHECK_EQUAL(uint256S(std::string{"12\0", 3}).GetHex(), s_12);
- BOOST_CHECK_EQUAL(uint256S("0x12").GetHex(), s_12);
- BOOST_CHECK_EQUAL(uint256S(" 0x12").GetHex(), s_12);
- BOOST_CHECK_EQUAL(uint256S(" 12").GetHex(), s_12);
+ // check that lower and upper case hex characters are accepted
+ auto valid_result{T::FromHex(valid_input)};
+ BOOST_REQUIRE(valid_result);
+ BOOST_CHECK_EQUAL(valid_result->ToString(), ToLower(valid_input));
}
{
- std::string s_1{uint256::ONE.GetHex()};
- BOOST_CHECK_EQUAL(uint256S("1\0").GetHex(), s_1);
- BOOST_CHECK_EQUAL(uint256S(std::string{"1\0", 2}).GetHex(), s_1);
- BOOST_CHECK_EQUAL(uint256S("0x1").GetHex(), s_1);
- BOOST_CHECK_EQUAL(uint256S(" 0x1").GetHex(), s_1);
- BOOST_CHECK_EQUAL(uint256S(" 1").GetHex(), s_1);
+ // check that only strings of size num_chars are accepted
+ BOOST_CHECK(!T::FromHex(""));
+ BOOST_CHECK(!T::FromHex("0"));
+ BOOST_CHECK(!T::FromHex(valid_input.substr(0, num_chars / 2)));
+ BOOST_CHECK(!T::FromHex(valid_input.substr(0, num_chars - 1)));
+ BOOST_CHECK(!T::FromHex(valid_input + "0"));
}
{
- std::string s_0{uint256::ZERO.GetHex()};
- BOOST_CHECK_EQUAL(uint256S("\0").GetHex(), s_0);
- BOOST_CHECK_EQUAL(uint256S(std::string{"\0", 1}).GetHex(), s_0);
- BOOST_CHECK_EQUAL(uint256S("0x").GetHex(), s_0);
- BOOST_CHECK_EQUAL(uint256S(" 0x").GetHex(), s_0);
- BOOST_CHECK_EQUAL(uint256S(" ").GetHex(), s_0);
+ // check that non-hex characters are not accepted
+ std::string invalid_chars{R"( !"#$%&'()*+,-./:;<=>?@GHIJKLMNOPQRSTUVWXYZ[\]^_`ghijklmnopqrstuvwxyz{|}~)"};
+ for (auto c : invalid_chars) {
+ BOOST_CHECK(!T::FromHex(valid_input.substr(0, num_chars - 1) + c));
+ }
+ // 0x prefixes are invalid
+ std::string invalid_prefix{"0x" + valid_input};
+ BOOST_CHECK(!T::FromHex(std::string_view(invalid_prefix.data(), num_chars)));
+ BOOST_CHECK(!T::FromHex(invalid_prefix));
}
+ {
+ // check that string_view length is respected
+ std::string chars_68{valid_64char_input + "0123"};
+ BOOST_CHECK_EQUAL(T::FromHex(std::string_view(chars_68.data(), num_chars)).value().ToString(), ToLower(valid_input));
+ BOOST_CHECK(!T::FromHex(std::string_view(chars_68.data(), num_chars - 1))); // too short
+ BOOST_CHECK(!T::FromHex(std::string_view(chars_68.data(), num_chars + 1))); // too long
+ }
+}
+
+BOOST_AUTO_TEST_CASE(from_hex)
+{
+ TestFromHex<uint160>();
+ TestFromHex<uint256>();
+ TestFromHex<Txid>();
+ TestFromHex<Wtxid>();
+}
+
+BOOST_AUTO_TEST_CASE(from_user_hex)
+{
+ BOOST_CHECK_EQUAL(uint256::FromUserHex(""), uint256::ZERO);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("0x"), uint256::ZERO);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("0"), uint256::ZERO);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("00"), uint256::ZERO);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("1"), uint256::ONE);
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("0x10"), uint256{0x10});
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("10"), uint256{0x10});
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("0xFf"), uint256{0xff});
+ BOOST_CHECK_EQUAL(uint256::FromUserHex("Ff"), uint256{0xff});
+ const std::string valid_hex_64{"0x0123456789abcdef0123456789abcdef0123456789ABDCEF0123456789ABCDEF"};
+ BOOST_REQUIRE_EQUAL(valid_hex_64.size(), 2 + 64); // 0x prefix and 64 hex digits
+ BOOST_CHECK_EQUAL(uint256::FromUserHex(valid_hex_64.substr(2)).value().ToString(), ToLower(valid_hex_64.substr(2)));
+ BOOST_CHECK_EQUAL(uint256::FromUserHex(valid_hex_64.substr(0)).value().ToString(), ToLower(valid_hex_64.substr(2)));
+
+ BOOST_CHECK(!uint256::FromUserHex("0x0 ")); // no spaces at end,
+ BOOST_CHECK(!uint256::FromUserHex(" 0x0")); // or beginning,
+ BOOST_CHECK(!uint256::FromUserHex("0x 0")); // or middle,
+ BOOST_CHECK(!uint256::FromUserHex(" ")); // etc.
+ BOOST_CHECK(!uint256::FromUserHex("0x0ga")); // invalid character
+ BOOST_CHECK(!uint256::FromUserHex("x0")); // broken prefix
+ BOOST_CHECK(!uint256::FromUserHex("0x0x00")); // two prefixes not allowed
+ BOOST_CHECK(!uint256::FromUserHex(valid_hex_64.substr(2) + "0")); // 1 hex digit too many
+ BOOST_CHECK(!uint256::FromUserHex(valid_hex_64 + "a")); // 1 hex digit too many
+ BOOST_CHECK(!uint256::FromUserHex(valid_hex_64 + " ")); // whitespace after max length
+ BOOST_CHECK(!uint256::FromUserHex(valid_hex_64 + "z")); // invalid character after max length
}
BOOST_AUTO_TEST_CASE( check_ONE )
{
- uint256 one = uint256S("0000000000000000000000000000000000000000000000000000000000000001");
+ uint256 one = uint256{"0000000000000000000000000000000000000000000000000000000000000001"};
BOOST_CHECK_EQUAL(one, uint256::ONE);
}
+BOOST_AUTO_TEST_CASE(FromHex_vs_uint256)
+{
+ auto runtime_uint{uint256::FromHex("4A5E1E4BAAB89F3A32518A88C31BC87F618f76673e2cc77ab2127b7afdeda33b")};
+ constexpr uint256 consteval_uint{ "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"};
+ BOOST_CHECK_EQUAL(consteval_uint, runtime_uint);
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/util/CMakeLists.txt b/src/test/util/CMakeLists.txt
new file mode 100644
index 0000000000..5d88d1da3e
--- /dev/null
+++ b/src/test/util/CMakeLists.txt
@@ -0,0 +1,29 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(test_util STATIC EXCLUDE_FROM_ALL
+ blockfilter.cpp
+ coins.cpp
+ index.cpp
+ json.cpp
+ logging.cpp
+ mining.cpp
+ net.cpp
+ random.cpp
+ script.cpp
+ setup_common.cpp
+ str.cpp
+ transaction_utils.cpp
+ txmempool.cpp
+ validation.cpp
+ $<$<BOOL:${ENABLE_WALLET}>:${PROJECT_SOURCE_DIR}/src/wallet/test/util.cpp>
+)
+
+target_link_libraries(test_util
+ PRIVATE
+ core_interface
+ Boost::headers
+ PUBLIC
+ univalue
+)
diff --git a/src/test/util/chainstate.h b/src/test/util/chainstate.h
index 03b44fc894..e604b44c16 100644
--- a/src/test/util/chainstate.h
+++ b/src/test/util/chainstate.h
@@ -99,7 +99,7 @@ CreateAndActivateUTXOSnapshot(
assert(pindex->IsValid(BlockStatus::BLOCK_VALID_TREE));
pindex->nStatus = BlockStatus::BLOCK_VALID_TREE;
pindex->nTx = 0;
- pindex->nChainTx = 0;
+ pindex->m_chain_tx_count = 0;
pindex->nSequenceId = 0;
pindex = pindex->pprev;
}
@@ -124,11 +124,11 @@ CreateAndActivateUTXOSnapshot(
new_active.m_chain.SetTip(*(tip->pprev));
}
- bool res = node.chainman->ActivateSnapshot(auto_infile, metadata, in_memory_chainstate);
+ auto res = node.chainman->ActivateSnapshot(auto_infile, metadata, in_memory_chainstate);
// Restore the old tip.
new_active.m_chain.SetTip(*tip);
- return res;
+ return !!res;
}
diff --git a/src/test/util/cluster_linearize.h b/src/test/util/cluster_linearize.h
new file mode 100644
index 0000000000..b86ebcd78b
--- /dev/null
+++ b/src/test/util/cluster_linearize.h
@@ -0,0 +1,345 @@
+// 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.
+
+#ifndef BITCOIN_TEST_UTIL_CLUSTER_LINEARIZE_H
+#define BITCOIN_TEST_UTIL_CLUSTER_LINEARIZE_H
+
+#include <cluster_linearize.h>
+#include <serialize.h>
+#include <span.h>
+#include <streams.h>
+#include <util/bitset.h>
+#include <util/feefrac.h>
+
+#include <stdint.h>
+#include <numeric>
+#include <vector>
+#include <utility>
+
+namespace {
+
+using namespace cluster_linearize;
+
+using TestBitSet = BitSet<32>;
+
+/** Check if a graph is acyclic. */
+template<typename SetType>
+bool IsAcyclic(const DepGraph<SetType>& depgraph) noexcept
+{
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ if ((depgraph.Ancestors(i) & depgraph.Descendants(i)) != SetType::Singleton(i)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/** A formatter for a bespoke serialization for acyclic DepGraph objects.
+ *
+ * The serialization format outputs information about transactions in a topological order (parents
+ * before children), together with position information so transactions can be moved back to their
+ * correct position on deserialization.
+ *
+ * - For each transaction t in the DepGraph (in some topological order);
+ * - The size: VARINT(t.size), which cannot be 0.
+ * - The fee: VARINT(SignedToUnsigned(t.fee)), see below for SignedToUnsigned.
+ * - For each direct dependency:
+ * - VARINT(skip)
+ * - The position of t in the cluster: VARINT(skip)
+ * - The end of the graph: VARINT(0)
+ *
+ * The list of skip values encodes the dependencies of t, as well as its position in the cluster.
+ * Each skip value is the number of possibilities that were available, but were not taken. These
+ * possibilities are, in order:
+ * - For each previous transaction in the graph, in reverse serialization order, whether it is a
+ * direct parent of t (but excluding transactions which are already implied to be dependencies
+ * by parent relations that were serialized before it).
+ * - The various insertion positions in the cluster, from the very end of the cluster, to the
+ * front.
+ *
+ * Let's say you have a 7-transaction cluster, consisting of transactions F,A,C,B,G,E,D, but
+ * serialized in order A,B,C,D,E,F,G, because that happens to be a topological ordering. By the
+ * time G gets serialized, what has been serialized already represents the cluster F,A,C,B,E,D (in
+ * that order). G has B and E as direct parents, and E depends on C.
+ *
+ * In this case, the possibilities are, in order:
+ * - [ ] the dependency G->F
+ * - [X] the dependency G->E
+ * - [ ] the dependency G->D
+ * - [X] the dependency G->B
+ * - [ ] the dependency G->A
+ * - [ ] put G at the end of the cluster
+ * - [ ] put G before D
+ * - [X] put G before E
+ * - [ ] put G before B
+ * - [ ] put G before C
+ * - [ ] put G before A
+ * - [ ] put G before F
+ *
+ * The skip values in this case are 1 (G->F), 1 (G->D), 3 (G->A, G at end, G before D). No skip
+ * after 3 is needed (or permitted), because there can only be one position for G. Also note that
+ * G->C is not included in the list of possibilities, as it is implied by the included G->E and
+ * E->C that came before it. On deserialization, if the last skip value was 8 or larger (putting
+ * G before the beginning of the cluster), it is interpreted as wrapping around back to the end.
+ *
+ *
+ * Rationale:
+ * - Why VARINTs? They are flexible enough to represent large numbers where needed, but more
+ * compact for smaller numbers. The serialization format is designed so that simple structures
+ * involve smaller numbers, so smaller size maps to simpler graphs.
+ * - Why use SignedToUnsigned? It results in small unsigned values for signed values with small
+ * absolute value. This way we can encode negative fees in graphs, but still let small negative
+ * numbers have small encodings.
+ * - Why are the parents emitted in reverse order compared to the transactions themselves? This
+ * naturally lets us skip parents-of-parents, as they will be reflected as implied dependencies.
+ * - Why encode skip values and not a bitmask to convey the list positions? It turns out that the
+ * most complex graphs (in terms of linearization complexity) are ones with ~1 dependency per
+ * transaction. The current encoding uses ~1 byte per transaction for dependencies in this case,
+ * while a bitmask would require ~N/2 bits per transaction.
+ */
+
+struct DepGraphFormatter
+{
+ /** Convert x>=0 to 2x (even), x<0 to -2x-1 (odd). */
+ [[maybe_unused]] static uint64_t SignedToUnsigned(int64_t x) noexcept
+ {
+ if (x < 0) {
+ return 2 * uint64_t(-(x + 1)) + 1;
+ } else {
+ return 2 * uint64_t(x);
+ }
+ }
+
+ /** Convert even x to x/2 (>=0), odd x to -(x/2)-1 (<0). */
+ [[maybe_unused]] static int64_t UnsignedToSigned(uint64_t x) noexcept
+ {
+ if (x & 1) {
+ return -int64_t(x / 2) - 1;
+ } else {
+ return int64_t(x / 2);
+ }
+ }
+
+ template <typename Stream, typename SetType>
+ static void Ser(Stream& s, const DepGraph<SetType>& depgraph)
+ {
+ /** Construct a topological order to serialize the transactions in. */
+ std::vector<ClusterIndex> topo_order(depgraph.TxCount());
+ std::iota(topo_order.begin(), topo_order.end(), ClusterIndex{0});
+ std::sort(topo_order.begin(), topo_order.end(), [&](ClusterIndex a, ClusterIndex b) {
+ auto anc_a = depgraph.Ancestors(a).Count(), anc_b = depgraph.Ancestors(b).Count();
+ if (anc_a != anc_b) return anc_a < anc_b;
+ return a < b;
+ });
+
+ /** Which transactions the deserializer already knows when it has deserialized what has
+ * been serialized here so far, and in what order. */
+ std::vector<ClusterIndex> rebuilt_order;
+ rebuilt_order.reserve(depgraph.TxCount());
+
+ // Loop over the transactions in topological order.
+ for (ClusterIndex topo_idx = 0; topo_idx < topo_order.size(); ++topo_idx) {
+ /** Which depgraph index we are currently writing. */
+ ClusterIndex idx = topo_order[topo_idx];
+ // Write size, which must be larger than 0.
+ s << VARINT_MODE(depgraph.FeeRate(idx).size, VarIntMode::NONNEGATIVE_SIGNED);
+ // Write fee, encoded as an unsigned varint (odd=negative, even=non-negative).
+ s << VARINT(SignedToUnsigned(depgraph.FeeRate(idx).fee));
+ // Write dependency information.
+ SetType written_parents;
+ uint64_t diff = 0; //!< How many potential parent/child relations we have skipped over.
+ for (ClusterIndex dep_dist = 0; dep_dist < topo_idx; ++dep_dist) {
+ /** Which depgraph index we are currently considering as parent of idx. */
+ ClusterIndex dep_idx = topo_order[topo_idx - 1 - dep_dist];
+ // Ignore transactions which are already known to be ancestors.
+ if (depgraph.Descendants(dep_idx).Overlaps(written_parents)) continue;
+ if (depgraph.Ancestors(idx)[dep_idx]) {
+ // When an actual parent is encountered, encode how many non-parents were skipped
+ // before it.
+ s << VARINT(diff);
+ diff = 0;
+ written_parents.Set(dep_idx);
+ } else {
+ // When a non-parent is encountered, increment the skip counter.
+ ++diff;
+ }
+ }
+ // Write position information.
+ ClusterIndex insert_distance = 0;
+ while (insert_distance < rebuilt_order.size()) {
+ // Loop to find how far from the end in rebuilt_order to insert.
+ if (idx > *(rebuilt_order.end() - 1 - insert_distance)) break;
+ ++insert_distance;
+ }
+ rebuilt_order.insert(rebuilt_order.end() - insert_distance, idx);
+ s << VARINT(diff + insert_distance);
+ }
+
+ // Output a final 0 to denote the end of the graph.
+ s << uint8_t{0};
+ }
+
+ template <typename Stream, typename SetType>
+ void Unser(Stream& s, DepGraph<SetType>& depgraph)
+ {
+ /** The dependency graph which we deserialize into first, with transactions in
+ * topological serialization order, not original cluster order. */
+ DepGraph<SetType> topo_depgraph;
+ /** Mapping from serialization order to cluster order, used later to reconstruct the
+ * cluster order. */
+ std::vector<ClusterIndex> reordering;
+
+ // Read transactions in topological order.
+ try {
+ while (true) {
+ // Read size. Size 0 signifies the end of the DepGraph.
+ int32_t size;
+ s >> VARINT_MODE(size, VarIntMode::NONNEGATIVE_SIGNED);
+ size &= 0x3FFFFF; // Enough for size up to 4M.
+ static_assert(0x3FFFFF >= 4000000);
+ if (size == 0 || topo_depgraph.TxCount() == SetType::Size()) break;
+ // Read fee, encoded as an unsigned varint (odd=negative, even=non-negative).
+ uint64_t coded_fee;
+ s >> VARINT(coded_fee);
+ coded_fee &= 0xFFFFFFFFFFFFF; // Enough for fee between -21M...21M BTC.
+ static_assert(0xFFFFFFFFFFFFF > uint64_t{2} * 21000000 * 100000000);
+ auto fee = UnsignedToSigned(coded_fee);
+ // Extend topo_depgraph with the new transaction (preliminarily at the end).
+ auto topo_idx = topo_depgraph.AddTransaction({fee, size});
+ reordering.push_back(reordering.size());
+ // Read dependency information.
+ uint64_t diff = 0; //!< How many potential parents we have to skip.
+ s >> VARINT(diff);
+ for (ClusterIndex dep_dist = 0; dep_dist < topo_idx; ++dep_dist) {
+ /** Which topo_depgraph index we are currently considering as parent of topo_idx. */
+ ClusterIndex dep_topo_idx = topo_idx - 1 - dep_dist;
+ // Ignore transactions which are already known ancestors of topo_idx.
+ if (topo_depgraph.Descendants(dep_topo_idx)[topo_idx]) continue;
+ if (diff == 0) {
+ // When the skip counter has reached 0, add an actual dependency.
+ topo_depgraph.AddDependency(dep_topo_idx, topo_idx);
+ // And read the number of skips after it.
+ s >> VARINT(diff);
+ } else {
+ // Otherwise, dep_topo_idx is not a parent. Decrement and continue.
+ --diff;
+ }
+ }
+ // If we reach this point, we can interpret the remaining skip value as how far
+ // from the end of reordering the new transaction should be placed (wrapping
+ // around), so remove the preliminary position it was put in above (which was to
+ // make sure that if a deserialization exception occurs, the new transaction still
+ // has some entry in reordering).
+ reordering.pop_back();
+ ClusterIndex insert_distance = diff % (reordering.size() + 1);
+ // And then update reordering to reflect this new transaction's insertion.
+ for (auto& pos : reordering) {
+ pos += (pos >= reordering.size() - insert_distance);
+ }
+ reordering.push_back(reordering.size() - insert_distance);
+ }
+ } catch (const std::ios_base::failure&) {}
+
+ // Construct the original cluster order depgraph.
+ depgraph = DepGraph(topo_depgraph, reordering);
+ }
+};
+
+/** Perform a sanity/consistency check on a DepGraph. */
+template<typename SetType>
+void SanityCheck(const DepGraph<SetType>& depgraph)
+{
+ // Consistency check between ancestors internally.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ // Transactions include themselves as ancestors.
+ assert(depgraph.Ancestors(i)[i]);
+ // If a is an ancestor of b, then b's ancestors must include all of a's ancestors.
+ for (auto a : depgraph.Ancestors(i)) {
+ assert(depgraph.Ancestors(i).IsSupersetOf(depgraph.Ancestors(a)));
+ }
+ }
+ // Consistency check between ancestors and descendants.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ for (ClusterIndex j = 0; j < depgraph.TxCount(); ++j) {
+ assert(depgraph.Ancestors(i)[j] == depgraph.Descendants(j)[i]);
+ }
+ }
+ // If DepGraph is acyclic, serialize + deserialize must roundtrip.
+ if (IsAcyclic(depgraph)) {
+ std::vector<unsigned char> ser;
+ VectorWriter writer(ser, 0);
+ writer << Using<DepGraphFormatter>(depgraph);
+ SpanReader reader(ser);
+ DepGraph<TestBitSet> decoded_depgraph;
+ reader >> Using<DepGraphFormatter>(decoded_depgraph);
+ assert(depgraph == decoded_depgraph);
+ assert(reader.empty());
+ // It must also deserialize correctly without the terminal 0 byte (as the deserializer
+ // will upon EOF still return what it read so far).
+ assert(ser.size() >= 1 && ser.back() == 0);
+ ser.pop_back();
+ reader = SpanReader{ser};
+ decoded_depgraph = {};
+ reader >> Using<DepGraphFormatter>(decoded_depgraph);
+ assert(depgraph == decoded_depgraph);
+ assert(reader.empty());
+ }
+}
+
+/** Verify that a DepGraph corresponds to the information in a cluster. */
+template<typename SetType>
+void VerifyDepGraphFromCluster(const Cluster<SetType>& cluster, const DepGraph<SetType>& depgraph)
+{
+ // Sanity check the depgraph, which includes a check for correspondence between ancestors and
+ // descendants, so it suffices to check just ancestors below.
+ SanityCheck(depgraph);
+ // Verify transaction count.
+ assert(cluster.size() == depgraph.TxCount());
+ // Verify feerates.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ assert(depgraph.FeeRate(i) == cluster[i].first);
+ }
+ // Verify ancestors.
+ for (ClusterIndex i = 0; i < depgraph.TxCount(); ++i) {
+ // Start with the transaction having itself as ancestor.
+ auto ancestors = SetType::Singleton(i);
+ // Add parents of ancestors to the set of ancestors until it stops changing.
+ while (true) {
+ const auto old_ancestors = ancestors;
+ for (auto ancestor : ancestors) {
+ ancestors |= cluster[ancestor].second;
+ }
+ if (old_ancestors == ancestors) break;
+ }
+ // Compare against depgraph.
+ assert(depgraph.Ancestors(i) == ancestors);
+ // Some additional sanity tests:
+ // - Every transaction has itself as ancestor.
+ assert(ancestors[i]);
+ // - Every transaction has its direct parents as ancestors.
+ for (auto parent : cluster[i].second) {
+ assert(ancestors[parent]);
+ }
+ }
+}
+
+/** Perform a sanity check on a linearization. */
+template<typename SetType>
+void SanityCheck(const DepGraph<SetType>& depgraph, Span<const ClusterIndex> linearization)
+{
+ // Check completeness.
+ assert(linearization.size() == depgraph.TxCount());
+ TestBitSet done;
+ for (auto i : linearization) {
+ // Check transaction position is in range.
+ assert(i < depgraph.TxCount());
+ // Check topology and lack of duplicates.
+ assert((depgraph.Ancestors(i) - done) == TestBitSet::Singleton(i));
+ done.Set(i);
+ }
+}
+
+} // namespace
+
+#endif // BITCOIN_TEST_UTIL_CLUSTER_LINEARIZE_H
diff --git a/src/test/util/coins.cpp b/src/test/util/coins.cpp
index 742dbc04d1..7e10c7c58d 100644
--- a/src/test/util/coins.cpp
+++ b/src/test/util/coins.cpp
@@ -13,12 +13,12 @@
#include <stdint.h>
#include <utility>
-COutPoint AddTestCoin(CCoinsViewCache& coins_view)
+COutPoint AddTestCoin(FastRandomContext& rng, CCoinsViewCache& coins_view)
{
Coin new_coin;
- COutPoint outpoint{Txid::FromUint256(InsecureRand256()), /*nIn=*/0};
+ COutPoint outpoint{Txid::FromUint256(rng.rand256()), /*nIn=*/0};
new_coin.nHeight = 1;
- new_coin.out.nValue = InsecureRandMoneyAmount();
+ new_coin.out.nValue = RandMoney(rng);
new_coin.out.scriptPubKey.assign(uint32_t{56}, 1);
coins_view.AddCoin(outpoint, std::move(new_coin), /*possible_overwrite=*/false);
diff --git a/src/test/util/coins.h b/src/test/util/coins.h
index 5e6f4293ae..89a9e7b329 100644
--- a/src/test/util/coins.h
+++ b/src/test/util/coins.h
@@ -8,12 +8,13 @@
#include <primitives/transaction.h>
class CCoinsViewCache;
+class FastRandomContext;
/**
* Create a Coin with DynamicMemoryUsage of 80 bytes and add it to the given view.
* @param[in,out] coins_view The coins view cache to add the new coin to.
* @returns the COutPoint of the created coin.
*/
-COutPoint AddTestCoin(CCoinsViewCache& coins_view);
+COutPoint AddTestCoin(FastRandomContext& rng, CCoinsViewCache& coins_view);
#endif // BITCOIN_TEST_UTIL_COINS_H
diff --git a/src/test/util/json.cpp b/src/test/util/json.cpp
index ad3c346c84..46a4a9f9a1 100644
--- a/src/test/util/json.cpp
+++ b/src/test/util/json.cpp
@@ -1,15 +1,15 @@
-// Copyright (c) 2023 The Bitcoin Core developers
+// 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.
#include <test/util/json.h>
-#include <string>
+#include <univalue.h>
#include <util/check.h>
-#include <univalue.h>
+#include <string_view>
-UniValue read_json(const std::string& jsondata)
+UniValue read_json(std::string_view jsondata)
{
UniValue v;
Assert(v.read(jsondata) && v.isArray());
diff --git a/src/test/util/json.h b/src/test/util/json.h
index 5b1026762e..f6f4e6ab71 100644
--- a/src/test/util/json.h
+++ b/src/test/util/json.h
@@ -1,14 +1,14 @@
-// Copyright (c) 2023 The Bitcoin Core developers
+// 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.
#ifndef BITCOIN_TEST_UTIL_JSON_H
#define BITCOIN_TEST_UTIL_JSON_H
-#include <string>
-
#include <univalue.h>
-UniValue read_json(const std::string& jsondata);
+#include <string_view>
+
+UniValue read_json(std::string_view jsondata);
#endif // BITCOIN_TEST_UTIL_JSON_H
diff --git a/src/test/util/net.cpp b/src/test/util/net.cpp
index 9257a4964a..beefc32bee 100644
--- a/src/test/util/net.cpp
+++ b/src/test/util/net.cpp
@@ -28,7 +28,8 @@ void ConnmanTestMsg::Handshake(CNode& node,
auto& connman{*this};
peerman.InitializeNode(node, local_services);
- FlushSendBuffer(node); // Drop the version message added by InitializeNode.
+ peerman.SendMessages(&node);
+ FlushSendBuffer(node); // Drop the version message added by SendMessages.
CSerializedNetMsg msg_version{
NetMsg::Make(NetMsgType::VERSION,
@@ -118,20 +119,20 @@ std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(int n_candida
candidates.reserve(n_candidates);
for (int id = 0; id < n_candidates; ++id) {
candidates.push_back({
- /*id=*/id,
- /*m_connected=*/std::chrono::seconds{random_context.randrange(100)},
- /*m_min_ping_time=*/std::chrono::microseconds{random_context.randrange(100)},
- /*m_last_block_time=*/std::chrono::seconds{random_context.randrange(100)},
- /*m_last_tx_time=*/std::chrono::seconds{random_context.randrange(100)},
- /*fRelevantServices=*/random_context.randbool(),
- /*m_relay_txs=*/random_context.randbool(),
- /*fBloomFilter=*/random_context.randbool(),
- /*nKeyedNetGroup=*/random_context.randrange(100),
- /*prefer_evict=*/random_context.randbool(),
- /*m_is_local=*/random_context.randbool(),
- /*m_network=*/ALL_NETWORKS[random_context.randrange(ALL_NETWORKS.size())],
- /*m_noban=*/false,
- /*m_conn_type=*/ConnectionType::INBOUND,
+ .id=id,
+ .m_connected=std::chrono::seconds{random_context.randrange(100)},
+ .m_min_ping_time=std::chrono::microseconds{random_context.randrange(100)},
+ .m_last_block_time=std::chrono::seconds{random_context.randrange(100)},
+ .m_last_tx_time=std::chrono::seconds{random_context.randrange(100)},
+ .fRelevantServices=random_context.randbool(),
+ .m_relay_txs=random_context.randbool(),
+ .fBloomFilter=random_context.randbool(),
+ .nKeyedNetGroup=random_context.randrange(100u),
+ .prefer_evict=random_context.randbool(),
+ .m_is_local=random_context.randbool(),
+ .m_network=ALL_NETWORKS[random_context.randrange(ALL_NETWORKS.size())],
+ .m_noban=false,
+ .m_conn_type=ConnectionType::INBOUND,
});
}
return candidates;
diff --git a/src/test/util/net.h b/src/test/util/net.h
index d91d801132..043e317bf0 100644
--- a/src/test/util/net.h
+++ b/src/test/util/net.h
@@ -34,6 +34,11 @@ class Span;
struct ConnmanTestMsg : public CConnman {
using CConnman::CConnman;
+ void SetMsgProc(NetEventsInterface* msgproc)
+ {
+ m_msgproc = msgproc;
+ }
+
void SetPeerConnectTimeout(std::chrono::seconds timeout)
{
m_peer_connect_timeout = timeout;
diff --git a/src/test/util/random.cpp b/src/test/util/random.cpp
index 4c87ab8df8..32d785e45d 100644
--- a/src/test/util/random.cpp
+++ b/src/test/util/random.cpp
@@ -7,27 +7,36 @@
#include <logging.h>
#include <random.h>
#include <uint256.h>
+#include <util/check.h>
#include <cstdlib>
-#include <string>
+#include <iostream>
-FastRandomContext g_insecure_rand_ctx;
+extern void MakeRandDeterministicDANGEROUS(const uint256& seed) noexcept;
-/** Return the unsigned from the environment var if available, otherwise 0 */
-static uint256 GetUintFromEnv(const std::string& env_name)
+void SeedRandomStateForTest(SeedRand seedtype)
{
- const char* num = std::getenv(env_name.c_str());
- if (!num) return {};
- return uint256S(num);
-}
+ constexpr auto RANDOM_CTX_SEED{"RANDOM_CTX_SEED"};
-void Seed(FastRandomContext& ctx)
-{
- // Should be enough to get the seed once for the process
- static uint256 seed{};
- static const std::string RANDOM_CTX_SEED{"RANDOM_CTX_SEED"};
- if (seed.IsNull()) seed = GetUintFromEnv(RANDOM_CTX_SEED);
- if (seed.IsNull()) seed = GetRandHash();
- LogPrintf("%s: Setting random seed for current tests to %s=%s\n", __func__, RANDOM_CTX_SEED, seed.GetHex());
- ctx = FastRandomContext(seed);
+ // Do this once, on the first call, regardless of seedtype, because once
+ // MakeRandDeterministicDANGEROUS is called, the output of GetRandHash is
+ // no longer truly random. It should be enough to get the seed once for the
+ // process.
+ static const uint256 ctx_seed = []() {
+ // If RANDOM_CTX_SEED is set, use that as seed.
+ if (const char* num{std::getenv(RANDOM_CTX_SEED)}) {
+ if (auto num_parsed{uint256::FromUserHex(num)}) {
+ return *num_parsed;
+ } else {
+ std::cerr << RANDOM_CTX_SEED << " must consist of up to " << uint256::size() * 2 << " hex digits (\"0x\" prefix allowed), it was set to: '" << num << "'.\n";
+ std::abort();
+ }
+ }
+ // Otherwise use a (truly) random value.
+ return GetRandHash();
+ }();
+
+ const uint256& seed{seedtype == SeedRand::FIXED_SEED ? ctx_seed : uint256::ZERO};
+ LogInfo("Setting random seed for current tests to %s=%s\n", RANDOM_CTX_SEED, seed.GetHex());
+ MakeRandDeterministicDANGEROUS(seed);
}
diff --git a/src/test/util/random.h b/src/test/util/random.h
index 18ab425e48..441150e666 100644
--- a/src/test/util/random.h
+++ b/src/test/util/random.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2023 The Bitcoin Core developers
+// 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.
@@ -11,64 +11,26 @@
#include <cstdint>
-/**
- * This global and the helpers that use it are not thread-safe.
- *
- * If thread-safety is needed, a per-thread instance could be
- * used in the multi-threaded test.
- */
-extern FastRandomContext g_insecure_rand_ctx;
-
-/**
- * Flag to make GetRand in random.h return the same number
- */
-extern bool g_mock_deterministic_tests;
-
enum class SeedRand {
- ZEROS, //!< Seed with a compile time constant of zeros
- SEED, //!< Call the Seed() helper
+ /**
+ * Seed with a compile time constant of zeros.
+ */
+ ZEROS,
+ /**
+ * Seed with a fixed value that never changes over the lifetime of this
+ * process. The seed is read from the RANDOM_CTX_SEED environment variable
+ * if set, otherwise generated randomly once, saved, and reused.
+ */
+ FIXED_SEED,
};
-/** Seed the given random ctx or use the seed passed in via an environment var */
-void Seed(FastRandomContext& ctx);
-
-static inline void SeedInsecureRand(SeedRand seed = SeedRand::SEED)
-{
- if (seed == SeedRand::ZEROS) {
- g_insecure_rand_ctx = FastRandomContext(/*fDeterministic=*/true);
- } else {
- Seed(g_insecure_rand_ctx);
- }
-}
-
-static inline uint32_t InsecureRand32()
-{
- return g_insecure_rand_ctx.rand32();
-}
-
-static inline uint256 InsecureRand256()
-{
- return g_insecure_rand_ctx.rand256();
-}
-
-static inline uint64_t InsecureRandBits(int bits)
-{
- return g_insecure_rand_ctx.randbits(bits);
-}
-
-static inline uint64_t InsecureRandRange(uint64_t range)
-{
- return g_insecure_rand_ctx.randrange(range);
-}
-
-static inline bool InsecureRandBool()
-{
- return g_insecure_rand_ctx.randbool();
-}
+/** Seed the global RNG state for testing and log the seed value. This affects all randomness, except GetStrongRandBytes(). */
+void SeedRandomStateForTest(SeedRand seed);
-static inline CAmount InsecureRandMoneyAmount()
+template <RandomNumberGenerator Rng>
+inline CAmount RandMoney(Rng&& rng)
{
- return static_cast<CAmount>(InsecureRandRange(MAX_MONEY + 1));
+ return CAmount{rng.randrange(MAX_MONEY + 1)};
}
#endif // BITCOIN_TEST_UTIL_RANDOM_H
diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp
index cc7b2d6546..fa89ceb332 100644
--- a/src/test/util/setup_common.cpp
+++ b/src/test/util/setup_common.cpp
@@ -1,13 +1,9 @@
-// Copyright (c) 2011-2022 The Bitcoin Core developers
+// Copyright (c) 2011-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.
-#include <config/bitcoin-config.h> // IWYU pragma: keep
-
#include <test/util/setup_common.h>
-#include <kernel/validation_cache_sizes.h>
-
#include <addrman.h>
#include <banman.h>
#include <chainparams.h>
@@ -30,11 +26,9 @@
#include <node/mempool_args.h>
#include <node/miner.h>
#include <node/peerman_args.h>
-#include <node/validation_cache_args.h>
#include <node/warnings.h>
#include <noui.h>
#include <policy/fees.h>
-#include <policy/fees_args.h>
#include <pow.h>
#include <random.h>
#include <rpc/blockchain.h>
@@ -67,8 +61,8 @@
#include <functional>
#include <stdexcept>
+using namespace util::hex_literals;
using kernel::BlockTreeDB;
-using kernel::ValidationCacheSizes;
using node::ApplyArgsManOptions;
using node::BlockAssembler;
using node::BlockManager;
@@ -80,14 +74,9 @@ using node::VerifyLoadedChainstate;
const std::function<std::string(const char*)> G_TRANSLATION_FUN = nullptr;
-/** Random context to get unique temp data dirs. Separate from g_insecure_rand_ctx, which can be seeded from a const env var */
-static FastRandomContext g_insecure_rand_ctx_temp_path;
-
-std::ostream& operator<<(std::ostream& os, const uint256& num)
-{
- os << num.ToString();
- return os;
-}
+constexpr inline auto TEST_DIR_PATH_ELEMENT{"test_common bitcoin"}; // Includes a space to catch possible path escape issues.
+/** Random context to get unique temp data dirs. Separate from m_rng, which can be seeded from a const env var */
+static FastRandomContext g_rng_temp_path;
struct NetworkSetup
{
@@ -101,7 +90,7 @@ static NetworkSetup g_networksetup_instance;
/** Register test-only arguments */
static void SetupUnitTestArgs(ArgsManager& argsman)
{
- argsman.AddArg("-testdatadir", strprintf("Custom data directory (default: %s<random_string>)", fs::PathToString(fs::temp_directory_path() / "test_common_" PACKAGE_NAME / "")),
+ argsman.AddArg("-testdatadir", strprintf("Custom data directory (default: %s<random_string>)", fs::PathToString(fs::temp_directory_path() / TEST_DIR_PATH_ELEMENT / "")),
ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
}
@@ -112,7 +101,7 @@ static void ExitFailure(std::string_view str_err)
exit(EXIT_FAILURE);
}
-BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vector<const char*>& extra_args)
+BasicTestingSetup::BasicTestingSetup(const ChainType chainType, TestOpts opts)
: m_args{}
{
m_node.shutdown = &m_interrupt;
@@ -129,7 +118,7 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vecto
"-debugexclude=libevent",
"-debugexclude=leveldb",
},
- extra_args);
+ opts.extra_args);
if (G_TEST_COMMAND_LINE_ARGUMENTS) {
arguments = Cat(arguments, G_TEST_COMMAND_LINE_ARGUMENTS());
}
@@ -145,10 +134,14 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vecto
}
}
+ // Use randomly chosen seed for deterministic PRNG, so that (by default) test
+ // data directories use a random name that doesn't overlap with other tests.
+ SeedRandomForTest(SeedRand::FIXED_SEED);
+
if (!m_node.args->IsArgSet("-testdatadir")) {
// By default, the data directory has a random name
- const auto rand_str{g_insecure_rand_ctx_temp_path.rand256().ToString()};
- m_path_root = fs::temp_directory_path() / "test_common_" PACKAGE_NAME / rand_str;
+ const auto rand_str{g_rng_temp_path.rand256().ToString()};
+ m_path_root = fs::temp_directory_path() / TEST_DIR_PATH_ELEMENT / rand_str;
TryCreateDirectories(m_path_root);
} else {
// Custom data directory
@@ -158,7 +151,7 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vecto
root_dir = fs::absolute(root_dir);
const std::string test_path{G_TEST_GET_FULL_NAME ? G_TEST_GET_FULL_NAME() : ""};
- m_path_lock = root_dir / "test_common_" PACKAGE_NAME / fs::PathFromString(test_path);
+ m_path_lock = root_dir / TEST_DIR_PATH_ELEMENT / fs::PathFromString(test_path);
m_path_root = m_path_lock / "datadir";
// Try to obtain the lock; if unsuccessful don't disturb the existing test.
@@ -178,7 +171,6 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vecto
gArgs.ForceSetArg("-datadir", fs::PathToString(m_path_root));
SelectParams(chainType);
- SeedInsecureRand();
if (G_TEST_LOG_FUN) LogInstance().PushBackCallback(G_TEST_LOG_FUN);
InitLogging(*m_node.args);
AppInitParameterInteraction(*m_node.args);
@@ -188,11 +180,6 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vecto
m_node.ecc_context = std::make_unique<ECC_Context>();
SetupEnvironment();
- ValidationCacheSizes validation_cache_sizes{};
- ApplyArgsManOptions(*m_node.args, validation_cache_sizes);
- Assert(InitSignatureCache(validation_cache_sizes.signature_cache_bytes));
- Assert(InitScriptExecutionCache(validation_cache_sizes.script_execution_cache_bytes));
-
m_node.chain = interfaces::MakeChain(m_node);
static bool noui_connected = false;
if (!noui_connected) {
@@ -217,18 +204,19 @@ BasicTestingSetup::~BasicTestingSetup()
gArgs.ClearArgs();
}
-ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vector<const char*>& extra_args)
- : BasicTestingSetup(chainType, extra_args)
+ChainTestingSetup::ChainTestingSetup(const ChainType chainType, TestOpts opts)
+ : BasicTestingSetup(chainType, opts)
{
const CChainParams& chainparams = Params();
// We have to run a scheduler thread to prevent ActivateBestChain
// 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(); });
- m_node.validation_signals = std::make_unique<ValidationSignals>(std::make_unique<SerialTaskRunner>(*m_node.scheduler));
+ if (opts.setup_validation_interface) {
+ m_node.scheduler = std::make_unique<CScheduler>();
+ m_node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { m_node.scheduler->serviceQueue(); });
+ 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);
bilingual_str error{};
m_node.mempool = std::make_unique<CTxMemPool>(MemPoolOptionsForTest(m_node), error);
Assert(error.empty());
@@ -238,37 +226,47 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
m_node.notifications = std::make_unique<KernelNotifications>(*Assert(m_node.shutdown), m_node.exit_status, *Assert(m_node.warnings));
- const ChainstateManager::Options chainman_opts{
- .chainparams = chainparams,
- .datadir = m_args.GetDataDirNet(),
- .check_block_index = 1,
- .notifications = *m_node.notifications,
- .signals = m_node.validation_signals.get(),
- .worker_threads_num = 2,
- };
- const BlockManager::Options blockman_opts{
- .chainparams = chainman_opts.chainparams,
- .blocks_dir = m_args.GetBlocksDirPath(),
- .notifications = chainman_opts.notifications,
+ m_make_chainman = [this, &chainparams, opts] {
+ Assert(!m_node.chainman);
+ ChainstateManager::Options chainman_opts{
+ .chainparams = chainparams,
+ .datadir = m_args.GetDataDirNet(),
+ .check_block_index = 1,
+ .notifications = *m_node.notifications,
+ .signals = m_node.validation_signals.get(),
+ .worker_threads_num = 2,
+ };
+ if (opts.min_validation_cache) {
+ chainman_opts.script_execution_cache_bytes = 0;
+ chainman_opts.signature_cache_bytes = 0;
+ }
+ const BlockManager::Options blockman_opts{
+ .chainparams = chainman_opts.chainparams,
+ .blocks_dir = m_args.GetBlocksDirPath(),
+ .notifications = chainman_opts.notifications,
+ };
+ m_node.chainman = std::make_unique<ChainstateManager>(*Assert(m_node.shutdown), chainman_opts, blockman_opts);
+ LOCK(m_node.chainman->GetMutex());
+ m_node.chainman->m_blockman.m_block_tree_db = std::make_unique<BlockTreeDB>(DBParams{
+ .path = m_args.GetDataDirNet() / "blocks" / "index",
+ .cache_bytes = static_cast<size_t>(m_cache_sizes.block_tree_db),
+ .memory_only = true,
+ });
};
- m_node.chainman = std::make_unique<ChainstateManager>(*Assert(m_node.shutdown), chainman_opts, blockman_opts);
- m_node.chainman->m_blockman.m_block_tree_db = std::make_unique<BlockTreeDB>(DBParams{
- .path = m_args.GetDataDirNet() / "blocks" / "index",
- .cache_bytes = static_cast<size_t>(m_cache_sizes.block_tree_db),
- .memory_only = true});
+ m_make_chainman();
}
ChainTestingSetup::~ChainTestingSetup()
{
if (m_node.scheduler) m_node.scheduler->stop();
- m_node.validation_signals->FlushBackgroundCallbacks();
+ if (m_node.validation_signals) m_node.validation_signals->FlushBackgroundCallbacks();
m_node.connman.reset();
m_node.banman.reset();
m_node.addrman.reset();
m_node.netgroupman.reset();
m_node.args = nullptr;
m_node.mempool.reset();
- m_node.fee_estimator.reset();
+ Assert(!m_node.fee_estimator); // Each test must create a local object, if they wish to use the fee_estimator
m_node.chainman.reset();
m_node.validation_signals.reset();
m_node.scheduler.reset();
@@ -301,19 +299,19 @@ void ChainTestingSetup::LoadVerifyActivateChainstate()
TestingSetup::TestingSetup(
const ChainType chainType,
- const std::vector<const char*>& extra_args,
- const bool coins_db_in_memory,
- const bool block_tree_db_in_memory)
- : ChainTestingSetup(chainType, extra_args)
+ TestOpts opts)
+ : ChainTestingSetup(chainType, opts)
{
- m_coins_db_in_memory = coins_db_in_memory;
- m_block_tree_db_in_memory = block_tree_db_in_memory;
+ m_coins_db_in_memory = opts.coins_db_in_memory;
+ m_block_tree_db_in_memory = opts.block_tree_db_in_memory;
// Ideally we'd move all the RPC tests to the functional testing framework
// instead of unit tests, but for now we need these here.
RegisterAllCoreRPCCommands(tableRPC);
LoadVerifyActivateChainstate();
+ if (!opts.setup_net) return;
+
m_node.netgroupman = std::make_unique<NetGroupManager>(/*asmap=*/std::vector<bool>());
m_node.addrman = std::make_unique<AddrMan>(*m_node.netgroupman,
/*deterministic=*/false,
@@ -336,11 +334,9 @@ TestingSetup::TestingSetup(
}
TestChain100Setup::TestChain100Setup(
- const ChainType chain_type,
- const std::vector<const char*>& extra_args,
- const bool coins_db_in_memory,
- const bool block_tree_db_in_memory)
- : TestingSetup{ChainType::REGTEST, extra_args, coins_db_in_memory, block_tree_db_in_memory}
+ const ChainType chain_type,
+ TestOpts opts)
+ : TestingSetup{ChainType::REGTEST, opts}
{
SetMockTime(1598887952);
constexpr std::array<unsigned char, 32> vchKey = {
@@ -566,7 +562,7 @@ void TestChain100Setup::MockMempoolMinFee(const CFeeRate& target_feerate)
// Manually create an invalid transaction. Manually set the fee in the CTxMemPoolEntry to
// achieve the exact target feerate.
CMutableTransaction mtx = CMutableTransaction();
- mtx.vin.emplace_back(COutPoint{Txid::FromUint256(g_insecure_rand_ctx.rand256()), 0});
+ mtx.vin.emplace_back(COutPoint{Txid::FromUint256(m_rng.rand256()), 0});
mtx.vout.emplace_back(1 * COIN, GetScriptForDestination(WitnessV0ScriptHash(CScript() << OP_TRUE)));
const auto tx{MakeTransactionRef(mtx)};
LockPoints lp;
@@ -587,8 +583,23 @@ CBlock getBlock13b8a()
{
CBlock block;
DataStream stream{
- ParseHex("0100000090f0a9f110702f808219ebea1173056042a714bad51b916cb6800000000000005275289558f51c9966699404ae2294730c3c9f9bda53523ce50e9b95e558da2fdb261b4d4c86041b1ab1bf930901000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0146ffffffff0100f2052a01000000434104e18f7afbe4721580e81e8414fc8c24d7cfacf254bb5c7b949450c3e997c2dc1242487a8169507b631eb3771f2b425483fb13102c4eb5d858eef260fe70fbfae0ac00000000010000000196608ccbafa16abada902780da4dc35dafd7af05fa0da08cf833575f8cf9e836000000004a493046022100dab24889213caf43ae6adc41cf1c9396c08240c199f5225acf45416330fd7dbd022100fe37900e0644bf574493a07fc5edba06dbc07c311b947520c2d514bc5725dcb401ffffffff0100f2052a010000001976a914f15d1921f52e4007b146dfa60f369ed2fc393ce288ac000000000100000001fb766c1288458c2bafcfec81e48b24d98ec706de6b8af7c4e3c29419bfacb56d000000008c493046022100f268ba165ce0ad2e6d93f089cfcd3785de5c963bb5ea6b8c1b23f1ce3e517b9f022100da7c0f21adc6c401887f2bfd1922f11d76159cbc597fbd756a23dcbb00f4d7290141042b4e8625a96127826915a5b109852636ad0da753c9e1d5606a50480cd0c40f1f8b8d898235e571fe9357d9ec842bc4bba1827daaf4de06d71844d0057707966affffffff0280969800000000001976a9146963907531db72d0ed1a0cfb471ccb63923446f388ac80d6e34c000000001976a914f0688ba1c0d1ce182c7af6741e02658c7d4dfcd388ac000000000100000002c40297f730dd7b5a99567eb8d27b78758f607507c52292d02d4031895b52f2ff010000008b483045022100f7edfd4b0aac404e5bab4fd3889e0c6c41aa8d0e6fa122316f68eddd0a65013902205b09cc8b2d56e1cd1f7f2fafd60a129ed94504c4ac7bdc67b56fe67512658b3e014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffffca5065ff9617cbcba45eb23726df6498a9b9cafed4f54cbab9d227b0035ddefb000000008a473044022068010362a13c7f9919fa832b2dee4e788f61f6f5d344a7c2a0da6ae740605658022006d1af525b9a14a35c003b78b72bd59738cd676f845d1ff3fc25049e01003614014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffff01001ec4110200000043410469ab4181eceb28985b9b4e895c13fa5e68d85761b7eee311db5addef76fa8621865134a221bd01f28ec9999ee3e021e60766e9d1f3458c115fb28650605f11c9ac000000000100000001cdaf2f758e91c514655e2dc50633d1e4c84989f8aa90a0dbc883f0d23ed5c2fa010000008b48304502207ab51be6f12a1962ba0aaaf24a20e0b69b27a94fac5adf45aa7d2d18ffd9236102210086ae728b370e5329eead9accd880d0cb070aea0c96255fae6c4f1ddcce1fd56e014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff02404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac002d3101000000001976a9141befba0cdc1ad56529371864d9f6cb042faa06b588ac000000000100000001b4a47603e71b61bc3326efd90111bf02d2f549b067f4c4a8fa183b57a0f800cb010000008a4730440220177c37f9a505c3f1a1f0ce2da777c339bd8339ffa02c7cb41f0a5804f473c9230220585b25a2ee80eb59292e52b987dad92acb0c64eced92ed9ee105ad153cdb12d001410443bd44f683467e549dae7d20d1d79cbdb6df985c6e9c029c8d0c6cb46cc1a4d3cf7923c5021b27f7a0b562ada113bc85d5fda5a1b41e87fe6e8802817cf69996ffffffff0280651406000000001976a9145505614859643ab7b547cd7f1f5e7e2a12322d3788ac00aa0271000000001976a914ea4720a7a52fc166c55ff2298e07baf70ae67e1b88ac00000000010000000586c62cd602d219bb60edb14a3e204de0705176f9022fe49a538054fb14abb49e010000008c493046022100f2bc2aba2534becbdf062eb993853a42bbbc282083d0daf9b4b585bd401aa8c9022100b1d7fd7ee0b95600db8535bbf331b19eed8d961f7a8e54159c53675d5f69df8c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff03ad0e58ccdac3df9dc28a218bcf6f1997b0a93306faaa4b3a28ae83447b2179010000008b483045022100be12b2937179da88599e27bb31c3525097a07cdb52422d165b3ca2f2020ffcf702200971b51f853a53d644ebae9ec8f3512e442b1bcb6c315a5b491d119d10624c83014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff2acfcab629bbc8685792603762c921580030ba144af553d271716a95089e107b010000008b483045022100fa579a840ac258871365dd48cd7552f96c8eea69bd00d84f05b283a0dab311e102207e3c0ee9234814cfbb1b659b83671618f45abc1326b9edcc77d552a4f2a805c0014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffdcdc6023bbc9944a658ddc588e61eacb737ddf0a3cd24f113b5a8634c517fcd2000000008b4830450221008d6df731df5d32267954bd7d2dda2302b74c6c2a6aa5c0ca64ecbabc1af03c75022010e55c571d65da7701ae2da1956c442df81bbf076cdbac25133f99d98a9ed34c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffe15557cd5ce258f479dfd6dc6514edf6d7ed5b21fcfa4a038fd69f06b83ac76e010000008b483045022023b3e0ab071eb11de2eb1cc3a67261b866f86bf6867d4558165f7c8c8aca2d86022100dc6e1f53a91de3efe8f63512850811f26284b62f850c70ca73ed5de8771fb451014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff01404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000010000000166d7577163c932b4f9690ca6a80b6e4eb001f0a2fa9023df5595602aae96ed8d000000008a4730440220262b42546302dfb654a229cefc86432b89628ff259dc87edd1154535b16a67e102207b4634c020a97c3e7bbd0d4d19da6aa2269ad9dded4026e896b213d73ca4b63f014104979b82d02226b3a4597523845754d44f13639e3bf2df5e82c6aab2bdc79687368b01b1ab8b19875ae3c90d661a3d0a33161dab29934edeb36aa01976be3baf8affffffff02404b4c00000000001976a9144854e695a02af0aeacb823ccbc272134561e0a1688ac40420f00000000001976a914abee93376d6b37b5c2940655a6fcaf1c8e74237988ac0000000001000000014e3f8ef2e91349a9059cb4f01e54ab2597c1387161d3da89919f7ea6acdbb371010000008c49304602210081f3183471a5ca22307c0800226f3ef9c353069e0773ac76bb580654d56aa523022100d4c56465bdc069060846f4fbf2f6b20520b2a80b08b168b31e66ddb9c694e240014104976c79848e18251612f8940875b2b08d06e6dc73b9840e8860c066b7e87432c477e9a59a453e71e6d76d5fe34058b800a098fc1740ce3012e8fc8a00c96af966ffffffff02c0e1e400000000001976a9144134e75a6fcb6042034aab5e18570cf1f844f54788ac404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000"),
+ "0100000090f0a9f110702f808219ebea1173056042a714bad51b916cb6800000000000005275289558f51c9966699404ae2294730c3c9f9bda53523ce50e9b95e558da2fdb261b4d4c86041b1ab1bf930901000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0146ffffffff0100f2052a01000000434104e18f7afbe4721580e81e8414fc8c24d7cfacf254bb5c7b949450c3e997c2dc1242487a8169507b631eb3771f2b425483fb13102c4eb5d858eef260fe70fbfae0ac00000000010000000196608ccbafa16abada902780da4dc35dafd7af05fa0da08cf833575f8cf9e836000000004a493046022100dab24889213caf43ae6adc41cf1c9396c08240c199f5225acf45416330fd7dbd022100fe37900e0644bf574493a07fc5edba06dbc07c311b947520c2d514bc5725dcb401ffffffff0100f2052a010000001976a914f15d1921f52e4007b146dfa60f369ed2fc393ce288ac000000000100000001fb766c1288458c2bafcfec81e48b24d98ec706de6b8af7c4e3c29419bfacb56d000000008c493046022100f268ba165ce0ad2e6d93f089cfcd3785de5c963bb5ea6b8c1b23f1ce3e517b9f022100da7c0f21adc6c401887f2bfd1922f11d76159cbc597fbd756a23dcbb00f4d7290141042b4e8625a96127826915a5b109852636ad0da753c9e1d5606a50480cd0c40f1f8b8d898235e571fe9357d9ec842bc4bba1827daaf4de06d71844d0057707966affffffff0280969800000000001976a9146963907531db72d0ed1a0cfb471ccb63923446f388ac80d6e34c000000001976a914f0688ba1c0d1ce182c7af6741e02658c7d4dfcd388ac000000000100000002c40297f730dd7b5a99567eb8d27b78758f607507c52292d02d4031895b52f2ff010000008b483045022100f7edfd4b0aac404e5bab4fd3889e0c6c41aa8d0e6fa122316f68eddd0a65013902205b09cc8b2d56e1cd1f7f2fafd60a129ed94504c4ac7bdc67b56fe67512658b3e014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffffca5065ff9617cbcba45eb23726df6498a9b9cafed4f54cbab9d227b0035ddefb000000008a473044022068010362a13c7f9919fa832b2dee4e788f61f6f5d344a7c2a0da6ae740605658022006d1af525b9a14a35c003b78b72bd59738cd676f845d1ff3fc25049e01003614014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffff01001ec4110200000043410469ab4181eceb28985b9b4e895c13fa5e68d85761b7eee311db5addef76fa8621865134a221bd01f28ec9999ee3e021e60766e9d1f3458c115fb28650605f11c9ac000000000100000001cdaf2f758e91c514655e2dc50633d1e4c84989f8aa90a0dbc883f0d23ed5c2fa010000008b48304502207ab51be6f12a1962ba0aaaf24a20e0b69b27a94fac5adf45aa7d2d18ffd9236102210086ae728b370e5329eead9accd880d0cb070aea0c96255fae6c4f1ddcce1fd56e014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff02404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac002d3101000000001976a9141befba0cdc1ad56529371864d9f6cb042faa06b588ac000000000100000001b4a47603e71b61bc3326efd90111bf02d2f549b067f4c4a8fa183b57a0f800cb010000008a4730440220177c37f9a505c3f1a1f0ce2da777c339bd8339ffa02c7cb41f0a5804f473c9230220585b25a2ee80eb59292e52b987dad92acb0c64eced92ed9ee105ad153cdb12d001410443bd44f683467e549dae7d20d1d79cbdb6df985c6e9c029c8d0c6cb46cc1a4d3cf7923c5021b27f7a0b562ada113bc85d5fda5a1b41e87fe6e8802817cf69996ffffffff0280651406000000001976a9145505614859643ab7b547cd7f1f5e7e2a12322d3788ac00aa0271000000001976a914ea4720a7a52fc166c55ff2298e07baf70ae67e1b88ac00000000010000000586c62cd602d219bb60edb14a3e204de0705176f9022fe49a538054fb14abb49e010000008c493046022100f2bc2aba2534becbdf062eb993853a42bbbc282083d0daf9b4b585bd401aa8c9022100b1d7fd7ee0b95600db8535bbf331b19eed8d961f7a8e54159c53675d5f69df8c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff03ad0e58ccdac3df9dc28a218bcf6f1997b0a93306faaa4b3a28ae83447b2179010000008b483045022100be12b2937179da88599e27bb31c3525097a07cdb52422d165b3ca2f2020ffcf702200971b51f853a53d644ebae9ec8f3512e442b1bcb6c315a5b491d119d10624c83014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff2acfcab629bbc8685792603762c921580030ba144af553d271716a95089e107b010000008b483045022100fa579a840ac258871365dd48cd7552f96c8eea69bd00d84f05b283a0dab311e102207e3c0ee9234814cfbb1b659b83671618f45abc1326b9edcc77d552a4f2a805c0014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffdcdc6023bbc9944a658ddc588e61eacb737ddf0a3cd24f113b5a8634c517fcd2000000008b4830450221008d6df731df5d32267954bd7d2dda2302b74c6c2a6aa5c0ca64ecbabc1af03c75022010e55c571d65da7701ae2da1956c442df81bbf076cdbac25133f99d98a9ed34c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffe15557cd5ce258f479dfd6dc6514edf6d7ed5b21fcfa4a038fd69f06b83ac76e010000008b483045022023b3e0ab071eb11de2eb1cc3a67261b866f86bf6867d4558165f7c8c8aca2d86022100dc6e1f53a91de3efe8f63512850811f26284b62f850c70ca73ed5de8771fb451014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff01404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000010000000166d7577163c932b4f9690ca6a80b6e4eb001f0a2fa9023df5595602aae96ed8d000000008a4730440220262b42546302dfb654a229cefc86432b89628ff259dc87edd1154535b16a67e102207b4634c020a97c3e7bbd0d4d19da6aa2269ad9dded4026e896b213d73ca4b63f014104979b82d02226b3a4597523845754d44f13639e3bf2df5e82c6aab2bdc79687368b01b1ab8b19875ae3c90d661a3d0a33161dab29934edeb36aa01976be3baf8affffffff02404b4c00000000001976a9144854e695a02af0aeacb823ccbc272134561e0a1688ac40420f00000000001976a914abee93376d6b37b5c2940655a6fcaf1c8e74237988ac0000000001000000014e3f8ef2e91349a9059cb4f01e54ab2597c1387161d3da89919f7ea6acdbb371010000008c49304602210081f3183471a5ca22307c0800226f3ef9c353069e0773ac76bb580654d56aa523022100d4c56465bdc069060846f4fbf2f6b20520b2a80b08b168b31e66ddb9c694e240014104976c79848e18251612f8940875b2b08d06e6dc73b9840e8860c066b7e87432c477e9a59a453e71e6d76d5fe34058b800a098fc1740ce3012e8fc8a00c96af966ffffffff02c0e1e400000000001976a9144134e75a6fcb6042034aab5e18570cf1f844f54788ac404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000"_hex,
};
stream >> TX_WITH_WITNESS(block);
return block;
}
+
+std::ostream& operator<<(std::ostream& os, const arith_uint256& num)
+{
+ return os << num.ToString();
+}
+
+std::ostream& operator<<(std::ostream& os, const uint160& num)
+{
+ return os << num.ToString();
+}
+
+std::ostream& operator<<(std::ostream& os, const uint256& num)
+{
+ return os << num.ToString();
+}
diff --git a/src/test/util/setup_common.h b/src/test/util/setup_common.h
index dbd66e3585..f5a3c0dcee 100644
--- a/src/test/util/setup_common.h
+++ b/src/test/util/setup_common.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2015-2022 The Bitcoin Core developers
+// Copyright (c) 2015-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.
@@ -10,9 +10,12 @@
#include <key.h>
#include <node/caches.h>
#include <node/context.h> // IWYU pragma: export
+#include <optional>
+#include <ostream>
#include <primitives/transaction.h>
#include <pubkey.h>
#include <stdexcept>
+#include <test/util/random.h>
#include <util/chaintype.h> // IWYU pragma: export
#include <util/check.h>
#include <util/fs.h>
@@ -24,9 +27,12 @@
#include <type_traits>
#include <vector>
+class arith_uint256;
class CFeeRate;
class Chainstate;
class FastRandomContext;
+class uint160;
+class uint256;
/** This is connected to the logger. Can be used to redirect logs to any other log */
extern const std::function<void(const std::string&)> G_TEST_LOG_FUN;
@@ -37,17 +43,17 @@ extern const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUM
/** Retrieve the unit test name. */
extern const std::function<std::string()> G_TEST_GET_FULL_NAME;
-// Enable BOOST_CHECK_EQUAL for enum class types
-namespace std {
-template <typename T>
-std::ostream& operator<<(typename std::enable_if<std::is_enum<T>::value, std::ostream>::type& stream, const T& e)
-{
- return stream << static_cast<typename std::underlying_type<T>::type>(e);
-}
-} // namespace std
-
static constexpr CAmount CENT{1000000};
+struct TestOpts {
+ std::vector<const char*> extra_args{};
+ bool coins_db_in_memory{true};
+ bool block_tree_db_in_memory{true};
+ bool setup_net{true};
+ bool setup_validation_interface{true};
+ bool min_validation_cache{false}; // Equivalent of -maxsigcachebytes=0
+};
+
/** Basic testing setup.
* This just configures logging, data dir and chain parameters.
*/
@@ -55,7 +61,15 @@ struct BasicTestingSetup {
util::SignalInterrupt m_interrupt;
node::NodeContext m_node; // keep as first member to be destructed last
- explicit BasicTestingSetup(const ChainType chainType = ChainType::MAIN, const std::vector<const char*>& extra_args = {});
+ FastRandomContext m_rng;
+ /** Seed the global RNG state and m_rng for testing and log the seed value. This affects all randomness, except GetStrongRandBytes(). */
+ void SeedRandomForTest(SeedRand seed)
+ {
+ SeedRandomStateForTest(seed);
+ m_rng.Reseed(GetRandHash());
+ }
+
+ explicit BasicTestingSetup(const ChainType chainType = ChainType::MAIN, TestOpts = {});
~BasicTestingSetup();
fs::path m_path_root;
@@ -72,8 +86,9 @@ struct ChainTestingSetup : public BasicTestingSetup {
node::CacheSizes m_cache_sizes{};
bool m_coins_db_in_memory{true};
bool m_block_tree_db_in_memory{true};
+ std::function<void()> m_make_chainman{};
- explicit ChainTestingSetup(const ChainType chainType = ChainType::MAIN, const std::vector<const char*>& extra_args = {});
+ explicit ChainTestingSetup(const ChainType chainType = ChainType::MAIN, TestOpts = {});
~ChainTestingSetup();
// Supplies a chainstate, if one is needed
@@ -85,9 +100,7 @@ struct ChainTestingSetup : public BasicTestingSetup {
struct TestingSetup : public ChainTestingSetup {
explicit TestingSetup(
const ChainType chainType = ChainType::MAIN,
- const std::vector<const char*>& extra_args = {},
- const bool coins_db_in_memory = true,
- const bool block_tree_db_in_memory = true);
+ TestOpts = {});
};
/** Identical to TestingSetup, but chain set to regtest */
@@ -106,9 +119,7 @@ class CScript;
struct TestChain100Setup : public TestingSetup {
TestChain100Setup(
const ChainType chain_type = ChainType::REGTEST,
- const std::vector<const char*>& extra_args = {},
- const bool coins_db_in_memory = true,
- const bool block_tree_db_in_memory = true);
+ TestOpts = {});
/**
* Create a new block with just given transactions, coinbase paying to
@@ -220,22 +231,40 @@ struct TestChain100Setup : public TestingSetup {
* be used in "hot loops", for example fuzzing or benchmarking.
*/
template <class T = const BasicTestingSetup>
-std::unique_ptr<T> MakeNoLogFileContext(const ChainType chain_type = ChainType::REGTEST, const std::vector<const char*>& extra_args = {})
+std::unique_ptr<T> MakeNoLogFileContext(const ChainType chain_type = ChainType::REGTEST, TestOpts opts = {})
{
- const std::vector<const char*> arguments = Cat(
+ opts.extra_args = Cat(
{
"-nodebuglogfile",
"-nodebug",
},
- extra_args);
+ opts.extra_args);
- return std::make_unique<T>(chain_type, arguments);
+ return std::make_unique<T>(chain_type, opts);
}
CBlock getBlock13b8a();
-// define an implicit conversion here so that uint256 may be used directly in BOOST_CHECK_*
+// Make types usable in BOOST_CHECK_* @{
+namespace std {
+template <typename T> requires std::is_enum_v<T>
+inline std::ostream& operator<<(std::ostream& os, const T& e)
+{
+ return os << static_cast<std::underlying_type_t<T>>(e);
+}
+
+template <typename T>
+inline std::ostream& operator<<(std::ostream& os, const std::optional<T>& v)
+{
+ return v ? os << *v
+ : os << "std::nullopt";
+}
+} // namespace std
+
+std::ostream& operator<<(std::ostream& os, const arith_uint256& num);
+std::ostream& operator<<(std::ostream& os, const uint160& num);
std::ostream& operator<<(std::ostream& os, const uint256& num);
+// @}
/**
* BOOST_CHECK_EXCEPTION predicates to check the specific validation error.
@@ -245,11 +274,9 @@ std::ostream& operator<<(std::ostream& os, const uint256& num);
class HasReason
{
public:
- explicit HasReason(const std::string& reason) : m_reason(reason) {}
- bool operator()(const std::exception& e) const
- {
- return std::string(e.what()).find(m_reason) != std::string::npos;
- };
+ explicit HasReason(std::string_view reason) : m_reason(reason) {}
+ bool operator()(std::string_view s) const { return s.find(m_reason) != std::string_view::npos; }
+ bool operator()(const std::exception& e) const { return (*this)(e.what()); }
private:
const std::string m_reason;
diff --git a/src/test/util/transaction_utils.cpp b/src/test/util/transaction_utils.cpp
index 300caa577c..a588e61944 100644
--- a/src/test/util/transaction_utils.cpp
+++ b/src/test/util/transaction_utils.cpp
@@ -3,6 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <coins.h>
+#include <consensus/validation.h>
#include <script/signingprovider.h>
#include <test/util/transaction_utils.h>
@@ -69,3 +70,44 @@ std::vector<CMutableTransaction> SetupDummyInputs(FillableSigningProvider& keyst
return dummyTransactions;
}
+
+void BulkTransaction(CMutableTransaction& tx, int32_t target_weight)
+{
+ tx.vout.emplace_back(0, CScript() << OP_RETURN);
+ auto unpadded_weight{GetTransactionWeight(CTransaction(tx))};
+ assert(target_weight >= unpadded_weight);
+
+ // determine number of needed padding bytes by converting weight difference to vbytes
+ auto dummy_vbytes = (target_weight - unpadded_weight + (WITNESS_SCALE_FACTOR - 1)) / WITNESS_SCALE_FACTOR;
+ // compensate for the increase of the compact-size encoded script length
+ // (note that the length encoding of the unpadded output script needs one byte)
+ dummy_vbytes -= GetSizeOfCompactSize(dummy_vbytes) - 1;
+
+ // pad transaction by repeatedly appending a dummy opcode to the output script
+ tx.vout[0].scriptPubKey.insert(tx.vout[0].scriptPubKey.end(), dummy_vbytes, OP_1);
+
+ // actual weight should be at most 3 higher than target weight
+ assert(GetTransactionWeight(CTransaction(tx)) >= target_weight);
+ assert(GetTransactionWeight(CTransaction(tx)) <= target_weight + 3);
+}
+
+bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType, SignatureData& sig_data)
+{
+ assert(nIn < txTo.vin.size());
+
+ MutableTransactionSignatureCreator creator(txTo, nIn, amount, nHashType);
+
+ bool ret = ProduceSignature(provider, creator, fromPubKey, sig_data);
+ UpdateInput(txTo.vin.at(nIn), sig_data);
+ return ret;
+}
+
+bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType, SignatureData& sig_data)
+{
+ assert(nIn < txTo.vin.size());
+ const CTxIn& txin = txTo.vin[nIn];
+ assert(txin.prevout.n < txFrom.vout.size());
+ const CTxOut& txout = txFrom.vout[txin.prevout.n];
+
+ return SignSignature(provider, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType, sig_data);
+}
diff --git a/src/test/util/transaction_utils.h b/src/test/util/transaction_utils.h
index 6f2faeec6c..4a18ab6ab4 100644
--- a/src/test/util/transaction_utils.h
+++ b/src/test/util/transaction_utils.h
@@ -6,6 +6,7 @@
#define BITCOIN_TEST_UTIL_TRANSACTION_UTILS_H
#include <primitives/transaction.h>
+#include <script/sign.h>
#include <array>
@@ -26,4 +27,27 @@ CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CSc
// the second nValues[2] and nValues[3] outputs paid to a TxoutType::PUBKEYHASH.
std::vector<CMutableTransaction> SetupDummyInputs(FillableSigningProvider& keystoreRet, CCoinsViewCache& coinsRet, const std::array<CAmount,4>& nValues);
+// bulk transaction to reach a certain target weight,
+// by appending a single output with padded output script
+void BulkTransaction(CMutableTransaction& tx, int32_t target_weight);
+
+/**
+ * Produce a satisfying script (scriptSig or witness).
+ *
+ * @param provider Utility containing the information necessary to solve a script.
+ * @param fromPubKey The script to produce a satisfaction for.
+ * @param txTo The spending transaction.
+ * @param nIn The index of the input in `txTo` referring the output being spent.
+ * @param amount The value of the output being spent.
+ * @param nHashType Signature hash type.
+ * @param sig_data Additional data provided to solve a script. Filled with the resulting satisfying
+ * script and whether the satisfaction is complete.
+ *
+ * @return True if the produced script is entirely satisfying `fromPubKey`.
+ **/
+bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo,
+ unsigned int nIn, const CAmount& amount, int nHashType, SignatureData& sig_data);
+bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo,
+ unsigned int nIn, int nHashType, SignatureData& sig_data);
+
#endif // BITCOIN_TEST_UTIL_TRANSACTION_UTILS_H
diff --git a/src/test/util/txmempool.cpp b/src/test/util/txmempool.cpp
index 94d50bba50..9d6b4810d0 100644
--- a/src/test/util/txmempool.cpp
+++ b/src/test/util/txmempool.cpp
@@ -8,7 +8,7 @@
#include <node/context.h>
#include <node/mempool_args.h>
#include <policy/rbf.h>
-#include <policy/v3_policy.h>
+#include <policy/truc_policy.h>
#include <txmempool.h>
#include <util/check.h>
#include <util/time.h>
@@ -141,30 +141,30 @@ std::optional<std::string> CheckPackageMempoolAcceptResult(const Package& txns,
return std::nullopt;
}
-void CheckMempoolV3Invariants(const CTxMemPool& tx_pool)
+void CheckMempoolTRUCInvariants(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->version == TRUC_VERSION) {
// Check that special maximum virtual size is respected
- Assert(entry.GetTxSize() <= V3_MAX_VSIZE);
+ Assert(entry.GetTxSize() <= TRUC_MAX_VSIZE);
- // Check that special v3 ancestor/descendant limits and rules are always respected
- Assert(entry.GetCountWithDescendants() <= V3_DESCENDANT_LIMIT);
- Assert(entry.GetCountWithAncestors() <= V3_ANCESTOR_LIMIT);
- Assert(entry.GetSizeWithDescendants() <= V3_MAX_VSIZE + V3_CHILD_MAX_VSIZE);
- Assert(entry.GetSizeWithAncestors() <= V3_MAX_VSIZE + V3_CHILD_MAX_VSIZE);
+ // Check that special TRUC ancestor/descendant limits and rules are always respected
+ Assert(entry.GetCountWithDescendants() <= TRUC_DESCENDANT_LIMIT);
+ Assert(entry.GetCountWithAncestors() <= TRUC_ANCESTOR_LIMIT);
+ Assert(entry.GetSizeWithDescendants() <= TRUC_MAX_VSIZE + TRUC_CHILD_MAX_VSIZE);
+ Assert(entry.GetSizeWithAncestors() <= TRUC_MAX_VSIZE + TRUC_CHILD_MAX_VSIZE);
// 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.
+ Assert(entry.GetTxSize() <= TRUC_CHILD_MAX_VSIZE);
+ // All TRUC transactions must only have TRUC unconfirmed parents.
const auto& parents = entry.GetMemPoolParentsConst();
Assert(parents.begin()->get().GetSharedTx()->version == TRUC_VERSION);
}
} else if (entry.GetCountWithAncestors() > 1) {
- // All non-v3 transactions must only have non-v3 unconfirmed parents.
+ // All non-TRUC transactions must only have non-TRUC unconfirmed parents.
for (const auto& parent : entry.GetMemPoolParentsConst()) {
Assert(parent.get().GetSharedTx()->version != TRUC_VERSION);
}
diff --git a/src/test/util/txmempool.h b/src/test/util/txmempool.h
index b3022af7df..6d41fdf87f 100644
--- a/src/test/util/txmempool.h
+++ b/src/test/util/txmempool.h
@@ -47,13 +47,13 @@ std::optional<std::string> CheckPackageMempoolAcceptResult(const Package& txns,
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
+/** For every transaction in tx_pool, check TRUC invariants:
+ * - a TRUC tx's ancestor count must be within TRUC_ANCESTOR_LIMIT
+ * - a TRUC tx's descendant count must be within TRUC_DESCENDANT_LIMIT
+ * - if a TRUC tx has ancestors, its sigop-adjusted vsize must be within TRUC_CHILD_MAX_VSIZE
+ * - any non-TRUC tx must only have non-TRUC parents
+ * - any TRUC tx must only have TRUC parents
* */
-void CheckMempoolV3Invariants(const CTxMemPool& tx_pool);
+void CheckMempoolTRUCInvariants(const CTxMemPool& tx_pool);
#endif // BITCOIN_TEST_UTIL_TXMEMPOOL_H
diff --git a/src/test/util/xoroshiro128plusplus.h b/src/test/util/xoroshiro128plusplus.h
deleted file mode 100644
index ac9f59b3f5..0000000000
--- a/src/test/util/xoroshiro128plusplus.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// 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_TEST_UTIL_XOROSHIRO128PLUSPLUS_H
-#define BITCOIN_TEST_UTIL_XOROSHIRO128PLUSPLUS_H
-
-#include <cstdint>
-#include <limits>
-
-/** xoroshiro128++ PRNG. Extremely fast, not appropriate for cryptographic purposes.
- *
- * Memory footprint is 128bit, period is 2^128 - 1.
- * This class is not thread-safe.
- *
- * Reference implementation available at https://prng.di.unimi.it/xoroshiro128plusplus.c
- * See https://prng.di.unimi.it/
- */
-class XoRoShiRo128PlusPlus
-{
- uint64_t m_s0;
- uint64_t m_s1;
-
- [[nodiscard]] constexpr static uint64_t rotl(uint64_t x, int n)
- {
- return (x << n) | (x >> (64 - n));
- }
-
- [[nodiscard]] constexpr static uint64_t SplitMix64(uint64_t& seedval) noexcept
- {
- uint64_t z = (seedval += UINT64_C(0x9e3779b97f4a7c15));
- z = (z ^ (z >> 30U)) * UINT64_C(0xbf58476d1ce4e5b9);
- z = (z ^ (z >> 27U)) * UINT64_C(0x94d049bb133111eb);
- return z ^ (z >> 31U);
- }
-
-public:
- using result_type = uint64_t;
-
- constexpr explicit XoRoShiRo128PlusPlus(uint64_t seedval) noexcept
- : m_s0(SplitMix64(seedval)), m_s1(SplitMix64(seedval))
- {
- }
-
- // no copy - that is dangerous, we don't want accidentally copy the RNG and then have two streams
- // with exactly the same results. If you need a copy, call copy().
- XoRoShiRo128PlusPlus(const XoRoShiRo128PlusPlus&) = delete;
- XoRoShiRo128PlusPlus& operator=(const XoRoShiRo128PlusPlus&) = delete;
-
- // allow moves
- XoRoShiRo128PlusPlus(XoRoShiRo128PlusPlus&&) = default;
- XoRoShiRo128PlusPlus& operator=(XoRoShiRo128PlusPlus&&) = default;
-
- ~XoRoShiRo128PlusPlus() = default;
-
- constexpr result_type operator()() noexcept
- {
- uint64_t s0 = m_s0, s1 = m_s1;
- const uint64_t result = rotl(s0 + s1, 17) + s0;
- s1 ^= s0;
- m_s0 = rotl(s0, 49) ^ s1 ^ (s1 << 21);
- m_s1 = rotl(s1, 28);
- return result;
- }
-
- static constexpr result_type min() noexcept { return std::numeric_limits<result_type>::min(); }
- static constexpr result_type max() noexcept { return std::numeric_limits<result_type>::max(); }
- static constexpr double entropy() noexcept { return 0.0; }
-};
-
-#endif // BITCOIN_TEST_UTIL_XOROSHIRO128PLUSPLUS_H
diff --git a/src/test/util_string_tests.cpp b/src/test/util_string_tests.cpp
new file mode 100644
index 0000000000..1574fe2358
--- /dev/null
+++ b/src/test/util_string_tests.cpp
@@ -0,0 +1,85 @@
+// 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.
+
+#include <util/string.h>
+
+#include <boost/test/unit_test.hpp>
+#include <test/util/setup_common.h>
+
+using namespace util;
+
+BOOST_AUTO_TEST_SUITE(util_string_tests)
+
+// Helper to allow compile-time sanity checks while providing the number of
+// args directly. Normally PassFmt<sizeof...(Args)> would be used.
+template <unsigned NumArgs>
+inline void PassFmt(util::ConstevalFormatString<NumArgs> fmt)
+{
+ // This was already executed at compile-time, but is executed again at run-time to avoid -Wunused.
+ decltype(fmt)::Detail_CheckNumFormatSpecifiers(fmt.fmt);
+}
+template <unsigned WrongNumArgs>
+inline void FailFmtWithError(std::string_view wrong_fmt, std::string_view error)
+{
+ BOOST_CHECK_EXCEPTION(util::ConstevalFormatString<WrongNumArgs>::Detail_CheckNumFormatSpecifiers(wrong_fmt), const char*, HasReason(error));
+}
+
+BOOST_AUTO_TEST_CASE(ConstevalFormatString_NumSpec)
+{
+ PassFmt<0>("");
+ PassFmt<0>("%%");
+ PassFmt<1>("%s");
+ PassFmt<0>("%%s");
+ PassFmt<0>("s%%");
+ PassFmt<1>("%%%s");
+ PassFmt<1>("%s%%");
+ PassFmt<0>(" 1$s");
+ PassFmt<1>("%1$s");
+ PassFmt<1>("%1$s%1$s");
+ PassFmt<2>("%2$s");
+ PassFmt<2>("%2$s 4$s %2$s");
+ PassFmt<129>("%129$s 999$s %2$s");
+ PassFmt<1>("%02d");
+ PassFmt<1>("%+2s");
+ PassFmt<1>("%.6i");
+ PassFmt<1>("%5.2f");
+ PassFmt<1>("%#x");
+ PassFmt<1>("%1$5i");
+ PassFmt<1>("%1$-5i");
+ PassFmt<1>("%1$.5i");
+ // tinyformat accepts almost any "type" spec, even '%', or '_', or '\n'.
+ PassFmt<1>("%123%");
+ PassFmt<1>("%123%s");
+ PassFmt<1>("%_");
+ PassFmt<1>("%\n");
+
+ // The `*` specifier behavior is unsupported and can lead to runtime
+ // errors when used in a ConstevalFormatString. Please refer to the
+ // note in the ConstevalFormatString docs.
+ PassFmt<1>("%*c");
+ PassFmt<2>("%2$*3$d");
+ PassFmt<1>("%.*f");
+
+ auto err_mix{"Format specifiers must be all positional or all non-positional!"};
+ FailFmtWithError<1>("%s%1$s", err_mix);
+
+ auto err_num{"Format specifier count must match the argument count!"};
+ FailFmtWithError<1>("", err_num);
+ FailFmtWithError<0>("%s", err_num);
+ FailFmtWithError<2>("%s", err_num);
+ FailFmtWithError<0>("%1$s", err_num);
+ FailFmtWithError<2>("%1$s", err_num);
+
+ auto err_0_pos{"Positional format specifier must have position of at least 1"};
+ FailFmtWithError<1>("%$s", err_0_pos);
+ FailFmtWithError<1>("%$", err_0_pos);
+ FailFmtWithError<0>("%0$", err_0_pos);
+ FailFmtWithError<0>("%0$s", err_0_pos);
+
+ auto err_term{"Format specifier incorrectly terminated by end of string"};
+ FailFmtWithError<1>("%", err_term);
+ FailFmtWithError<1>("%1$", err_term);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp
index a371753adf..1624fb8b5b 100644
--- a/src/test/util_tests.cpp
+++ b/src/test/util_tests.cpp
@@ -7,6 +7,7 @@
#include <hash.h> // For Hash()
#include <key.h> // For CKey
#include <script/parsing.h>
+#include <span.h>
#include <sync.h>
#include <test/util/random.h>
#include <test/util/setup_common.h>
@@ -45,6 +46,8 @@
#include <boost/test/unit_test.hpp>
using namespace std::literals;
+using namespace util::hex_literals;
+using util::ConstevalHexDigit;
using util::Join;
using util::RemovePrefix;
using util::RemovePrefixView;
@@ -58,7 +61,7 @@ static const std::string STRING_WITH_EMBEDDED_NULL_CHAR{"1"s "\0" "1"s};
/* defined in logging.cpp */
namespace BCLog {
- std::string LogEscapeMessage(const std::string& str);
+ std::string LogEscapeMessage(std::string_view str);
}
BOOST_FIXTURE_TEST_SUITE(util_tests, BasicTestingSetup)
@@ -136,46 +139,69 @@ BOOST_AUTO_TEST_CASE(util_criticalsection)
} while(0);
}
-static const unsigned char ParseHex_expected[65] = {
+constexpr char HEX_PARSE_INPUT[] = "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f";
+constexpr uint8_t HEX_PARSE_OUTPUT[] = {
0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
0x5f
};
+static_assert((sizeof(HEX_PARSE_INPUT) - 1) == 2 * sizeof(HEX_PARSE_OUTPUT));
BOOST_AUTO_TEST_CASE(parse_hex)
{
std::vector<unsigned char> result;
- std::vector<unsigned char> expected(ParseHex_expected, ParseHex_expected + sizeof(ParseHex_expected));
+
// Basic test vector
- result = ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
+ std::vector<unsigned char> expected(std::begin(HEX_PARSE_OUTPUT), std::end(HEX_PARSE_OUTPUT));
+ constexpr std::array<std::byte, 65> hex_literal_array{operator""_hex<util::detail::Hex(HEX_PARSE_INPUT)>()};
+ auto hex_literal_span{MakeUCharSpan(hex_literal_array)};
+ BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
+
+ const std::vector<std::byte> hex_literal_vector{operator""_hex_v<util::detail::Hex(HEX_PARSE_INPUT)>()};
+ hex_literal_span = MakeUCharSpan(hex_literal_vector);
+ BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
+
+ constexpr std::array<uint8_t, 65> hex_literal_array_uint8{operator""_hex_u8<util::detail::Hex(HEX_PARSE_INPUT)>()};
+ BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_array_uint8.begin(), hex_literal_array_uint8.end(), expected.begin(), expected.end());
+
+ result = operator""_hex_v_u8<util::detail::Hex(HEX_PARSE_INPUT)>();
BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
- result = TryParseHex<uint8_t>("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f").value();
+
+ result = ParseHex(HEX_PARSE_INPUT);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
+
+ result = TryParseHex<uint8_t>(HEX_PARSE_INPUT).value();
BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
// Spaces between bytes must be supported
+ expected = {0x12, 0x34, 0x56, 0x78};
result = ParseHex("12 34 56 78");
- BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
result = TryParseHex<uint8_t>("12 34 56 78").value();
- BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
// Leading space must be supported (used in BerkeleyEnvironment::Salvage)
+ expected = {0x89, 0x34, 0x56, 0x78};
result = ParseHex(" 89 34 56 78");
- BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
result = TryParseHex<uint8_t>(" 89 34 56 78").value();
- BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
// Mixed case and spaces are supported
+ expected = {0xff, 0xaa};
result = ParseHex(" Ff aA ");
- BOOST_CHECK(result.size() == 2 && result[0] == 0xff && result[1] == 0xaa);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
result = TryParseHex<uint8_t>(" Ff aA ").value();
- BOOST_CHECK(result.size() == 2 && result[0] == 0xff && result[1] == 0xaa);
+ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
// Empty string is supported
- result = ParseHex("");
- BOOST_CHECK(result.size() == 0);
- result = TryParseHex<uint8_t>("").value();
- BOOST_CHECK(result.size() == 0);
+ static_assert(""_hex.empty());
+ static_assert(""_hex_u8.empty());
+ BOOST_CHECK_EQUAL(""_hex_v.size(), 0);
+ BOOST_CHECK_EQUAL(""_hex_v_u8.size(), 0);
+ BOOST_CHECK_EQUAL(ParseHex("").size(), 0);
+ BOOST_CHECK_EQUAL(TryParseHex<uint8_t>("").value().size(), 0);
// Spaces between nibbles is treated as invalid
BOOST_CHECK_EQUAL(ParseHex("AAF F").size(), 0);
@@ -198,25 +224,25 @@ BOOST_AUTO_TEST_CASE(parse_hex)
BOOST_CHECK(!TryParseHex("12 3").has_value());
}
-BOOST_AUTO_TEST_CASE(util_HexStr)
+BOOST_AUTO_TEST_CASE(consteval_hex_digit)
{
- BOOST_CHECK_EQUAL(
- HexStr(ParseHex_expected),
- "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
-
- BOOST_CHECK_EQUAL(
- HexStr(Span{ParseHex_expected}.last(0)),
- "");
+ BOOST_CHECK_EQUAL(ConstevalHexDigit('0'), 0);
+ BOOST_CHECK_EQUAL(ConstevalHexDigit('9'), 9);
+ BOOST_CHECK_EQUAL(ConstevalHexDigit('a'), 0xa);
+ BOOST_CHECK_EQUAL(ConstevalHexDigit('f'), 0xf);
+}
- BOOST_CHECK_EQUAL(
- HexStr(Span{ParseHex_expected}.first(0)),
- "");
+BOOST_AUTO_TEST_CASE(util_HexStr)
+{
+ BOOST_CHECK_EQUAL(HexStr(HEX_PARSE_OUTPUT), HEX_PARSE_INPUT);
+ BOOST_CHECK_EQUAL(HexStr(Span{HEX_PARSE_OUTPUT}.last(0)), "");
+ BOOST_CHECK_EQUAL(HexStr(Span{HEX_PARSE_OUTPUT}.first(0)), "");
{
- const std::vector<char> in_s{ParseHex_expected, ParseHex_expected + 5};
+ constexpr std::string_view out_exp{"04678afdb0"};
+ constexpr std::span in_s{HEX_PARSE_OUTPUT, out_exp.size() / 2};
const Span<const uint8_t> in_u{MakeUCharSpan(in_s)};
const Span<const std::byte> in_b{MakeByteSpan(in_s)};
- const std::string out_exp{"04678afdb0"};
BOOST_CHECK_EQUAL(HexStr(in_u), out_exp);
BOOST_CHECK_EQUAL(HexStr(in_s), out_exp);
@@ -432,34 +458,9 @@ BOOST_AUTO_TEST_CASE(util_IsHex)
BOOST_CHECK(!IsHex("0x0000"));
}
-BOOST_AUTO_TEST_CASE(util_IsHexNumber)
-{
- BOOST_CHECK(IsHexNumber("0x0"));
- BOOST_CHECK(IsHexNumber("0"));
- BOOST_CHECK(IsHexNumber("0x10"));
- BOOST_CHECK(IsHexNumber("10"));
- BOOST_CHECK(IsHexNumber("0xff"));
- BOOST_CHECK(IsHexNumber("ff"));
- BOOST_CHECK(IsHexNumber("0xFfa"));
- BOOST_CHECK(IsHexNumber("Ffa"));
- BOOST_CHECK(IsHexNumber("0x00112233445566778899aabbccddeeffAABBCCDDEEFF"));
- BOOST_CHECK(IsHexNumber("00112233445566778899aabbccddeeffAABBCCDDEEFF"));
-
- BOOST_CHECK(!IsHexNumber("")); // empty string not allowed
- BOOST_CHECK(!IsHexNumber("0x")); // empty string after prefix not allowed
- BOOST_CHECK(!IsHexNumber("0x0 ")); // no spaces at end,
- BOOST_CHECK(!IsHexNumber(" 0x0")); // or beginning,
- BOOST_CHECK(!IsHexNumber("0x 0")); // or middle,
- BOOST_CHECK(!IsHexNumber(" ")); // etc.
- BOOST_CHECK(!IsHexNumber("0x0ga")); // invalid character
- BOOST_CHECK(!IsHexNumber("x0")); // broken prefix
- BOOST_CHECK(!IsHexNumber("0x0x00")); // two prefixes not allowed
-
-}
-
BOOST_AUTO_TEST_CASE(util_seed_insecure_rand)
{
- SeedInsecureRand(SeedRand::ZEROS);
+ SeedRandomForTest(SeedRand::ZEROS);
for (int mod=2;mod<11;mod++)
{
int mask = 1;
@@ -473,7 +474,7 @@ BOOST_AUTO_TEST_CASE(util_seed_insecure_rand)
for (int i = 0; i < 10000; i++) {
uint32_t rval;
do{
- rval=InsecureRand32()&mask;
+ rval=m_rng.rand32()&mask;
}while(rval>=(uint32_t)mod);
count += rval==0;
}
@@ -1508,8 +1509,10 @@ struct Tracker
Tracker(Tracker&& t) noexcept : origin(t.origin), copies(t.copies) {}
Tracker& operator=(const Tracker& t) noexcept
{
- origin = t.origin;
- copies = t.copies + 1;
+ if (this != &t) {
+ origin = t.origin;
+ copies = t.copies + 1;
+ }
return *this;
}
};
diff --git a/src/test/validation_block_tests.cpp b/src/test/validation_block_tests.cpp
index 588ac60498..f5c4204c55 100644
--- a/src/test/validation_block_tests.cpp
+++ b/src/test/validation_block_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2018-2022 The Bitcoin Core developers
+// Copyright (c) 2018-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.
@@ -101,7 +101,7 @@ std::shared_ptr<CBlock> MinerTestingSetup::FinalizeBlock(std::shared_ptr<CBlock>
// submit block header, so that miner can get the block height from the
// global state and the node has the topology of the chain
BlockValidationState ignored;
- BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlockHeaders({pblock->GetBlockHeader()}, true, ignored));
+ BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlockHeaders({{pblock->GetBlockHeader()}}, true, ignored));
return pblock;
}
@@ -133,8 +133,8 @@ void MinerTestingSetup::BuildChain(const uint256& root, int height, const unsign
{
if (height <= 0 || blocks.size() >= max_size) return;
- bool gen_invalid = InsecureRandRange(100) < invalid_rate;
- bool gen_fork = InsecureRandRange(100) < branch_rate;
+ bool gen_invalid = m_rng.randrange(100U) < invalid_rate;
+ bool gen_fork = m_rng.randrange(100U) < branch_rate;
const std::shared_ptr<const CBlock> pblock = gen_invalid ? BadBlock(root) : GoodBlock(root);
blocks.push_back(pblock);
diff --git a/src/test/validation_chainstate_tests.cpp b/src/test/validation_chainstate_tests.cpp
index 1c02066047..702af6578d 100644
--- a/src/test/validation_chainstate_tests.cpp
+++ b/src/test/validation_chainstate_tests.cpp
@@ -4,6 +4,7 @@
//
#include <chainparams.h>
#include <consensus/validation.h>
+#include <node/kernel_notifications.h>
#include <random.h>
#include <rpc/blockchain.h>
#include <sync.h>
@@ -36,11 +37,11 @@ BOOST_AUTO_TEST_CASE(validation_chainstate_resize_caches)
// Add a coin to the in-memory cache, upsize once, then downsize.
{
LOCK(::cs_main);
- const auto outpoint = AddTestCoin(c1.CoinsTip());
+ const auto outpoint = AddTestCoin(m_rng, c1.CoinsTip());
// Set a meaningless bestblock value in the coinsview cache - otherwise we won't
// flush during ResizecoinsCaches() and will subsequently hit an assertion.
- c1.CoinsTip().SetBestBlock(InsecureRand256());
+ c1.CoinsTip().SetBestBlock(m_rng.rand256());
BOOST_CHECK(c1.CoinsTip().HaveCoinInCache(outpoint));
@@ -69,14 +70,14 @@ BOOST_AUTO_TEST_CASE(validation_chainstate_resize_caches)
BOOST_FIXTURE_TEST_CASE(chainstate_update_tip, TestChain100Setup)
{
ChainstateManager& chainman = *Assert(m_node.chainman);
- uint256 curr_tip = ::g_best_block;
+ uint256 curr_tip = m_node.notifications->m_tip_block;
// Mine 10 more blocks, putting at us height 110 where a valid assumeutxo value can
// be found.
mineBlocks(10);
// After adding some blocks to the tip, best block should have changed.
- BOOST_CHECK(::g_best_block != curr_tip);
+ BOOST_CHECK(m_node.notifications->m_tip_block != curr_tip);
// Grab block 1 from disk; we'll add it to the background chain later.
std::shared_ptr<CBlock> pblockone = std::make_shared<CBlock>();
@@ -91,15 +92,15 @@ BOOST_FIXTURE_TEST_CASE(chainstate_update_tip, TestChain100Setup)
// Ensure our active chain is the snapshot chainstate.
BOOST_CHECK(WITH_LOCK(::cs_main, return chainman.IsSnapshotActive()));
- curr_tip = ::g_best_block;
+ curr_tip = m_node.notifications->m_tip_block;
// Mine a new block on top of the activated snapshot chainstate.
mineBlocks(1); // Defined in TestChain100Setup.
// After adding some blocks to the snapshot tip, best block should have changed.
- BOOST_CHECK(::g_best_block != curr_tip);
+ BOOST_CHECK(m_node.notifications->m_tip_block != curr_tip);
- curr_tip = ::g_best_block;
+ curr_tip = m_node.notifications->m_tip_block;
BOOST_CHECK_EQUAL(chainman.GetAll().size(), 2);
@@ -138,7 +139,7 @@ BOOST_FIXTURE_TEST_CASE(chainstate_update_tip, TestChain100Setup)
// g_best_block should be unchanged after adding a block to the background
// validation chain.
BOOST_CHECK(block_added);
- BOOST_CHECK_EQUAL(curr_tip, ::g_best_block);
+ BOOST_CHECK_EQUAL(curr_tip, m_node.notifications->m_tip_block);
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/validation_chainstatemanager_tests.cpp b/src/test/validation_chainstatemanager_tests.cpp
index 1641c4cd22..b4fcfbd853 100644
--- a/src/test/validation_chainstatemanager_tests.cpp
+++ b/src/test/validation_chainstatemanager_tests.cpp
@@ -5,6 +5,7 @@
#include <chainparams.h>
#include <consensus/validation.h>
#include <kernel/disconnected_transactions.h>
+#include <node/chainstatemanager_args.h>
#include <node/kernel_notifications.h>
#include <node/utxo_snapshot.h>
#include <random.h>
@@ -16,6 +17,8 @@
#include <test/util/setup_common.h>
#include <test/util/validation.h>
#include <uint256.h>
+#include <util/result.h>
+#include <util/vector.h>
#include <validation.h>
#include <validationinterface.h>
@@ -152,10 +155,10 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_rebalance_caches, TestChain100Setup)
manager.MaybeRebalanceCaches();
}
- BOOST_CHECK_CLOSE(c1.m_coinstip_cache_size_bytes, max_cache * 0.05, 1);
- BOOST_CHECK_CLOSE(c1.m_coinsdb_cache_size_bytes, max_cache * 0.05, 1);
- BOOST_CHECK_CLOSE(c2.m_coinstip_cache_size_bytes, max_cache * 0.95, 1);
- BOOST_CHECK_CLOSE(c2.m_coinsdb_cache_size_bytes, max_cache * 0.95, 1);
+ BOOST_CHECK_CLOSE(double(c1.m_coinstip_cache_size_bytes), max_cache * 0.05, 1);
+ BOOST_CHECK_CLOSE(double(c1.m_coinsdb_cache_size_bytes), max_cache * 0.05, 1);
+ BOOST_CHECK_CLOSE(double(c2.m_coinstip_cache_size_bytes), max_cache * 0.95, 1);
+ BOOST_CHECK_CLOSE(double(c2.m_coinsdb_cache_size_bytes), max_cache * 0.95, 1);
}
struct SnapshotTestSetup : TestChain100Setup {
@@ -167,9 +170,10 @@ struct SnapshotTestSetup : TestChain100Setup {
// destructive filesystem operations.
SnapshotTestSetup() : TestChain100Setup{
{},
- {},
- /*coins_db_in_memory=*/false,
- /*block_tree_db_in_memory=*/false,
+ {
+ .coins_db_in_memory = false,
+ .block_tree_db_in_memory = false,
+ },
}
{
}
@@ -284,7 +288,7 @@ struct SnapshotTestSetup : TestChain100Setup {
const auto& au_data = ::Params().AssumeutxoForHeight(snapshot_height);
const CBlockIndex* tip = WITH_LOCK(chainman.GetMutex(), return chainman.ActiveTip());
- BOOST_CHECK_EQUAL(tip->nChainTx, au_data->nChainTx);
+ BOOST_CHECK_EQUAL(tip->m_chain_tx_count, au_data->m_chain_tx_count);
// To be checked against later when we try loading a subsequent snapshot.
uint256 loaded_snapshot_blockhash{*chainman.SnapshotBlockhash()};
@@ -464,7 +468,7 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_loadblockindex, TestChain100Setup)
if (i < last_assumed_valid_idx && i >= assumed_valid_start_idx) {
index->nStatus = BlockStatus::BLOCK_VALID_TREE;
index->nTx = 0;
- index->nChainTx = 0;
+ index->m_chain_tx_count = 0;
}
++num_indexes;
@@ -714,10 +718,10 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_snapshot_completion_hash_mismatch, Sna
CCoinsViewCache& ibd_coins = WITH_LOCK(::cs_main,
return validation_chainstate.CoinsTip());
Coin badcoin;
- badcoin.out.nValue = InsecureRand32();
+ badcoin.out.nValue = m_rng.rand32();
badcoin.nHeight = 1;
- badcoin.out.scriptPubKey.assign(InsecureRandBits(6), 0);
- Txid txid = Txid::FromUint256(InsecureRand256());
+ badcoin.out.scriptPubKey.assign(m_rng.randbits(6), 0);
+ Txid txid = Txid::FromUint256(m_rng.rand256());
ibd_coins.AddCoin(COutPoint(txid, 0), std::move(badcoin), false);
fs::path snapshot_chainstate_dir = gArgs.GetDataDirNet() / "chainstate_snapshot";
@@ -768,4 +772,63 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_snapshot_completion_hash_mismatch, Sna
}
}
+/** Helper function to parse args into args_man and return the result of applying them to opts */
+template <typename Options>
+util::Result<Options> SetOptsFromArgs(ArgsManager& args_man, Options opts,
+ const std::vector<const char*>& args)
+{
+ const auto argv{Cat({"ignore"}, args)};
+ std::string error{};
+ if (!args_man.ParseParameters(argv.size(), argv.data(), error)) {
+ return util::Error{Untranslated("ParseParameters failed with error: " + error)};
+ }
+ const auto result{node::ApplyArgsManOptions(args_man, opts)};
+ if (!result) return util::Error{util::ErrorString(result)};
+ return opts;
+}
+
+BOOST_FIXTURE_TEST_CASE(chainstatemanager_args, BasicTestingSetup)
+{
+ //! Try to apply the provided args to a ChainstateManager::Options
+ auto get_opts = [&](const std::vector<const char*>& args) {
+ static kernel::Notifications notifications{};
+ static const ChainstateManager::Options options{
+ .chainparams = ::Params(),
+ .datadir = {},
+ .notifications = notifications};
+ return SetOptsFromArgs(*this->m_node.args, options, args);
+ };
+ //! Like get_opts, but requires the provided args to be valid and unwraps the result
+ auto get_valid_opts = [&](const std::vector<const char*>& args) {
+ const auto result{get_opts(args)};
+ BOOST_REQUIRE_MESSAGE(result, util::ErrorString(result).original);
+ return *result;
+ };
+
+ // test -assumevalid
+ BOOST_CHECK(!get_valid_opts({}).assumed_valid_block);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-assumevalid="}).assumed_valid_block, uint256::ZERO);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-assumevalid=0"}).assumed_valid_block, uint256::ZERO);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-noassumevalid"}).assumed_valid_block, uint256::ZERO);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-assumevalid=0x12"}).assumed_valid_block, uint256{0x12});
+
+ std::string assume_valid{"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"};
+ BOOST_CHECK_EQUAL(get_valid_opts({("-assumevalid=" + assume_valid).c_str()}).assumed_valid_block, uint256::FromHex(assume_valid));
+
+ BOOST_CHECK(!get_opts({"-assumevalid=xyz"})); // invalid hex characters
+ BOOST_CHECK(!get_opts({"-assumevalid=01234567890123456789012345678901234567890123456789012345678901234"})); // > 64 hex chars
+
+ // test -minimumchainwork
+ BOOST_CHECK(!get_valid_opts({}).minimum_chain_work);
+ BOOST_CHECK_EQUAL(get_valid_opts({"-minimumchainwork=0"}).minimum_chain_work, arith_uint256());
+ BOOST_CHECK_EQUAL(get_valid_opts({"-nominimumchainwork"}).minimum_chain_work, arith_uint256());
+ BOOST_CHECK_EQUAL(get_valid_opts({"-minimumchainwork=0x1234"}).minimum_chain_work, arith_uint256{0x1234});
+
+ std::string minimum_chainwork{"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"};
+ BOOST_CHECK_EQUAL(get_valid_opts({("-minimumchainwork=" + minimum_chainwork).c_str()}).minimum_chain_work, UintToArith256(uint256::FromHex(minimum_chainwork).value()));
+
+ BOOST_CHECK(!get_opts({"-minimumchainwork=xyz"})); // invalid hex characters
+ BOOST_CHECK(!get_opts({"-minimumchainwork=01234567890123456789012345678901234567890123456789012345678901234"})); // > 64 hex chars
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/validation_flush_tests.cpp b/src/test/validation_flush_tests.cpp
index 7398091215..c325f7deb2 100644
--- a/src/test/validation_flush_tests.cpp
+++ b/src/test/validation_flush_tests.cpp
@@ -50,7 +50,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
// Add a bunch of coins to see that we at least flip over to CRITICAL.
for (int i{0}; i < 1000; ++i) {
- const COutPoint res = AddTestCoin(view);
+ const COutPoint res = AddTestCoin(m_rng, view);
BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE);
}
@@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
CoinsCacheSizeState::OK);
for (int i{0}; i < COINS_UNTIL_CRITICAL; ++i) {
- const COutPoint res = AddTestCoin(view);
+ const COutPoint res = AddTestCoin(m_rng, view);
print_view_mem_usage(view);
BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE);
@@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
// Adding some additional coins will push us over the edge to CRITICAL.
for (int i{0}; i < 4; ++i) {
- AddTestCoin(view);
+ AddTestCoin(m_rng, view);
print_view_mem_usage(view);
if (chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/0) ==
CoinsCacheSizeState::CRITICAL) {
@@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
CoinsCacheSizeState::OK);
for (int i{0}; i < 3; ++i) {
- AddTestCoin(view);
+ AddTestCoin(m_rng, view);
print_view_mem_usage(view);
BOOST_CHECK_EQUAL(
chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/ 1 << 19),
@@ -117,7 +117,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
// Adding another coin with the additional mempool room will put us >90%
// but not yet critical.
- AddTestCoin(view);
+ AddTestCoin(m_rng, view);
print_view_mem_usage(view);
// Only perform these checks on 64 bit hosts; I haven't done the math for 32.
@@ -133,7 +133,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
// Using the default max_* values permits way more coins to be added.
for (int i{0}; i < 1000; ++i) {
- AddTestCoin(view);
+ AddTestCoin(m_rng, view);
BOOST_CHECK_EQUAL(
chainstate.GetCoinsCacheSizeState(),
CoinsCacheSizeState::OK);
@@ -145,7 +145,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, 0),
CoinsCacheSizeState::CRITICAL);
- view.SetBestBlock(InsecureRand256());
+ view.SetBestBlock(m_rng.rand256());
BOOST_CHECK(view.Flush());
print_view_mem_usage(view);
diff --git a/src/test/validation_tests.cpp b/src/test/validation_tests.cpp
index 93a884be6d..2e378ed30b 100644
--- a/src/test/validation_tests.cpp
+++ b/src/test/validation_tests.cpp
@@ -143,11 +143,11 @@ BOOST_AUTO_TEST_CASE(test_assumeutxo)
const auto out110 = *params->AssumeutxoForHeight(110);
BOOST_CHECK_EQUAL(out110.hash_serialized.ToString(), "6657b736d4fe4db0cbc796789e812d5dba7f5c143764b1b6905612f1830609d1");
- BOOST_CHECK_EQUAL(out110.nChainTx, 111U);
+ BOOST_CHECK_EQUAL(out110.m_chain_tx_count, 111U);
- const auto out110_2 = *params->AssumeutxoForBlockhash(uint256S("0x696e92821f65549c7ee134edceeeeaaa4105647a3c4fd9f298c0aec0ab50425c"));
+ const auto out110_2 = *params->AssumeutxoForBlockhash(uint256{"696e92821f65549c7ee134edceeeeaaa4105647a3c4fd9f298c0aec0ab50425c"});
BOOST_CHECK_EQUAL(out110_2.hash_serialized.ToString(), "6657b736d4fe4db0cbc796789e812d5dba7f5c143764b1b6905612f1830609d1");
- BOOST_CHECK_EQUAL(out110_2.nChainTx, 111U);
+ BOOST_CHECK_EQUAL(out110_2.m_chain_tx_count, 111U);
}
BOOST_AUTO_TEST_CASE(block_malleation)
diff --git a/src/test/versionbits_tests.cpp b/src/test/versionbits_tests.cpp
index f462895edb..29240a45f0 100644
--- a/src/test/versionbits_tests.cpp
+++ b/src/test/versionbits_tests.cpp
@@ -67,6 +67,7 @@ public:
class VersionBitsTester
{
+ FastRandomContext& m_rng;
// A fake blockchain
std::vector<CBlockIndex*> vpblock;
@@ -85,6 +86,8 @@ class VersionBitsTester
int num{1000};
public:
+ VersionBitsTester(FastRandomContext& rng) : m_rng{rng} {}
+
VersionBitsTester& Reset() {
// Have each group of tests be counted by the 1000s part, starting at 1000
num = num - (num % 1000) + 1000;
@@ -128,7 +131,7 @@ public:
{
const CBlockIndex* tip = Tip();
for (int i = 0; i < CHECKERS; i++) {
- if (InsecureRandBits(i) == 0) {
+ if (m_rng.randbits(i) == 0) {
BOOST_CHECK_MESSAGE(checker[i].GetStateSinceHeightFor(tip) == height, strprintf("Test %i for StateSinceHeight", num));
BOOST_CHECK_MESSAGE(checker_delayed[i].GetStateSinceHeightFor(tip) == height_delayed, strprintf("Test %i for StateSinceHeight (delayed)", num));
BOOST_CHECK_MESSAGE(checker_always[i].GetStateSinceHeightFor(tip) == 0, strprintf("Test %i for StateSinceHeight (always active)", num));
@@ -154,7 +157,7 @@ public:
const CBlockIndex* pindex = Tip();
for (int i = 0; i < CHECKERS; i++) {
- if (InsecureRandBits(i) == 0) {
+ if (m_rng.randbits(i) == 0) {
ThresholdState got = checker[i].GetStateFor(pindex);
ThresholdState got_delayed = checker_delayed[i].GetStateFor(pindex);
ThresholdState got_always = checker_always[i].GetStateFor(pindex);
@@ -190,7 +193,7 @@ BOOST_AUTO_TEST_CASE(versionbits_test)
{
for (int i = 0; i < 64; i++) {
// DEFINED -> STARTED after timeout reached -> FAILED
- VersionBitsTester().TestDefined().TestStateSinceHeight(0)
+ VersionBitsTester(m_rng).TestDefined().TestStateSinceHeight(0)
.Mine(1, TestTime(1), 0x100).TestDefined().TestStateSinceHeight(0)
.Mine(11, TestTime(11), 0x100).TestDefined().TestStateSinceHeight(0)
.Mine(989, TestTime(989), 0x100).TestDefined().TestStateSinceHeight(0)
@@ -256,8 +259,9 @@ BOOST_AUTO_TEST_CASE(versionbits_test)
}
}
+struct BlockVersionTest : BasicTestingSetup {
/** Check that ComputeBlockVersion will set the appropriate bit correctly */
-static void check_computeblockversion(VersionBitsCache& versionbitscache, const Consensus::Params& params, Consensus::DeploymentPos dep)
+void check_computeblockversion(VersionBitsCache& versionbitscache, const Consensus::Params& params, Consensus::DeploymentPos dep)
{
// Clear the cache every time
versionbitscache.Clear();
@@ -295,7 +299,7 @@ static void check_computeblockversion(VersionBitsCache& versionbitscache, const
// In the first chain, test that the bit is set by CBV until it has failed.
// In the second chain, test the bit is set by CBV while STARTED and
// LOCKED-IN, and then no longer set while ACTIVE.
- VersionBitsTester firstChain, secondChain;
+ VersionBitsTester firstChain{m_rng}, secondChain{m_rng};
int64_t nTime = nStartTime;
@@ -412,14 +416,15 @@ static void check_computeblockversion(VersionBitsCache& versionbitscache, const
// Check that we don't signal after activation
BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
}
+}; // struct BlockVersionTest
-BOOST_AUTO_TEST_CASE(versionbits_computeblockversion)
+BOOST_FIXTURE_TEST_CASE(versionbits_computeblockversion, BlockVersionTest)
{
VersionBitsCache vbcache;
// check that any deployment on any chain can conceivably reach both
// ACTIVE and FAILED states in roughly the way we expect
- for (const auto& chain_type: {ChainType::MAIN, ChainType::TESTNET, ChainType::SIGNET, ChainType::REGTEST}) {
+ for (const auto& chain_type: {ChainType::MAIN, ChainType::TESTNET, ChainType::TESTNET4, ChainType::SIGNET, ChainType::REGTEST}) {
const auto chainParams = CreateChainParams(*m_node.args, chain_type);
uint32_t chain_all_vbits{0};
for (int i = 0; i < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++i) {
diff --git a/src/test/xoroshiro128plusplus_tests.cpp b/src/test/xoroshiro128plusplus_tests.cpp
deleted file mode 100644
index ea1b3e355f..0000000000
--- a/src/test/xoroshiro128plusplus_tests.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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 <test/util/setup_common.h>
-#include <test/util/xoroshiro128plusplus.h>
-
-#include <boost/test/unit_test.hpp>
-
-BOOST_FIXTURE_TEST_SUITE(xoroshiro128plusplus_tests, BasicTestingSetup)
-
-BOOST_AUTO_TEST_CASE(reference_values)
-{
- // numbers generated from reference implementation
- XoRoShiRo128PlusPlus rng(0);
- BOOST_TEST(0x6f68e1e7e2646ee1 == rng());
- BOOST_TEST(0xbf971b7f454094ad == rng());
- BOOST_TEST(0x48f2de556f30de38 == rng());
- BOOST_TEST(0x6ea7c59f89bbfc75 == rng());
-
- // seed with a random number
- rng = XoRoShiRo128PlusPlus(0x1a26f3fa8546b47a);
- BOOST_TEST(0xc8dc5e08d844ac7d == rng());
- BOOST_TEST(0x5b5f1f6d499dad1b == rng());
- BOOST_TEST(0xbeb0031f93313d6f == rng());
- BOOST_TEST(0xbfbcf4f43a264497 == rng());
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/threadsafety.h b/src/threadsafety.h
index 28b6177927..2e9a39bfc9 100644
--- a/src/threadsafety.h
+++ b/src/threadsafety.h
@@ -71,7 +71,7 @@ class SCOPED_LOCKABLE StdLockGuard : public std::lock_guard<StdMutex>
{
public:
explicit StdLockGuard(StdMutex& cs) EXCLUSIVE_LOCK_FUNCTION(cs) : std::lock_guard<StdMutex>(cs) {}
- ~StdLockGuard() UNLOCK_FUNCTION() {}
+ ~StdLockGuard() UNLOCK_FUNCTION() = default;
};
#endif // BITCOIN_THREADSAFETY_H
diff --git a/src/tinyformat.h b/src/tinyformat.h
index 3ec385bc95..f536306375 100644
--- a/src/tinyformat.h
+++ b/src/tinyformat.h
@@ -507,8 +507,7 @@ namespace detail {
class FormatArg
{
public:
- FormatArg()
- { }
+ FormatArg() = default;
template<typename T>
explicit FormatArg(const T& value)
diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp
index 4f79644c8d..58fc1bdf2a 100644
--- a/src/torcontrol.cpp
+++ b/src/torcontrol.cpp
@@ -110,7 +110,7 @@ void TorControlConnection::readcb(struct bufferevent *bev, void *ctx)
self->reply_handlers.front()(*self, self->message);
self->reply_handlers.pop_front();
} else {
- LogPrint(BCLog::TOR, "Received unexpected sync reply %i\n", self->message.code);
+ LogDebug(BCLog::TOR, "Received unexpected sync reply %i\n", self->message.code);
}
}
self->message.Clear();
@@ -129,13 +129,13 @@ void TorControlConnection::eventcb(struct bufferevent *bev, short what, void *ct
{
TorControlConnection *self = static_cast<TorControlConnection*>(ctx);
if (what & BEV_EVENT_CONNECTED) {
- LogPrint(BCLog::TOR, "Successfully connected!\n");
+ LogDebug(BCLog::TOR, "Successfully connected!\n");
self->connected(*self);
} else if (what & (BEV_EVENT_EOF|BEV_EVENT_ERROR)) {
if (what & BEV_EVENT_ERROR) {
- LogPrint(BCLog::TOR, "Error connecting to Tor control socket\n");
+ LogDebug(BCLog::TOR, "Error connecting to Tor control socket\n");
} else {
- LogPrint(BCLog::TOR, "End of stream\n");
+ LogDebug(BCLog::TOR, "End of stream\n");
}
self->Disconnect();
self->disconnected(*self);
@@ -334,7 +334,7 @@ TorController::TorController(struct event_base* _base, const std::string& tor_co
// Read service private key if cached
std::pair<bool,std::string> pkf = ReadBinaryFile(GetPrivateKeyFile());
if (pkf.first) {
- LogPrint(BCLog::TOR, "Reading cached private key from %s\n", fs::PathToString(GetPrivateKeyFile()));
+ LogDebug(BCLog::TOR, "Reading cached private key from %s\n", fs::PathToString(GetPrivateKeyFile()));
private_key = pkf.second;
}
}
@@ -375,7 +375,7 @@ void TorController::get_socks_cb(TorControlConnection& _conn, const TorControlRe
}
}
if (!socks_location.empty()) {
- LogPrint(BCLog::TOR, "Get SOCKS port command yielded %s\n", socks_location);
+ LogDebug(BCLog::TOR, "Get SOCKS port command yielded %s\n", socks_location);
} else {
LogPrintf("tor: Get SOCKS port command returned nothing\n");
}
@@ -396,7 +396,7 @@ void TorController::get_socks_cb(TorControlConnection& _conn, const TorControlRe
}
Assume(resolved.IsValid());
- LogPrint(BCLog::TOR, "Configuring onion proxy for %s\n", resolved.ToStringAddrPort());
+ LogDebug(BCLog::TOR, "Configuring onion proxy for %s\n", resolved.ToStringAddrPort());
Proxy addrOnion = Proxy(resolved, true);
SetProxy(NET_ONION, addrOnion);
@@ -420,7 +420,7 @@ void TorController::get_socks_cb(TorControlConnection& _conn, const TorControlRe
void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint(BCLog::TOR, "ADD_ONION successful\n");
+ LogDebug(BCLog::TOR, "ADD_ONION successful\n");
for (const std::string &s : reply.lines) {
std::map<std::string,std::string> m = ParseTorReplyMapping(s);
std::map<std::string,std::string>::iterator i;
@@ -439,7 +439,7 @@ void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlRe
service = LookupNumeric(std::string(service_id+".onion"), Params().GetDefaultPort());
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()));
+ LogDebug(BCLog::TOR, "Cached service private key to %s\n", fs::PathToString(GetPrivateKeyFile()));
} else {
LogPrintf("tor: Error writing service private key to %s\n", fs::PathToString(GetPrivateKeyFile()));
}
@@ -455,7 +455,7 @@ void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlRe
void TorController::auth_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint(BCLog::TOR, "Authentication successful\n");
+ LogDebug(BCLog::TOR, "Authentication successful\n");
// Now that we know Tor is running setup the proxy for onion addresses
// if -onion isn't set to something else.
@@ -506,7 +506,7 @@ static std::vector<uint8_t> ComputeResponse(const std::string &key, const std::v
void TorController::authchallenge_cb(TorControlConnection& _conn, const TorControlReply& reply)
{
if (reply.code == 250) {
- LogPrint(BCLog::TOR, "SAFECOOKIE authentication challenge successful\n");
+ LogDebug(BCLog::TOR, "SAFECOOKIE authentication challenge successful\n");
std::pair<std::string,std::string> l = SplitTorReplyLine(reply.lines[0]);
if (l.first == "AUTHCHALLENGE") {
std::map<std::string,std::string> m = ParseTorReplyMapping(l.second);
@@ -516,7 +516,7 @@ void TorController::authchallenge_cb(TorControlConnection& _conn, const TorContr
}
std::vector<uint8_t> serverHash = ParseHex(m["SERVERHASH"]);
std::vector<uint8_t> serverNonce = ParseHex(m["SERVERNONCE"]);
- LogPrint(BCLog::TOR, "AUTHCHALLENGE ServerHash %s ServerNonce %s\n", HexStr(serverHash), HexStr(serverNonce));
+ LogDebug(BCLog::TOR, "AUTHCHALLENGE ServerHash %s ServerNonce %s\n", HexStr(serverHash), HexStr(serverNonce));
if (serverNonce.size() != 32) {
LogPrintf("tor: ServerNonce is not 32 bytes, as required by spec\n");
return;
@@ -563,12 +563,12 @@ void TorController::protocolinfo_cb(TorControlConnection& _conn, const TorContro
std::map<std::string,std::string> m = ParseTorReplyMapping(l.second);
std::map<std::string,std::string>::iterator i;
if ((i = m.find("Tor")) != m.end()) {
- LogPrint(BCLog::TOR, "Connected to Tor version %s\n", i->second);
+ LogDebug(BCLog::TOR, "Connected to Tor version %s\n", i->second);
}
}
}
for (const std::string &s : methods) {
- LogPrint(BCLog::TOR, "Supported authentication method: %s\n", s);
+ LogDebug(BCLog::TOR, "Supported authentication method: %s\n", s);
}
// Prefer NULL, otherwise SAFECOOKIE. If a password is provided, use HASHEDPASSWORD
/* Authentication:
@@ -578,18 +578,18 @@ void TorController::protocolinfo_cb(TorControlConnection& _conn, const TorContro
std::string torpassword = gArgs.GetArg("-torpassword", "");
if (!torpassword.empty()) {
if (methods.count("HASHEDPASSWORD")) {
- LogPrint(BCLog::TOR, "Using HASHEDPASSWORD authentication\n");
+ LogDebug(BCLog::TOR, "Using HASHEDPASSWORD authentication\n");
ReplaceAll(torpassword, "\"", "\\\"");
_conn.Command("AUTHENTICATE \"" + torpassword + "\"", std::bind(&TorController::auth_cb, this, std::placeholders::_1, std::placeholders::_2));
} else {
LogPrintf("tor: Password provided with -torpassword, but HASHEDPASSWORD authentication is not available\n");
}
} else if (methods.count("NULL")) {
- LogPrint(BCLog::TOR, "Using NULL authentication\n");
+ LogDebug(BCLog::TOR, "Using NULL authentication\n");
_conn.Command("AUTHENTICATE", std::bind(&TorController::auth_cb, this, std::placeholders::_1, std::placeholders::_2));
} else if (methods.count("SAFECOOKIE")) {
// Cookie: hexdump -e '32/1 "%02x""\n"' ~/.tor/control_auth_cookie
- LogPrint(BCLog::TOR, "Using SAFECOOKIE authentication, reading cookie authentication from %s\n", cookiefile);
+ LogDebug(BCLog::TOR, "Using SAFECOOKIE authentication, reading cookie authentication from %s\n", cookiefile);
std::pair<bool,std::string> status_cookie = ReadBinaryFile(fs::PathFromString(cookiefile), TOR_COOKIE_SIZE);
if (status_cookie.first && status_cookie.second.size() == TOR_COOKIE_SIZE) {
// _conn.Command("AUTHENTICATE " + HexStr(status_cookie.second), std::bind(&TorController::auth_cb, this, std::placeholders::_1, std::placeholders::_2));
@@ -631,7 +631,7 @@ void TorController::disconnected_cb(TorControlConnection& _conn)
if (!reconnect)
return;
- LogPrint(BCLog::TOR, "Not connected to Tor control port %s, trying to reconnect\n", m_tor_control_center);
+ LogDebug(BCLog::TOR, "Not connected to Tor control port %s, trying to reconnect\n", m_tor_control_center);
// Single-shot timer for reconnect. Use exponential backoff.
struct timeval time = MillisToTimeval(int64_t(reconnect_timeout * 1000.0));
diff --git a/src/txdb.cpp b/src/txdb.cpp
index e4a4b3bf72..9b43a2b03e 100644
--- a/src/txdb.cpp
+++ b/src/txdb.cpp
@@ -88,7 +88,7 @@ std::vector<uint256> CCoinsViewDB::GetHeadBlocks() const {
return vhashHeadBlocks;
}
-bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase) {
+bool CCoinsViewDB::BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlock) {
CDBBatch batch(*m_db);
size_t count = 0;
size_t changed = 0;
@@ -114,8 +114,8 @@ bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, boo
batch.Erase(DB_BEST_BLOCK);
batch.Write(DB_HEAD_BLOCKS, Vector(hashBlock, old_tip));
- for (CCoinsMap::iterator it = mapCoins.begin(); it != mapCoins.end();) {
- if (it->second.flags & CCoinsCacheEntry::DIRTY) {
+ for (auto it{cursor.Begin()}; it != cursor.End();) {
+ if (it->second.IsDirty()) {
CoinEntry entry(&it->first);
if (it->second.coin.IsSpent())
batch.Erase(entry);
@@ -124,9 +124,9 @@ bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, boo
changed++;
}
count++;
- it = erase ? mapCoins.erase(it) : std::next(it);
+ it = cursor.NextAndMaybeErase(*it);
if (batch.SizeEstimate() > m_options.batch_write_bytes) {
- LogPrint(BCLog::COINDB, "Writing partial batch of %.2f MiB\n", batch.SizeEstimate() * (1.0 / 1048576.0));
+ LogDebug(BCLog::COINDB, "Writing partial batch of %.2f MiB\n", batch.SizeEstimate() * (1.0 / 1048576.0));
m_db->WriteBatch(batch);
batch.Clear();
if (m_options.simulate_crash_ratio) {
@@ -143,9 +143,9 @@ bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, boo
batch.Erase(DB_HEAD_BLOCKS);
batch.Write(DB_BEST_BLOCK, hashBlock);
- LogPrint(BCLog::COINDB, "Writing final batch of %.2f MiB\n", batch.SizeEstimate() * (1.0 / 1048576.0));
+ LogDebug(BCLog::COINDB, "Writing final batch of %.2f MiB\n", batch.SizeEstimate() * (1.0 / 1048576.0));
bool ret = m_db->WriteBatch(batch);
- LogPrint(BCLog::COINDB, "Committed %u changed transaction outputs (out of %u) to coin database...\n", (unsigned int)changed, (unsigned int)count);
+ LogDebug(BCLog::COINDB, "Committed %u changed transaction outputs (out of %u) to coin database...\n", (unsigned int)changed, (unsigned int)count);
return ret;
}
diff --git a/src/txdb.h b/src/txdb.h
index c9af0a091e..412d6c6009 100644
--- a/src/txdb.h
+++ b/src/txdb.h
@@ -25,8 +25,6 @@ class uint256;
static const int64_t nDefaultDbCache = 450;
//! -dbbatchsize default (bytes)
static const int64_t nDefaultDbBatchSize = 16 << 20;
-//! max. -dbcache (MiB)
-static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 16384 : 1024;
//! min. -dbcache (MiB)
static const int64_t nMinDbCache = 4;
//! Max memory allocated to block tree DB specific cache, if no -txindex (MiB)
@@ -63,7 +61,7 @@ public:
bool HaveCoin(const COutPoint &outpoint) const override;
uint256 GetBestBlock() const override;
std::vector<uint256> GetHeadBlocks() const override;
- bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock, bool erase = true) override;
+ bool BatchWrite(CoinsViewCacheCursor& cursor, const uint256 &hashBlock) override;
std::unique_ptr<CCoinsViewCursor> Cursor() const override;
//! Whether an unsupported database format is used.
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index 10674c07ac..f8f5ec0360 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -15,7 +15,6 @@
#include <policy/policy.h>
#include <policy/settings.h>
#include <random.h>
-#include <reverse_iterator.h>
#include <tinyformat.h>
#include <util/check.h>
#include <util/feefrac.h>
@@ -31,6 +30,7 @@
#include <cmath>
#include <numeric>
#include <optional>
+#include <ranges>
#include <string_view>
#include <utility>
@@ -121,7 +121,7 @@ void CTxMemPool::UpdateTransactionsFromBlock(const std::vector<uint256>& vHashes
// This maximizes the benefit of the descendant cache and guarantees that
// CTxMemPoolEntry::m_children will be updated, an assumption made in
// UpdateForDescendants.
- for (const uint256 &hash : reverse_iterate(vHashesToUpdate)) {
+ for (const uint256& hash : vHashesToUpdate | std::views::reverse) {
// calculate children from mapNextTx
txiter it = mapTx.find(hash);
if (it == mapTx.end()) {
@@ -657,11 +657,11 @@ void CTxMemPool::check(const CCoinsViewCache& active_coins_tip, int64_t spendhei
{
if (m_opts.check_ratio == 0) return;
- if (GetRand(m_opts.check_ratio) >= 1) return;
+ if (FastRandomContext().randrange(m_opts.check_ratio) >= 1) return;
AssertLockHeld(::cs_main);
LOCK(cs);
- LogPrint(BCLog::MEMPOOL, "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size());
+ LogDebug(BCLog::MEMPOOL, "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size());
uint64_t checkTotal = 0;
CAmount check_total_fee{0};
@@ -1036,7 +1036,7 @@ void CTxMemPool::RemoveUnbroadcastTx(const uint256& txid, const bool unchecked)
if (m_unbroadcast_txids.erase(txid))
{
- LogPrint(BCLog::MEMPOOL, "Removed %i from set of unbroadcast txns%s\n", txid.GetHex(), (unchecked ? " before confirmation that txn was sent out" : ""));
+ LogDebug(BCLog::MEMPOOL, "Removed %i from set of unbroadcast txns%s\n", txid.GetHex(), (unchecked ? " before confirmation that txn was sent out" : ""));
}
}
@@ -1164,7 +1164,7 @@ void CTxMemPool::TrimToSize(size_t sizelimit, std::vector<COutPoint>* pvNoSpends
}
if (maxFeeRateRemoved > CFeeRate(0)) {
- LogPrint(BCLog::MEMPOOL, "Removed %u txn, rolling minimum fee bumped to %s\n", nTxnRemoved, maxFeeRateRemoved.ToString());
+ LogDebug(BCLog::MEMPOOL, "Removed %u txn, rolling minimum fee bumped to %s\n", nTxnRemoved, maxFeeRateRemoved.ToString());
}
}
diff --git a/src/txmempool.h b/src/txmempool.h
index 52f186f0ff..d0cb41a078 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -329,9 +329,7 @@ public:
static const int ROLLING_FEE_HALFLIFE = 60 * 60 * 12; // public only for testing
- typedef boost::multi_index_container<
- CTxMemPoolEntry,
- boost::multi_index::indexed_by<
+ struct CTxMemPoolEntry_Indices final : boost::multi_index::indexed_by<
// sorted by txid
boost::multi_index::hashed_unique<mempoolentry_txid, SaltedTxidHasher>,
// sorted by wtxid
@@ -359,6 +357,10 @@ public:
CompareTxMemPoolEntryByAncestorFee
>
>
+ {};
+ typedef boost::multi_index_container<
+ CTxMemPoolEntry,
+ CTxMemPoolEntry_Indices
> indexed_transaction_set;
/**
@@ -366,9 +368,7 @@ public:
* that are guarded by it.
*
* @par Consistency guarantees
- *
* By design, it is guaranteed that:
- *
* 1. Locking both `cs_main` and `mempool.cs` will give a view of mempool
* that is consistent with current chain tip (`ActiveChain()` and
* `CoinsTip()`) and is fully populated. Fully populated means that if the
@@ -376,7 +376,6 @@ public:
* previously active chain, all the missing transactions will have been
* re-added to the mempool and should be present if they meet size and
* consistency constraints.
- *
* 2. Locking `mempool.cs` without `cs_main` will give a view of a mempool
* consistent with some chain that was active since `cs_main` was last
* locked, and that is fully populated as described above. It is ok for
diff --git a/src/txorphanage.cpp b/src/txorphanage.cpp
index 3eaf53939d..35a215c88a 100644
--- a/src/txorphanage.cpp
+++ b/src/txorphanage.cpp
@@ -12,16 +12,8 @@
#include <cassert>
-/** Expiration time for orphan transactions */
-static constexpr auto ORPHAN_TX_EXPIRE_TIME{20min};
-/** Minimum time between orphan transactions expire time checks */
-static constexpr auto ORPHAN_TX_EXPIRE_INTERVAL{5min};
-
-
bool TxOrphanage::AddTx(const CTransactionRef& tx, NodeId peer)
{
- LOCK(m_mutex);
-
const Txid& hash = tx->GetHash();
const Wtxid& wtxid = tx->GetWitnessHash();
if (m_orphans.count(wtxid))
@@ -37,7 +29,7 @@ bool TxOrphanage::AddTx(const CTransactionRef& tx, NodeId peer)
unsigned int sz = GetTransactionWeight(*tx);
if (sz > MAX_STANDARD_TX_WEIGHT)
{
- LogPrint(BCLog::TXPACKAGES, "ignoring large orphan tx (size: %u, txid: %s, wtxid: %s)\n", sz, hash.ToString(), wtxid.ToString());
+ LogDebug(BCLog::TXPACKAGES, "ignoring large orphan tx (size: %u, txid: %s, wtxid: %s)\n", sz, hash.ToString(), wtxid.ToString());
return false;
}
@@ -48,20 +40,13 @@ bool TxOrphanage::AddTx(const CTransactionRef& tx, NodeId peer)
m_outpoint_to_orphan_it[txin.prevout].insert(ret.first);
}
- LogPrint(BCLog::TXPACKAGES, "stored orphan tx %s (wtxid=%s), weight: %u (mapsz %u outsz %u)\n", hash.ToString(), wtxid.ToString(), sz,
+ LogDebug(BCLog::TXPACKAGES, "stored orphan tx %s (wtxid=%s), weight: %u (mapsz %u outsz %u)\n", hash.ToString(), wtxid.ToString(), sz,
m_orphans.size(), m_outpoint_to_orphan_it.size());
return true;
}
int TxOrphanage::EraseTx(const Wtxid& wtxid)
{
- LOCK(m_mutex);
- return EraseTxNoLock(wtxid);
-}
-
-int TxOrphanage::EraseTxNoLock(const Wtxid& wtxid)
-{
- AssertLockHeld(m_mutex);
std::map<Wtxid, OrphanTx>::iterator it = m_orphans.find(wtxid);
if (it == m_orphans.end())
return 0;
@@ -87,7 +72,7 @@ int TxOrphanage::EraseTxNoLock(const Wtxid& wtxid)
const auto& txid = it->second.tx->GetHash();
// Time spent in orphanage = difference between current and entry time.
// Entry time is equal to ORPHAN_TX_EXPIRE_TIME earlier than entry's expiry.
- LogPrint(BCLog::TXPACKAGES, " removed orphan tx %s (wtxid=%s) after %ds\n", txid.ToString(), wtxid.ToString(),
+ LogDebug(BCLog::TXPACKAGES, " removed orphan tx %s (wtxid=%s) after %ds\n", txid.ToString(), wtxid.ToString(),
Ticks<std::chrono::seconds>(NodeClock::now() + ORPHAN_TX_EXPIRE_TIME - it->second.nTimeExpire));
m_orphan_list.pop_back();
@@ -97,8 +82,6 @@ int TxOrphanage::EraseTxNoLock(const Wtxid& wtxid)
void TxOrphanage::EraseForPeer(NodeId peer)
{
- LOCK(m_mutex);
-
m_peer_work_set.erase(peer);
int nErased = 0;
@@ -108,16 +91,14 @@ void TxOrphanage::EraseForPeer(NodeId peer)
// increment to avoid iterator becoming invalid after erasure
const auto& [wtxid, orphan] = *iter++;
if (orphan.fromPeer == peer) {
- nErased += EraseTxNoLock(wtxid);
+ nErased += EraseTx(wtxid);
}
}
- if (nErased > 0) LogPrint(BCLog::TXPACKAGES, "Erased %d orphan transaction(s) from peer=%d\n", nErased, peer);
+ if (nErased > 0) LogDebug(BCLog::TXPACKAGES, "Erased %d orphan transaction(s) from peer=%d\n", nErased, peer);
}
void TxOrphanage::LimitOrphans(unsigned int max_orphans, FastRandomContext& rng)
{
- LOCK(m_mutex);
-
unsigned int nEvicted = 0;
auto nNow{Now<NodeSeconds>()};
if (m_next_sweep <= nNow) {
@@ -129,30 +110,27 @@ void TxOrphanage::LimitOrphans(unsigned int max_orphans, FastRandomContext& rng)
{
std::map<Wtxid, OrphanTx>::iterator maybeErase = iter++;
if (maybeErase->second.nTimeExpire <= nNow) {
- nErased += EraseTxNoLock(maybeErase->second.tx->GetWitnessHash());
+ nErased += EraseTx(maybeErase->second.tx->GetWitnessHash());
} else {
nMinExpTime = std::min(maybeErase->second.nTimeExpire, nMinExpTime);
}
}
// Sweep again 5 minutes after the next entry that expires in order to batch the linear scan.
m_next_sweep = nMinExpTime + ORPHAN_TX_EXPIRE_INTERVAL;
- if (nErased > 0) LogPrint(BCLog::TXPACKAGES, "Erased %d orphan tx due to expiration\n", nErased);
+ if (nErased > 0) LogDebug(BCLog::TXPACKAGES, "Erased %d orphan tx due to expiration\n", nErased);
}
while (m_orphans.size() > max_orphans)
{
// Evict a random orphan:
size_t randompos = rng.randrange(m_orphan_list.size());
- EraseTxNoLock(m_orphan_list[randompos]->second.tx->GetWitnessHash());
+ EraseTx(m_orphan_list[randompos]->second.tx->GetWitnessHash());
++nEvicted;
}
- if (nEvicted > 0) LogPrint(BCLog::TXPACKAGES, "orphanage overflow, removed %u tx\n", nEvicted);
+ if (nEvicted > 0) LogDebug(BCLog::TXPACKAGES, "orphanage overflow, removed %u tx\n", nEvicted);
}
void TxOrphanage::AddChildrenToWorkSet(const CTransaction& tx)
{
- LOCK(m_mutex);
-
-
for (unsigned int i = 0; i < tx.vout.size(); i++) {
const auto it_by_prev = m_outpoint_to_orphan_it.find(COutPoint(tx.GetHash(), i));
if (it_by_prev != m_outpoint_to_orphan_it.end()) {
@@ -162,7 +140,7 @@ void TxOrphanage::AddChildrenToWorkSet(const CTransaction& tx)
std::set<Wtxid>& orphan_work_set = m_peer_work_set.try_emplace(elem->second.fromPeer).first->second;
// Add this tx to the work set
orphan_work_set.insert(elem->first);
- LogPrint(BCLog::TXPACKAGES, "added %s (wtxid=%s) to peer %d workset\n",
+ LogDebug(BCLog::TXPACKAGES, "added %s (wtxid=%s) to peer %d workset\n",
tx.GetHash().ToString(), tx.GetWitnessHash().ToString(), elem->second.fromPeer);
}
}
@@ -171,14 +149,11 @@ void TxOrphanage::AddChildrenToWorkSet(const CTransaction& tx)
bool TxOrphanage::HaveTx(const Wtxid& wtxid) const
{
- LOCK(m_mutex);
return m_orphans.count(wtxid);
}
CTransactionRef TxOrphanage::GetTxToReconsider(NodeId peer)
{
- LOCK(m_mutex);
-
auto work_set_it = m_peer_work_set.find(peer);
if (work_set_it != m_peer_work_set.end()) {
auto& work_set = work_set_it->second;
@@ -197,8 +172,6 @@ CTransactionRef TxOrphanage::GetTxToReconsider(NodeId peer)
bool TxOrphanage::HaveTxToReconsider(NodeId peer)
{
- LOCK(m_mutex);
-
auto work_set_it = m_peer_work_set.find(peer);
if (work_set_it != m_peer_work_set.end()) {
auto& work_set = work_set_it->second;
@@ -209,8 +182,6 @@ bool TxOrphanage::HaveTxToReconsider(NodeId peer)
void TxOrphanage::EraseForBlock(const CBlock& block)
{
- LOCK(m_mutex);
-
std::vector<Wtxid> vOrphanErase;
for (const CTransactionRef& ptx : block.vtx) {
@@ -231,16 +202,14 @@ void TxOrphanage::EraseForBlock(const CBlock& block)
if (vOrphanErase.size()) {
int nErased = 0;
for (const auto& orphanHash : vOrphanErase) {
- nErased += EraseTxNoLock(orphanHash);
+ nErased += EraseTx(orphanHash);
}
- LogPrint(BCLog::TXPACKAGES, "Erased %d orphan transaction(s) included or conflicted by block\n", nErased);
+ LogDebug(BCLog::TXPACKAGES, "Erased %d orphan transaction(s) included or conflicted by block\n", nErased);
}
}
std::vector<CTransactionRef> TxOrphanage::GetChildrenFromSamePeer(const CTransactionRef& parent, NodeId nodeid) const
{
- LOCK(m_mutex);
-
// First construct a vector of iterators to ensure we do not return duplicates of the same tx
// and so we can sort by nTimeExpire.
std::vector<OrphanMap::iterator> iters;
@@ -281,8 +250,6 @@ std::vector<CTransactionRef> TxOrphanage::GetChildrenFromSamePeer(const CTransac
std::vector<std::pair<CTransactionRef, NodeId>> TxOrphanage::GetChildrenFromDifferentPeer(const CTransactionRef& parent, NodeId nodeid) const
{
- LOCK(m_mutex);
-
// First construct vector of iterators to ensure we do not return duplicates of the same tx.
std::vector<OrphanMap::iterator> iters;
diff --git a/src/txorphanage.h b/src/txorphanage.h
index 3083c8467f..2c53d1d40f 100644
--- a/src/txorphanage.h
+++ b/src/txorphanage.h
@@ -14,63 +14,65 @@
#include <map>
#include <set>
+/** Expiration time for orphan transactions */
+static constexpr auto ORPHAN_TX_EXPIRE_TIME{20min};
+/** Minimum time between orphan transactions expire time checks */
+static constexpr auto ORPHAN_TX_EXPIRE_INTERVAL{5min};
+
/** A class to track orphan transactions (failed on TX_MISSING_INPUTS)
* Since we cannot distinguish orphans from bad transactions with
* non-existent inputs, we heavily limit the number of orphans
* we keep and the duration we keep them for.
+ * Not thread-safe. Requires external synchronization.
*/
class TxOrphanage {
public:
/** Add a new orphan transaction */
- bool AddTx(const CTransactionRef& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ bool AddTx(const CTransactionRef& tx, NodeId peer);
/** Check if we already have an orphan transaction (by wtxid only) */
- bool HaveTx(const Wtxid& wtxid) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ bool HaveTx(const Wtxid& wtxid) const;
/** Extract a transaction from a peer's work set
* Returns nullptr if there are no transactions to work on.
* Otherwise returns the transaction reference, and removes
* it from the work set.
*/
- CTransactionRef GetTxToReconsider(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ CTransactionRef GetTxToReconsider(NodeId peer);
/** Erase an orphan by wtxid */
- int EraseTx(const Wtxid& wtxid) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ int EraseTx(const Wtxid& wtxid);
/** Erase all orphans announced by a peer (eg, after that peer disconnects) */
- void EraseForPeer(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ void EraseForPeer(NodeId peer);
/** Erase all orphans included in or invalidated by a new block */
- void EraseForBlock(const CBlock& block) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ void EraseForBlock(const CBlock& block);
/** Limit the orphanage to the given maximum */
- void LimitOrphans(unsigned int max_orphans, FastRandomContext& rng) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ void LimitOrphans(unsigned int max_orphans, FastRandomContext& rng);
/** Add any orphans that list a particular tx as a parent into the from peer's work set */
- void AddChildrenToWorkSet(const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);;
+ void AddChildrenToWorkSet(const CTransaction& tx);
/** Does this peer have any work to do? */
- bool HaveTxToReconsider(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);;
+ bool HaveTxToReconsider(NodeId peer);
/** Get all children that spend from this tx and were received from nodeid. Sorted from most
* recent to least recent. */
- std::vector<CTransactionRef> GetChildrenFromSamePeer(const CTransactionRef& parent, NodeId nodeid) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ std::vector<CTransactionRef> GetChildrenFromSamePeer(const CTransactionRef& parent, NodeId nodeid) const;
/** Get all children that spend from this tx but were not received from nodeid. Also return
* which peer provided each tx. */
- std::vector<std::pair<CTransactionRef, NodeId>> GetChildrenFromDifferentPeer(const CTransactionRef& parent, NodeId nodeid) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
+ std::vector<std::pair<CTransactionRef, NodeId>> GetChildrenFromDifferentPeer(const CTransactionRef& parent, NodeId nodeid) const;
/** Return how many entries exist in the orphange */
- size_t Size() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
+ size_t Size()
{
- LOCK(m_mutex);
return m_orphans.size();
}
protected:
- /** Guards orphan transactions */
- mutable Mutex m_mutex;
-
struct OrphanTx {
CTransactionRef tx;
NodeId fromPeer;
@@ -80,10 +82,10 @@ protected:
/** Map from wtxid to orphan transaction record. Limited by
* -maxorphantx/DEFAULT_MAX_ORPHAN_TRANSACTIONS */
- std::map<Wtxid, OrphanTx> m_orphans GUARDED_BY(m_mutex);
+ std::map<Wtxid, OrphanTx> m_orphans;
/** Which peer provided the orphans that need to be reconsidered */
- std::map<NodeId, std::set<Wtxid>> m_peer_work_set GUARDED_BY(m_mutex);
+ std::map<NodeId, std::set<Wtxid>> m_peer_work_set;
using OrphanMap = decltype(m_orphans);
@@ -98,16 +100,13 @@ protected:
/** Index from the parents' COutPoint into the m_orphans. Used
* to remove orphan transactions from the m_orphans */
- std::map<COutPoint, std::set<OrphanMap::iterator, IteratorComparator>> m_outpoint_to_orphan_it GUARDED_BY(m_mutex);
+ std::map<COutPoint, std::set<OrphanMap::iterator, IteratorComparator>> m_outpoint_to_orphan_it;
/** Orphan transactions in vector for quick random eviction */
- std::vector<OrphanMap::iterator> m_orphan_list GUARDED_BY(m_mutex);
-
- /** Erase an orphan by wtxid */
- int EraseTxNoLock(const Wtxid& wtxid) EXCLUSIVE_LOCKS_REQUIRED(m_mutex);
+ std::vector<OrphanMap::iterator> m_orphan_list;
/** Timestamp for the next scheduled sweep of expired orphans */
- NodeSeconds m_next_sweep GUARDED_BY(m_mutex){0s};
+ NodeSeconds m_next_sweep{0s};
};
#endif // BITCOIN_TXORPHANAGE_H
diff --git a/src/txrequest.cpp b/src/txrequest.cpp
index ce5fbd9a7f..96ea716481 100644
--- a/src/txrequest.cpp
+++ b/src/txrequest.cpp
@@ -113,8 +113,8 @@ class PriorityComputer {
const uint64_t m_k0, m_k1;
public:
explicit PriorityComputer(bool deterministic) :
- m_k0{deterministic ? 0 : GetRand(0xFFFFFFFFFFFFFFFF)},
- m_k1{deterministic ? 0 : GetRand(0xFFFFFFFFFFFFFFFF)} {}
+ m_k0{deterministic ? 0 : FastRandomContext().rand64()},
+ m_k1{deterministic ? 0 : FastRandomContext().rand64()} {}
Priority operator()(const uint256& txhash, NodeId peer, bool preferred) const
{
@@ -212,14 +212,17 @@ struct ByTimeViewExtractor
}
};
+struct Announcement_Indices final : boost::multi_index::indexed_by<
+ boost::multi_index::ordered_unique<boost::multi_index::tag<ByPeer>, ByPeerViewExtractor>,
+ boost::multi_index::ordered_non_unique<boost::multi_index::tag<ByTxHash>, ByTxHashViewExtractor>,
+ boost::multi_index::ordered_non_unique<boost::multi_index::tag<ByTime>, ByTimeViewExtractor>
+>
+{};
+
/** Data type for the main data structure (Announcement objects with ByPeer/ByTxHash/ByTime indexes). */
using Index = boost::multi_index_container<
Announcement,
- boost::multi_index::indexed_by<
- boost::multi_index::ordered_unique<boost::multi_index::tag<ByPeer>, ByPeerViewExtractor>,
- boost::multi_index::ordered_non_unique<boost::multi_index::tag<ByTxHash>, ByTxHashViewExtractor>,
- boost::multi_index::ordered_non_unique<boost::multi_index::tag<ByTime>, ByTimeViewExtractor>
- >
+ Announcement_Indices
>;
/** Helper type to simplify syntax of iterator types. */
diff --git a/src/uint256.cpp b/src/uint256.cpp
index 7f81c3c448..2756a7f5cd 100644
--- a/src/uint256.cpp
+++ b/src/uint256.cpp
@@ -18,40 +18,32 @@ std::string base_blob<BITS>::GetHex() const
}
template <unsigned int BITS>
-void base_blob<BITS>::SetHex(const char* psz)
+void base_blob<BITS>::SetHexDeprecated(const std::string_view str)
{
std::fill(m_data.begin(), m_data.end(), 0);
- // skip leading spaces
- while (IsSpace(*psz))
- psz++;
+ const auto trimmed = util::RemovePrefixView(util::TrimStringView(str), "0x");
- // skip 0x
- if (psz[0] == '0' && ToLower(psz[1]) == 'x')
- psz += 2;
-
- // hex string to uint
+ // Note: if we are passed a greater number of digits than would fit as bytes
+ // in m_data, we will be discarding the leftmost ones.
+ // str="12bc" in a WIDTH=1 m_data => m_data[] == "\0xbc", not "0x12".
size_t digits = 0;
- while (::HexDigit(psz[digits]) != -1)
- digits++;
+ for (const char c : trimmed) {
+ if (::HexDigit(c) == -1) break;
+ ++digits;
+ }
unsigned char* p1 = m_data.data();
unsigned char* pend = p1 + WIDTH;
while (digits > 0 && p1 < pend) {
- *p1 = ::HexDigit(psz[--digits]);
+ *p1 = ::HexDigit(trimmed[--digits]);
if (digits > 0) {
- *p1 |= ((unsigned char)::HexDigit(psz[--digits]) << 4);
+ *p1 |= ((unsigned char)::HexDigit(trimmed[--digits]) << 4);
p1++;
}
}
}
template <unsigned int BITS>
-void base_blob<BITS>::SetHex(const std::string& str)
-{
- SetHex(str.c_str());
-}
-
-template <unsigned int BITS>
std::string base_blob<BITS>::ToString() const
{
return (GetHex());
@@ -60,14 +52,12 @@ std::string base_blob<BITS>::ToString() const
// Explicit instantiations for base_blob<160>
template std::string base_blob<160>::GetHex() const;
template std::string base_blob<160>::ToString() const;
-template void base_blob<160>::SetHex(const char*);
-template void base_blob<160>::SetHex(const std::string&);
+template void base_blob<160>::SetHexDeprecated(std::string_view);
// Explicit instantiations for base_blob<256>
template std::string base_blob<256>::GetHex() const;
template std::string base_blob<256>::ToString() const;
-template void base_blob<256>::SetHex(const char*);
-template void base_blob<256>::SetHex(const std::string&);
+template void base_blob<256>::SetHexDeprecated(std::string_view);
const uint256 uint256::ZERO(0);
const uint256 uint256::ONE(1);
diff --git a/src/uint256.h b/src/uint256.h
index d35b3a66fa..8223787041 100644
--- a/src/uint256.h
+++ b/src/uint256.h
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// 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.
@@ -8,13 +8,17 @@
#include <crypto/common.h>
#include <span.h>
+#include <util/strencodings.h>
+#include <util/string.h>
#include <algorithm>
#include <array>
#include <cassert>
+#include <cstdint>
#include <cstring>
-#include <stdint.h>
+#include <optional>
#include <string>
+#include <string_view>
/** Template base class for fixed-sized opaque blobs. */
template<unsigned int BITS>
@@ -39,6 +43,8 @@ public:
std::copy(vch.begin(), vch.end(), m_data.begin());
}
+ consteval explicit base_blob(std::string_view hex_str);
+
constexpr bool IsNull() const
{
return std::all_of(m_data.begin(), m_data.end(), [](uint8_t val) {
@@ -51,16 +57,46 @@ public:
std::fill(m_data.begin(), m_data.end(), 0);
}
+ /** Lexicographic ordering
+ * @note Does NOT match the ordering on the corresponding \ref
+ * base_uint::CompareTo, which starts comparing from the end.
+ */
constexpr int Compare(const base_blob& other) const { return std::memcmp(m_data.data(), other.m_data.data(), WIDTH); }
friend constexpr bool operator==(const base_blob& a, const base_blob& b) { return a.Compare(b) == 0; }
friend constexpr bool operator!=(const base_blob& a, const base_blob& b) { return a.Compare(b) != 0; }
friend constexpr bool operator<(const base_blob& a, const base_blob& b) { return a.Compare(b) < 0; }
+ /** @name Hex representation
+ *
+ * The reverse-byte hex representation is a convenient way to view the blob
+ * as a number, because it is consistent with the way the base_uint class
+ * converts blobs to numbers.
+ *
+ * @note base_uint treats the blob as an array of bytes with the numerically
+ * least significant byte first and the most significant byte last. Because
+ * numbers are typically written with the most significant digit first and
+ * the least significant digit last, the reverse hex display of the blob
+ * corresponds to the same numeric value that base_uint interprets from the
+ * blob.
+ * @{*/
std::string GetHex() const;
- void SetHex(const char* psz);
- void SetHex(const std::string& str);
+ /** Unlike FromHex this accepts any invalid input, thus it is fragile and deprecated!
+ *
+ * - Hex numbers that don't specify enough bytes to fill the internal array
+ * will be treated as setting the beginning of it, which corresponds to
+ * the least significant bytes when converted to base_uint.
+ *
+ * - Hex numbers specifying too many bytes will have the numerically most
+ * significant bytes (the beginning of the string) narrowed away.
+ *
+ * - An odd count of hex digits will result in the high bits of the leftmost
+ * byte being zero.
+ * "0x123" => {0x23, 0x1, 0x0, ..., 0x0}
+ */
+ void SetHexDeprecated(std::string_view str);
std::string ToString() const;
+ /**@}*/
constexpr const unsigned char* data() const { return m_data.data(); }
constexpr unsigned char* data() { return m_data.data(); }
@@ -88,12 +124,60 @@ public:
}
};
+template <unsigned int BITS>
+consteval base_blob<BITS>::base_blob(std::string_view hex_str)
+{
+ if (hex_str.length() != m_data.size() * 2) throw "Hex string must fit exactly";
+ auto str_it = hex_str.rbegin();
+ for (auto& elem : m_data) {
+ auto lo = util::ConstevalHexDigit(*(str_it++));
+ elem = (util::ConstevalHexDigit(*(str_it++)) << 4) | lo;
+ }
+}
+
+namespace detail {
+/**
+ * Writes the hex string (in reverse byte order) into a new uintN_t object
+ * and only returns a value iff all of the checks pass:
+ * - Input length is uintN_t::size()*2
+ * - All characters are hex
+ */
+template <class uintN_t>
+std::optional<uintN_t> FromHex(std::string_view str)
+{
+ if (uintN_t::size() * 2 != str.size() || !IsHex(str)) return std::nullopt;
+ uintN_t rv;
+ rv.SetHexDeprecated(str);
+ return rv;
+}
+/**
+ * @brief Like FromHex(std::string_view str), but allows an "0x" prefix
+ * and pads the input with leading zeroes if it is shorter than
+ * the expected length of uintN_t::size()*2.
+ *
+ * Designed to be used when dealing with user input.
+ */
+template <class uintN_t>
+std::optional<uintN_t> FromUserHex(std::string_view input)
+{
+ input = util::RemovePrefixView(input, "0x");
+ constexpr auto expected_size{uintN_t::size() * 2};
+ if (input.size() < expected_size) {
+ auto padded = std::string(expected_size, '0');
+ std::copy(input.begin(), input.end(), padded.begin() + expected_size - input.size());
+ return FromHex<uintN_t>(padded);
+ }
+ return FromHex<uintN_t>(input);
+}
+} // namespace detail
+
/** 160-bit opaque blob.
* @note This type is called uint160 for historical reasons only. It is an opaque
* blob of 160 bits and has no integer operations.
*/
class uint160 : public base_blob<160> {
public:
+ static std::optional<uint160> FromHex(std::string_view str) { return detail::FromHex<uint160>(str); }
constexpr uint160() = default;
constexpr explicit uint160(Span<const unsigned char> vch) : base_blob<160>(vch) {}
};
@@ -105,32 +189,14 @@ public:
*/
class uint256 : public base_blob<256> {
public:
+ static std::optional<uint256> FromHex(std::string_view str) { return detail::FromHex<uint256>(str); }
+ static std::optional<uint256> FromUserHex(std::string_view str) { return detail::FromUserHex<uint256>(str); }
constexpr uint256() = default;
+ consteval explicit uint256(std::string_view hex_str) : base_blob<256>(hex_str) {}
constexpr explicit uint256(uint8_t v) : base_blob<256>(v) {}
constexpr explicit uint256(Span<const unsigned char> vch) : base_blob<256>(vch) {}
static const uint256 ZERO;
static const uint256 ONE;
};
-/* uint256 from const char *.
- * This is a separate function because the constructor uint256(const char*) can result
- * in dangerously catching uint256(0).
- */
-inline uint256 uint256S(const char *str)
-{
- uint256 rv;
- rv.SetHex(str);
- return rv;
-}
-/* uint256 from std::string.
- * This is a separate function because the constructor uint256(const std::string &str) can result
- * in dangerously catching uint256(0) via std::string(const char*).
- */
-inline uint256 uint256S(const std::string& str)
-{
- uint256 rv;
- rv.SetHex(str);
- return rv;
-}
-
#endif // BITCOIN_UINT256_H
diff --git a/src/univalue/.gitignore b/src/univalue/.gitignore
deleted file mode 100644
index 19e42f814a..0000000000
--- a/src/univalue/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-.deps/
-INSTALL
-Makefile
-Makefile.in
-aclocal.m4
-autom4te.cache/
-compile
-config.log
-config.status
-config.guess
-config.sub
-configure
-depcomp
-install-sh
-missing
-stamp-h1
-univalue-config.h*
-test-driver
-libtool
-ltmain.sh
-test-suite.log
-
-*.a
-*.la
-*.lo
-*.logs
-*.o
-*.pc
-*.trs
-
-.dirstamp
-.libs
diff --git a/src/univalue/CMakeLists.txt b/src/univalue/CMakeLists.txt
new file mode 100644
index 0000000000..96733fe077
--- /dev/null
+++ b/src/univalue/CMakeLists.txt
@@ -0,0 +1,41 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(univalue STATIC EXCLUDE_FROM_ALL
+ lib/univalue.cpp
+ lib/univalue_get.cpp
+ lib/univalue_read.cpp
+ lib/univalue_write.cpp
+)
+target_include_directories(univalue
+ PUBLIC
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+)
+target_link_libraries(univalue PRIVATE core_interface)
+
+if(BUILD_TESTS)
+ add_executable(unitester test/unitester.cpp)
+ target_compile_definitions(unitester
+ PRIVATE
+ JSON_TEST_SRC=\"${CMAKE_CURRENT_SOURCE_DIR}/test\"
+ )
+ target_link_libraries(unitester
+ PRIVATE
+ core_interface
+ univalue
+ )
+ add_test(NAME univalue_test
+ COMMAND unitester
+ )
+
+ add_executable(object test/object.cpp)
+ target_link_libraries(object
+ PRIVATE
+ core_interface
+ univalue
+ )
+ add_test(NAME univalue_object_test
+ COMMAND object
+ )
+endif()
diff --git a/src/univalue/lib/.gitignore b/src/univalue/lib/.gitignore
deleted file mode 100644
index ee7fc2851c..0000000000
--- a/src/univalue/lib/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-gen
-.libs
diff --git a/src/univalue/sources.mk b/src/univalue/sources.mk
deleted file mode 100644
index 5e4d9c3831..0000000000
--- a/src/univalue/sources.mk
+++ /dev/null
@@ -1,86 +0,0 @@
-# - All Variables ending in _HEADERS or _SOURCES confuse automake, so the
-# _INT postfix is applied.
-# - Convenience variables, for example a UNIVALUE_TEST_DIR should not be used
-# as they interfere with automatic dependency generation
-# - The %reldir% is the relative path from the Makefile.am.
-
-UNIVALUE_INCLUDE_DIR_INT = %reldir%/include
-
-UNIVALUE_DIST_HEADERS_INT =
-UNIVALUE_DIST_HEADERS_INT += %reldir%/include/univalue.h
-UNIVALUE_DIST_HEADERS_INT += %reldir%/include/univalue_utffilter.h
-UNIVALUE_DIST_HEADERS_INT += %reldir%/include/univalue_escapes.h
-
-UNIVALUE_LIB_SOURCES_INT =
-UNIVALUE_LIB_SOURCES_INT += %reldir%/lib/univalue.cpp
-UNIVALUE_LIB_SOURCES_INT += %reldir%/lib/univalue_get.cpp
-UNIVALUE_LIB_SOURCES_INT += %reldir%/lib/univalue_read.cpp
-UNIVALUE_LIB_SOURCES_INT += %reldir%/lib/univalue_write.cpp
-
-UNIVALUE_TEST_DATA_DIR_INT = %reldir%/test
-
-UNIVALUE_TEST_UNITESTER_INT =
-UNIVALUE_TEST_UNITESTER_INT += %reldir%/test/unitester.cpp
-
-UNIVALUE_TEST_JSON_INT =
-UNIVALUE_TEST_JSON_INT += %reldir%/test/test_json.cpp
-
-UNIVALUE_TEST_OBJECT_INT =
-UNIVALUE_TEST_OBJECT_INT += %reldir%/test/object.cpp
-
-UNIVALUE_TEST_FILES_INT =
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail1.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail2.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail3.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail4.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail5.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail6.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail7.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail8.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail9.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail10.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail11.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail12.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail13.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail14.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail15.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail16.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail17.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail18.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail19.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail20.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail21.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail22.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail23.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail24.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail25.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail26.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail27.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail28.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail29.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail30.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail31.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail32.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail33.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail34.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail35.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail36.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail37.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail38.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail39.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail40.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail41.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail42.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail44.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/fail45.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/pass1.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/pass2.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/pass3.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/pass4.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round1.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round2.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round3.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round4.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round5.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round6.json
-UNIVALUE_TEST_FILES_INT += %reldir%/test/round7.json
diff --git a/src/univalue/test/.gitignore b/src/univalue/test/.gitignore
deleted file mode 100644
index 5812c96b14..0000000000
--- a/src/univalue/test/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-
-object
-unitester
-test_json
-
-*.trs
-*.log
diff --git a/src/univalue/test/object.cpp b/src/univalue/test/object.cpp
index 1c724555f3..2577c682d7 100644
--- a/src/univalue/test/object.cpp
+++ b/src/univalue/test/object.cpp
@@ -20,17 +20,17 @@
try { \
(stmt); \
assert(0 && "No exception caught"); \
- } catch (excMatch & e) { \
- } catch (...) { \
- assert(0 && "Wrong exception caught"); \
- } \
+ } catch (excMatch&) { \
+ } catch (...) { \
+ assert(0 && "Wrong exception caught"); \
+ } \
}
#define BOOST_CHECK_NO_THROW(stmt) { \
try { \
(stmt); \
- } catch (...) { \
- assert(0); \
- } \
+ } catch (...) { \
+ assert(0); \
+ } \
}
void univalue_constructor()
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
new file mode 100644
index 0000000000..4999dbf13f
--- /dev/null
+++ b/src/util/CMakeLists.txt
@@ -0,0 +1,46 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(bitcoin_util STATIC EXCLUDE_FROM_ALL
+ asmap.cpp
+ batchpriority.cpp
+ bip32.cpp
+ bytevectorhash.cpp
+ chaintype.cpp
+ check.cpp
+ exception.cpp
+ feefrac.cpp
+ fs.cpp
+ fs_helpers.cpp
+ hasher.cpp
+ moneystr.cpp
+ rbf.cpp
+ readwritefile.cpp
+ serfloat.cpp
+ signalinterrupt.cpp
+ sock.cpp
+ strencodings.cpp
+ string.cpp
+ syserror.cpp
+ thread.cpp
+ threadinterrupt.cpp
+ threadnames.cpp
+ time.cpp
+ tokenpipe.cpp
+ ../logging.cpp
+ ../random.cpp
+ ../randomenv.cpp
+ ../streams.cpp
+ ../support/lockedpool.cpp
+ ../sync.cpp
+)
+
+target_link_libraries(bitcoin_util
+ PRIVATE
+ core_interface
+ bitcoin_clientversion
+ bitcoin_crypto
+ $<$<PLATFORM_ID:Windows>:ws2_32>
+ $<$<PLATFORM_ID:Windows>:iphlpapi>
+)
diff --git a/src/util/asmap.cpp b/src/util/asmap.cpp
index f50cd8a28c..04b0673c49 100644
--- a/src/util/asmap.cpp
+++ b/src/util/asmap.cpp
@@ -203,10 +203,10 @@ std::vector<bool> DecodeAsmap(fs::path path)
LogPrintf("Failed to open asmap file from disk\n");
return bits;
}
- fseek(filestr, 0, SEEK_END);
- int length = ftell(filestr);
+ file.seek(0, SEEK_END);
+ int length = file.tell();
LogPrintf("Opened asmap file %s (%d bytes) from disk\n", fs::quoted(fs::PathToString(path)), length);
- fseek(filestr, 0, SEEK_SET);
+ file.seek(0, SEEK_SET);
uint8_t cur_byte;
for (int i = 0; i < length; ++i) {
file >> cur_byte;
diff --git a/src/util/bytevectorhash.cpp b/src/util/bytevectorhash.cpp
index 92f1dbd5d8..79e4a21fe9 100644
--- a/src/util/bytevectorhash.cpp
+++ b/src/util/bytevectorhash.cpp
@@ -9,8 +9,8 @@
#include <vector>
ByteVectorHash::ByteVectorHash() :
- m_k0(GetRand<uint64_t>()),
- m_k1(GetRand<uint64_t>())
+ m_k0(FastRandomContext().rand64()),
+ m_k1(FastRandomContext().rand64())
{
}
diff --git a/src/util/chaintype.cpp b/src/util/chaintype.cpp
index 8a199e352a..272466e7af 100644
--- a/src/util/chaintype.cpp
+++ b/src/util/chaintype.cpp
@@ -15,6 +15,8 @@ std::string ChainTypeToString(ChainType chain)
return "main";
case ChainType::TESTNET:
return "test";
+ case ChainType::TESTNET4:
+ return "testnet4";
case ChainType::SIGNET:
return "signet";
case ChainType::REGTEST:
@@ -29,6 +31,8 @@ std::optional<ChainType> ChainTypeFromString(std::string_view chain)
return ChainType::MAIN;
} else if (chain == "test") {
return ChainType::TESTNET;
+ } else if (chain == "testnet4") {
+ return ChainType::TESTNET4;
} else if (chain == "signet") {
return ChainType::SIGNET;
} else if (chain == "regtest") {
diff --git a/src/util/chaintype.h b/src/util/chaintype.h
index c73985df57..2fe734b64a 100644
--- a/src/util/chaintype.h
+++ b/src/util/chaintype.h
@@ -13,6 +13,7 @@ enum class ChainType {
TESTNET,
SIGNET,
REGTEST,
+ TESTNET4,
};
std::string ChainTypeToString(ChainType chain);
diff --git a/src/util/fs_helpers.cpp b/src/util/fs_helpers.cpp
index 41c8fe3b8f..e01f9a61e9 100644
--- a/src/util/fs_helpers.cpp
+++ b/src/util/fs_helpers.cpp
@@ -22,7 +22,7 @@
#include <utility>
#ifndef WIN32
-// for posix_fallocate, in configure.ac we check if it is present after this
+// for posix_fallocate, in cmake/introspection.cmake we check if it is present after this
#ifdef __linux__
#ifdef _POSIX_C_SOURCE
diff --git a/src/util/hasher.cpp b/src/util/hasher.cpp
index f571725786..3109ba02a8 100644
--- a/src/util/hasher.cpp
+++ b/src/util/hasher.cpp
@@ -7,14 +7,18 @@
#include <span.h>
#include <util/hasher.h>
-SaltedTxidHasher::SaltedTxidHasher() : k0(GetRand<uint64_t>()), k1(GetRand<uint64_t>()) {}
+SaltedTxidHasher::SaltedTxidHasher() :
+ k0{FastRandomContext().rand64()},
+ k1{FastRandomContext().rand64()} {}
SaltedOutpointHasher::SaltedOutpointHasher(bool deterministic) :
- k0(deterministic ? 0x8e819f2607a18de6 : GetRand<uint64_t>()),
- k1(deterministic ? 0xf4020d2e3983b0eb : GetRand<uint64_t>())
+ k0{deterministic ? 0x8e819f2607a18de6 : FastRandomContext().rand64()},
+ k1{deterministic ? 0xf4020d2e3983b0eb : FastRandomContext().rand64()}
{}
-SaltedSipHasher::SaltedSipHasher() : m_k0(GetRand<uint64_t>()), m_k1(GetRand<uint64_t>()) {}
+SaltedSipHasher::SaltedSipHasher() :
+ m_k0{FastRandomContext().rand64()},
+ m_k1{FastRandomContext().rand64()} {}
size_t SaltedSipHasher::operator()(const Span<const unsigned char>& script) const
{
diff --git a/src/util/strencodings.cpp b/src/util/strencodings.cpp
index e030262a32..15cb40aba1 100644
--- a/src/util/strencodings.cpp
+++ b/src/util/strencodings.cpp
@@ -46,16 +46,6 @@ bool IsHex(std::string_view str)
return (str.size() > 0) && (str.size()%2 == 0);
}
-bool IsHexNumber(std::string_view str)
-{
- if (str.substr(0, 2) == "0x") str.remove_prefix(2);
- for (char c : str) {
- if (HexDigit(c) < 0) return false;
- }
- // Return false for empty string or "0x".
- return str.size() > 0;
-}
-
template <typename Byte>
std::optional<std::vector<Byte>> TryParseHex(std::string_view str)
{
diff --git a/src/util/strencodings.h b/src/util/strencodings.h
index e5c2d3ddf2..1543de03ab 100644
--- a/src/util/strencodings.h
+++ b/src/util/strencodings.h
@@ -13,6 +13,8 @@
#include <span.h>
#include <util/string.h>
+#include <array>
+#include <bit>
#include <charconv>
#include <cstddef>
#include <cstdint>
@@ -70,10 +72,6 @@ std::vector<Byte> ParseHex(std::string_view hex_str)
/* Returns true if each character in str is a hex character, and has an even
* number of hex digits.*/
bool IsHex(std::string_view str);
-/**
-* Return true if the string is a hex number, optionally prefixed with "0x"
-*/
-bool IsHexNumber(std::string_view str);
std::optional<std::vector<unsigned char>> DecodeBase64(std::string_view str);
std::string EncodeBase64(Span<const unsigned char> input);
inline std::string EncodeBase64(Span<const std::byte> input) { return EncodeBase64(MakeUCharSpan(input)); }
@@ -369,4 +367,79 @@ std::string Capitalize(std::string str);
*/
std::optional<uint64_t> ParseByteUnits(std::string_view str, ByteUnit default_multiplier);
+namespace util {
+/** consteval version of HexDigit() without the lookup table. */
+consteval uint8_t ConstevalHexDigit(const char c)
+{
+ if (c >= '0' && c <= '9') return c - '0';
+ if (c >= 'a' && c <= 'f') return c - 'a' + 0xa;
+
+ throw "Only lowercase hex digits are allowed, for consistency";
+}
+
+/**
+ * ""_hex is a compile-time user-defined literal returning a
+ * `std::array<std::byte>`, equivalent to ParseHex(). Variants provided:
+ *
+ * - ""_hex_v: Returns `std::vector<std::byte>`, useful for heap allocation or
+ * variable-length serialization.
+ *
+ * - ""_hex_u8: Returns `std::array<uint8_t>`, for cases where `std::byte` is
+ * incompatible.
+ *
+ * - ""_hex_v_u8: Returns `std::vector<uint8_t>`, combining heap allocation with
+ * `uint8_t`.
+ *
+ * @warning It could be necessary to use vector instead of array variants when
+ * serializing, or vice versa, because vectors are assumed to be variable-
+ * length and serialized with a size prefix, while arrays are considered fixed
+ * length and serialized with no prefix.
+ *
+ * @warning It may be preferable to use vector variants to save stack space when
+ * declaring local variables if hex strings are large. Alternatively variables
+ * could be declared constexpr to avoid using stack space.
+ *
+ * @warning Avoid `uint8_t` variants when not necessary, as the codebase
+ * migrates to use `std::byte` instead of `unsigned char` and `uint8_t`.
+ *
+ * @note One reason ""_hex uses `std::array` instead of `std::vector` like
+ * ParseHex() does is because heap-based containers cannot cross the compile-
+ * time/runtime barrier.
+ */
+inline namespace hex_literals {
+namespace detail {
+
+template <size_t N>
+struct Hex {
+ std::array<std::byte, N / 2> bytes{};
+ consteval Hex(const char (&hex_str)[N])
+ // 2 hex digits required per byte + implicit null terminator
+ requires(N % 2 == 1)
+ {
+ if (hex_str[N - 1]) throw "null terminator required";
+ for (std::size_t i = 0; i < bytes.size(); ++i) {
+ bytes[i] = static_cast<std::byte>(
+ (ConstevalHexDigit(hex_str[2 * i]) << 4) |
+ ConstevalHexDigit(hex_str[2 * i + 1]));
+ }
+ }
+};
+
+} // namespace detail
+
+template <util::detail::Hex str>
+constexpr auto operator""_hex() { return str.bytes; }
+
+template <util::detail::Hex str>
+constexpr auto operator""_hex_u8() { return std::bit_cast<std::array<uint8_t, str.bytes.size()>>(str.bytes); }
+
+template <util::detail::Hex str>
+constexpr auto operator""_hex_v() { return std::vector<std::byte>{str.bytes.begin(), str.bytes.end()}; }
+
+template <util::detail::Hex str>
+inline auto operator""_hex_v_u8() { return std::vector<uint8_t>{UCharCast(str.bytes.data()), UCharCast(str.bytes.data() + str.bytes.size())}; }
+
+} // inline namespace hex_literals
+} // namespace util
+
#endif // BITCOIN_UTIL_STRENCODINGS_H
diff --git a/src/util/string.h b/src/util/string.h
index e2e470f4ab..c5183d6c80 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2019-2022 The Bitcoin Core developers
+// Copyright (c) 2019-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.
@@ -6,6 +6,7 @@
#define BITCOIN_UTIL_STRING_H
#include <span.h>
+#include <tinyformat.h>
#include <array>
#include <cstdint>
@@ -17,6 +18,67 @@
#include <vector>
namespace util {
+/**
+ * @brief A wrapper for a compile-time partially validated format string
+ *
+ * This struct can be used to enforce partial compile-time validation of format
+ * strings, to reduce the likelihood of tinyformat throwing exceptions at
+ * run-time. Validation is partial to try and prevent the most common errors
+ * while avoiding re-implementing the entire parsing logic.
+ *
+ * @note Counting of `*` dynamic width and precision fields (such as `%*c`,
+ * `%2$*3$d`, `%.*f`) is not implemented to minimize code complexity as long as
+ * they are not used in the codebase. Usage of these fields is not counted and
+ * can lead to run-time exceptions. Code wanting to use the `*` specifier can
+ * side-step this struct and call tinyformat directly.
+ */
+template <unsigned num_params>
+struct ConstevalFormatString {
+ const char* const fmt;
+ consteval ConstevalFormatString(const char* str) : fmt{str} { Detail_CheckNumFormatSpecifiers(fmt); }
+ constexpr static void Detail_CheckNumFormatSpecifiers(std::string_view str)
+ {
+ unsigned count_normal{0}; // Number of "normal" specifiers, like %s
+ unsigned count_pos{0}; // Max number in positional specifier, like %8$s
+ for (auto it{str.begin()}; it < str.end();) {
+ if (*it != '%') {
+ ++it;
+ continue;
+ }
+
+ if (++it >= str.end()) throw "Format specifier incorrectly terminated by end of string";
+ if (*it == '%') {
+ // Percent escape: %%
+ ++it;
+ continue;
+ }
+
+ unsigned maybe_num{0};
+ while ('0' <= *it && *it <= '9') {
+ maybe_num *= 10;
+ maybe_num += *it - '0';
+ ++it;
+ };
+
+ if (*it == '$') {
+ // Positional specifier, like %8$s
+ if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
+ count_pos = std::max(count_pos, maybe_num);
+ if (++it >= str.end()) throw "Format specifier incorrectly terminated by end of string";
+ } else {
+ // Non-positional specifier, like %s
+ ++count_normal;
+ ++it;
+ }
+ // The remainder "[flags][width][.precision][length]type" of the
+ // specifier is not checked. Parsing continues with the next '%'.
+ }
+ if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
+ unsigned count{count_normal | count_pos};
+ if (num_params != count) throw "Format specifier count must match the argument count!";
+ }
+};
+
void ReplaceAll(std::string& in_out, const std::string& search, const std::string& substitute);
/** Split a string on any char found in separators, returning a vector.
@@ -81,6 +143,14 @@ std::vector<T> Split(const Span<const char>& sp, char sep)
return std::string(TrimStringView(str, pattern));
}
+[[nodiscard]] inline std::string_view RemoveSuffixView(std::string_view str, std::string_view suffix)
+{
+ if (str.ends_with(suffix)) {
+ return str.substr(0, str.size() - suffix.size());
+ }
+ return str;
+}
+
[[nodiscard]] inline std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
{
if (str.substr(0, prefix.size()) == prefix) {
@@ -165,4 +235,12 @@ template <typename T1, size_t PREFIX_LEN>
}
} // namespace util
+namespace tinyformat {
+template <typename... Args>
+std::string format(util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args)
+{
+ return format(fmt.fmt, args...);
+}
+} // namespace tinyformat
+
#endif // BITCOIN_UTIL_STRING_H
diff --git a/src/util/subprocess.h b/src/util/subprocess.h
index e76ced687c..3449fa3b1b 100644
--- a/src/util/subprocess.h
+++ b/src/util/subprocess.h
@@ -678,7 +678,7 @@ struct error
class Buffer
{
public:
- Buffer() {}
+ Buffer() = default;
explicit Buffer(size_t cap) { buf.resize(cap); }
void add_cap(size_t cap) { buf.resize(cap); }
diff --git a/src/util/task_runner.h b/src/util/task_runner.h
index d3cd8007de..951381823b 100644
--- a/src/util/task_runner.h
+++ b/src/util/task_runner.h
@@ -19,7 +19,7 @@ namespace util {
class TaskRunnerInterface
{
public:
- virtual ~TaskRunnerInterface() {}
+ virtual ~TaskRunnerInterface() = default;
/**
* The callback can either be queued for later/asynchronous/threaded
diff --git a/src/util/transaction_identifier.h b/src/util/transaction_identifier.h
index d4a0ede25a..81b053843d 100644
--- a/src/util/transaction_identifier.h
+++ b/src/util/transaction_identifier.h
@@ -42,6 +42,12 @@ public:
/** Wrapped `uint256` methods. */
constexpr bool IsNull() const { return m_wrapped.IsNull(); }
constexpr void SetNull() { m_wrapped.SetNull(); }
+ static std::optional<transaction_identifier> FromHex(std::string_view hex)
+ {
+ auto u{uint256::FromHex(hex)};
+ if (!u) return std::nullopt;
+ return FromUint256(*u);
+ }
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(); }
@@ -66,9 +72,4 @@ using Txid = transaction_identifier<false>;
/** Wtxid commits to all transaction fields including the witness. */
using Wtxid = transaction_identifier<true>;
-inline Txid TxidFromString(std::string_view str)
-{
- return Txid::FromUint256(uint256S(str.data()));
-}
-
#endif // BITCOIN_UTIL_TRANSACTION_IDENTIFIER_H
diff --git a/src/util/translation.h b/src/util/translation.h
index d33fd2d0a0..6effe102f9 100644
--- a/src/util/translation.h
+++ b/src/util/translation.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2019-2022 The Bitcoin Core developers
+// Copyright (c) 2019-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.
@@ -67,13 +67,19 @@ bilingual_str format(const bilingual_str& fmt, const Args&... args)
/** Translate a message to the native language of the user. */
const extern std::function<std::string(const char*)> G_TRANSLATION_FUN;
+struct ConstevalStringLiteral {
+ const char* const lit;
+ consteval ConstevalStringLiteral(const char* str) : lit{str} {}
+ consteval ConstevalStringLiteral(std::nullptr_t) = delete;
+};
+
/**
* Translation function.
* If no translation function is set, simply return the input.
*/
-inline bilingual_str _(const char* psz)
+inline bilingual_str _(ConstevalStringLiteral str)
{
- return bilingual_str{psz, G_TRANSLATION_FUN ? (G_TRANSLATION_FUN)(psz) : psz};
+ return bilingual_str{str.lit, G_TRANSLATION_FUN ? (G_TRANSLATION_FUN)(str.lit) : str.lit};
}
#endif // BITCOIN_UTIL_TRANSLATION_H
diff --git a/src/validation.cpp b/src/validation.cpp
index 3e9ba08bb1..5da3387ad2 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -1,5 +1,5 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
-// 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.
@@ -35,12 +35,11 @@
#include <policy/policy.h>
#include <policy/rbf.h>
#include <policy/settings.h>
-#include <policy/v3_policy.h>
+#include <policy/truc_policy.h>
#include <pow.h>
#include <primitives/block.h>
#include <primitives/transaction.h>
#include <random.h>
-#include <reverse_iterator.h>
#include <script/script.h>
#include <script/sigcache.h>
#include <signet.h>
@@ -70,6 +69,8 @@
#include <deque>
#include <numeric>
#include <optional>
+#include <ranges>
+#include <span>
#include <string>
#include <tuple>
#include <utility>
@@ -107,10 +108,6 @@ const std::vector<std::string> CHECKLEVEL_DOC {
* */
static constexpr int PRUNE_LOCK_BUFFER{10};
-GlobalMutex g_best_block_mutex;
-std::condition_variable g_best_block_cv;
-uint256 g_best_block;
-
const CBlockIndex* Chainstate::FindForkInGlobalIndex(const CBlockLocator& locator) const
{
AssertLockHeld(cs_main);
@@ -134,6 +131,7 @@ const CBlockIndex* Chainstate::FindForkInGlobalIndex(const CBlockLocator& locato
bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
const CCoinsViewCache& inputs, unsigned int flags, bool cacheSigStore,
bool cacheFullScriptStore, PrecomputedTransactionData& txdata,
+ ValidationCache& validation_cache,
std::vector<CScriptCheck>* pvChecks = nullptr)
EXCLUSIVE_LOCKS_REQUIRED(cs_main);
@@ -268,7 +266,7 @@ static void LimitMempoolSize(CTxMemPool& pool, CCoinsViewCache& coins_cache)
AssertLockHeld(pool.cs);
int expired = pool.Expire(GetTime<std::chrono::seconds>() - pool.m_opts.expiry);
if (expired != 0) {
- LogPrint(BCLog::MEMPOOL, "Expired %i transactions from the memory pool\n", expired);
+ LogDebug(BCLog::MEMPOOL, "Expired %i transactions from the memory pool\n", expired);
}
std::vector<COutPoint> vNoSpendsRemaining;
@@ -336,7 +334,7 @@ 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.
- // Note that v3 rules are not applied here, so reorgs may cause violations of v3 inheritance or
+ // Note that TRUC rules are not applied here, so reorgs may cause violations of TRUC inheritance or
// topology restrictions.
const auto filter_final_and_mature = [&](CTxMemPool::txiter it)
EXCLUSIVE_LOCKS_REQUIRED(m_mempool->cs, ::cs_main) {
@@ -394,7 +392,8 @@ void Chainstate::MaybeUpdateMempoolForReorg(
* */
static bool CheckInputsFromMempoolAndCache(const CTransaction& tx, TxValidationState& state,
const CCoinsViewCache& view, const CTxMemPool& pool,
- unsigned int flags, PrecomputedTransactionData& txdata, CCoinsViewCache& coins_tip)
+ unsigned int flags, PrecomputedTransactionData& txdata, CCoinsViewCache& coins_tip,
+ ValidationCache& validation_cache)
EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
{
AssertLockHeld(cs_main);
@@ -426,7 +425,7 @@ static bool CheckInputsFromMempoolAndCache(const CTransaction& tx, TxValidationS
}
// Call CheckInputScripts() to cache signature and script validity against current tip consensus rules.
- return CheckInputScripts(tx, state, view, flags, /* cacheSigStore= */ true, /* cacheFullScriptStore= */ true, txdata);
+ return CheckInputScripts(tx, state, view, flags, /* cacheSigStore= */ true, /* cacheFullScriptStore= */ true, txdata, validation_cache);
}
namespace {
@@ -716,6 +715,11 @@ private:
return true;
}
+ ValidationCache& GetValidationCache()
+ {
+ return m_active_chainstate.m_chainman.m_validation_cache;
+ }
+
private:
CTxMemPool& m_pool;
CCoinsViewCache m_view;
@@ -829,7 +833,7 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
// check all unconfirmed ancestors; otherwise an opt-in ancestor
// might be replaced, causing removal of this descendant.
//
- // All V3 transactions are considered replaceable.
+ // All TRUC transactions are considered replaceable.
//
// Replaceability signaling of the original transactions may be
// ignored due to node setting.
@@ -936,7 +940,7 @@ 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.
- // The only exception is v3 transactions.
+ // The only exception is TRUC transactions.
if (!bypass_limits && ws.m_ptx->version != TRUC_VERSION && ws.m_modified_fees < m_pool.m_opts.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.
@@ -1005,7 +1009,7 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
// If the new transaction is relatively small (up to 40k weight)
// and has at most one ancestor (ie ancestor limit of 2, including
// the new transaction), allow it if its parent has exactly the
- // descendant limit descendants. The transaction also cannot be v3,
+ // descendant limit descendants. The transaction also cannot be TRUC,
// as its topology restrictions do not allow a second child.
//
// This allows protocols which rely on distrusting counterparties
@@ -1032,7 +1036,7 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
// Even though just checking direct mempool parents for inheritance would be sufficient, we
// check using the full ancestor set here because it's more convenient to use what we have
// already calculated.
- if (const auto err{SingleV3Checks(ws.m_ptx, ws.m_ancestors, ws.m_conflicts, ws.m_vsize)}) {
+ if (const auto err{SingleTRUCChecks(ws.m_ptx, ws.m_ancestors, ws.m_conflicts, ws.m_vsize)}) {
// Single transaction contexts only.
if (args.m_allow_sibling_eviction && err->second != nullptr) {
// We should only be considering where replacement is considered valid as well.
@@ -1043,15 +1047,15 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
ws.m_conflicts.insert(err->second->GetHash());
// Adding the sibling to m_iters_conflicting here means that it doesn't count towards
// RBF Carve Out above. This is correct, since removing to-be-replaced transactions from
- // the descendant count is done separately in SingleV3Checks for v3 transactions.
+ // the descendant count is done separately in SingleTRUCChecks for TRUC transactions.
ws.m_iters_conflicting.insert(m_pool.GetIter(err->second->GetHash()).value());
ws.m_sibling_eviction = true;
// The sibling will be treated as part of the to-be-replaced set in ReplacementChecks.
- // Note that we are not checking whether it opts in to replaceability via BIP125 or v3
- // (which is normally done in PreChecks). However, the only way a v3 transaction can
- // have a non-v3 and non-BIP125 descendant is due to a reorg.
+ // Note that we are not checking whether it opts in to replaceability via BIP125 or TRUC
+ // (which is normally done in PreChecks). However, the only way a TRUC transaction can
+ // have a non-TRUC and non-BIP125 descendant is due to a reorg.
} else {
- return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "v3-rule-violation", err->first);
+ return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "TRUC-violation", err->first);
}
}
@@ -1103,7 +1107,7 @@ bool MemPoolAccept::ReplacementChecks(Workspace& ws)
}
// Enforce Rule #2.
if (const auto err_string{HasNoNewUnconfirmed(tx, m_pool, m_subpackage.m_all_conflicts)}) {
- // Sibling eviction is only done for v3 transactions, which cannot have multiple ancestors.
+ // Sibling eviction is only done for TRUC transactions, which cannot have multiple ancestors.
Assume(!ws.m_sibling_eviction);
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY,
strprintf("replacement-adds-unconfirmed%s", ws.m_sibling_eviction ? " (including sibling eviction)" : ""), *err_string);
@@ -1201,7 +1205,7 @@ bool MemPoolAccept::PackageMempoolChecks(const std::vector<CTransactionRef>& txn
const CFeeRate package_feerate(m_subpackage.m_total_modified_fees, m_subpackage.m_total_vsize);
if (package_feerate <= parent_feerate) {
return package_state.Invalid(PackageValidationResult::PCKG_POLICY,
- "package RBF failed: package feerate is less than parent feerate",
+ "package RBF failed: package feerate is less than or equal to parent feerate",
strprintf("package feerate %s <= parent feerate is %s", package_feerate.ToString(), parent_feerate.ToString()));
}
@@ -1212,7 +1216,7 @@ bool MemPoolAccept::PackageMempoolChecks(const std::vector<CTransactionRef>& txn
"package RBF failed: " + err_tup.value().second, "");
}
- LogPrint(BCLog::TXPACKAGES, "package RBF checks passed: parent %s (wtxid=%s), child %s (wtxid=%s)\n",
+ LogDebug(BCLog::TXPACKAGES, "package RBF checks passed: parent %s (wtxid=%s), child %s (wtxid=%s)\n",
txns.front()->GetHash().ToString(), txns.front()->GetWitnessHash().ToString(),
txns.back()->GetHash().ToString(), txns.back()->GetWitnessHash().ToString());
@@ -1231,13 +1235,13 @@ bool MemPoolAccept::PolicyScriptChecks(const ATMPArgs& args, Workspace& ws)
// Check input scripts and signatures.
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
- if (!CheckInputScripts(tx, state, m_view, scriptVerifyFlags, true, false, ws.m_precomputed_txdata)) {
+ if (!CheckInputScripts(tx, state, m_view, scriptVerifyFlags, true, false, ws.m_precomputed_txdata, GetValidationCache())) {
// SCRIPT_VERIFY_CLEANSTACK requires SCRIPT_VERIFY_WITNESS, so we
// need to turn both off, and compare against just turning off CLEANSTACK
// to see if the failure is specifically due to witness validation.
TxValidationState state_dummy; // Want reported failures to be from first CheckInputScripts
- if (!tx.HasWitness() && CheckInputScripts(tx, state_dummy, m_view, scriptVerifyFlags & ~(SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_CLEANSTACK), true, false, ws.m_precomputed_txdata) &&
- !CheckInputScripts(tx, state_dummy, m_view, scriptVerifyFlags & ~SCRIPT_VERIFY_CLEANSTACK, true, false, ws.m_precomputed_txdata)) {
+ if (!tx.HasWitness() && CheckInputScripts(tx, state_dummy, m_view, scriptVerifyFlags & ~(SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_CLEANSTACK), true, false, ws.m_precomputed_txdata, GetValidationCache()) &&
+ !CheckInputScripts(tx, state_dummy, m_view, scriptVerifyFlags & ~SCRIPT_VERIFY_CLEANSTACK, true, false, ws.m_precomputed_txdata, GetValidationCache())) {
// Only the witness is missing, so the transaction itself may be fine.
state.Invalid(TxValidationResult::TX_WITNESS_STRIPPED,
state.GetRejectReason(), state.GetDebugMessage());
@@ -1273,7 +1277,7 @@ bool MemPoolAccept::ConsensusScriptChecks(const ATMPArgs& args, Workspace& ws)
// transactions into the mempool can be exploited as a DoS attack.
unsigned int currentBlockScriptVerifyFlags{GetBlockScriptFlags(*m_active_chainstate.m_chain.Tip(), m_active_chainstate.m_chainman)};
if (!CheckInputsFromMempoolAndCache(tx, state, m_view, m_pool, currentBlockScriptVerifyFlags,
- ws.m_precomputed_txdata, m_active_chainstate.CoinsTip())) {
+ ws.m_precomputed_txdata, m_active_chainstate.CoinsTip(), GetValidationCache())) {
LogPrintf("BUG! PLEASE REPORT THIS! CheckInputScripts failed against latest-block but not STANDARD flags %s, %s\n", hash.ToString(), state.ToString());
return Assume(false);
}
@@ -1295,7 +1299,7 @@ bool MemPoolAccept::Finalize(const ATMPArgs& args, Workspace& ws)
// Remove conflicting transactions from the mempool
for (CTxMemPool::txiter it : m_subpackage.m_all_conflicts)
{
- LogPrint(BCLog::MEMPOOL, "replacing mempool tx %s (wtxid=%s, fees=%s, vsize=%s). New tx %s (wtxid=%s, fees=%s, vsize=%s)\n",
+ LogDebug(BCLog::MEMPOOL, "replacing mempool tx %s (wtxid=%s, fees=%s, vsize=%s). New tx %s (wtxid=%s, fees=%s, vsize=%s)\n",
it->GetTx().GetHash().ToString(),
it->GetTx().GetWitnessHash().ToString(),
it->GetFee(),
@@ -1398,7 +1402,7 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
[](const auto& ws) { return ws.m_ptx->GetWitnessHash(); });
if (!m_subpackage.m_replaced_transactions.empty()) {
- LogPrint(BCLog::MEMPOOL, "replaced %u mempool transactions with %u new one(s) for %s additional fees, %d delta bytes\n",
+ LogDebug(BCLog::MEMPOOL, "replaced %u mempool transactions with %u new one(s) for %s additional fees, %d delta bytes\n",
m_subpackage.m_replaced_transactions.size(), workspaces.size(),
m_subpackage.m_total_modified_fees - m_subpackage.m_conflicting_fees,
m_subpackage.m_total_vsize - static_cast<int>(m_subpackage.m_conflicting_size));
@@ -1486,7 +1490,7 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
}
if (!m_subpackage.m_replaced_transactions.empty()) {
- LogPrint(BCLog::MEMPOOL, "replaced %u mempool transactions with 1 new transaction for %s additional fees, %d delta bytes\n",
+ LogDebug(BCLog::MEMPOOL, "replaced %u mempool transactions with 1 new transaction for %s additional fees, %d delta bytes\n",
m_subpackage.m_replaced_transactions.size(),
ws.m_modified_fees - m_subpackage.m_conflicting_fees,
ws.m_vsize - static_cast<int>(m_subpackage.m_conflicting_size));
@@ -1545,10 +1549,10 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(const std::
}
// At this point we have all in-mempool ancestors, and we know every transaction's vsize.
- // Run the v3 checks on the package.
+ // Run the TRUC 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());
+ if (auto err{PackageTRUCChecks(ws.m_ptx, ws.m_vsize, txns, ws.m_ancestors)}) {
+ package_state.Invalid(PackageValidationResult::PCKG_POLICY, "TRUC-violation", err.value());
return PackageMempoolAcceptResult(package_state, {});
}
}
@@ -2016,7 +2020,8 @@ void Chainstate::CheckForkWarningConditions()
// Before we get past initial download, we cannot reliably alert about forks
// (we assume we don't get stuck on a fork before finishing our initial sync)
- if (m_chainman.IsInitialBlockDownload()) {
+ // Also not applicable to the background chainstate
+ if (m_chainman.IsInitialBlockDownload() || this->GetRole() == ChainstateRole::BACKGROUND) {
return;
}
@@ -2084,29 +2089,23 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, CTxUndo &txund
bool CScriptCheck::operator()() {
const CScript &scriptSig = ptxTo->vin[nIn].scriptSig;
const CScriptWitness *witness = &ptxTo->vin[nIn].scriptWitness;
- return VerifyScript(scriptSig, m_tx_out.scriptPubKey, witness, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, m_tx_out.nValue, cacheStore, *txdata), &error);
+ return VerifyScript(scriptSig, m_tx_out.scriptPubKey, witness, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, m_tx_out.nValue, cacheStore, *m_signature_cache, *txdata), &error);
}
-static CuckooCache::cache<uint256, SignatureCacheHasher> g_scriptExecutionCache;
-static CSHA256 g_scriptExecutionCacheHasher;
-
-bool InitScriptExecutionCache(size_t max_size_bytes)
+ValidationCache::ValidationCache(const size_t script_execution_cache_bytes, const size_t signature_cache_bytes)
+ : m_signature_cache{signature_cache_bytes}
{
// Setup the salted hasher
uint256 nonce = GetRandHash();
// We want the nonce to be 64 bytes long to force the hasher to process
// this chunk, which makes later hash computations more efficient. We
// just write our 32-byte entropy twice to fill the 64 bytes.
- g_scriptExecutionCacheHasher.Write(nonce.begin(), 32);
- g_scriptExecutionCacheHasher.Write(nonce.begin(), 32);
-
- auto setup_results = g_scriptExecutionCache.setup_bytes(max_size_bytes);
- if (!setup_results) return false;
+ m_script_execution_cache_hasher.Write(nonce.begin(), 32);
+ m_script_execution_cache_hasher.Write(nonce.begin(), 32);
- const auto [num_elems, approx_size_bytes] = *setup_results;
+ const auto [num_elems, approx_size_bytes] = m_script_execution_cache.setup_bytes(script_execution_cache_bytes);
LogPrintf("Using %zu MiB out of %zu MiB requested for script execution cache, able to store %zu elements\n",
- approx_size_bytes >> 20, max_size_bytes >> 20, num_elems);
- return true;
+ approx_size_bytes >> 20, script_execution_cache_bytes >> 20, num_elems);
}
/**
@@ -2126,11 +2125,12 @@ bool InitScriptExecutionCache(size_t max_size_bytes)
* Note that we may set state.reason to NOT_STANDARD for extra soft-fork flags in flags, block-checking
* callers should probably reset it to CONSENSUS in such cases.
*
- * Non-static (and re-declared) in src/test/txvalidationcache_tests.cpp
+ * Non-static (and redeclared) in src/test/txvalidationcache_tests.cpp
*/
bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
const CCoinsViewCache& inputs, unsigned int flags, bool cacheSigStore,
bool cacheFullScriptStore, PrecomputedTransactionData& txdata,
+ ValidationCache& validation_cache,
std::vector<CScriptCheck>* pvChecks)
{
if (tx.IsCoinBase()) return true;
@@ -2145,10 +2145,10 @@ bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
// properly commits to the scriptPubKey in the inputs view of that
// transaction).
uint256 hashCacheEntry;
- CSHA256 hasher = g_scriptExecutionCacheHasher;
+ CSHA256 hasher = validation_cache.ScriptExecutionCacheHasher();
hasher.Write(UCharCast(tx.GetWitnessHash().begin()), 32).Write((unsigned char*)&flags, sizeof(flags)).Finalize(hashCacheEntry.begin());
AssertLockHeld(cs_main); //TODO: Remove this requirement by making CuckooCache not require external locks
- if (g_scriptExecutionCache.contains(hashCacheEntry, !cacheFullScriptStore)) {
+ if (validation_cache.m_script_execution_cache.contains(hashCacheEntry, !cacheFullScriptStore)) {
return true;
}
@@ -2175,7 +2175,7 @@ bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
// spent being checked as a part of CScriptCheck.
// Verify signature
- CScriptCheck check(txdata.m_spent_outputs[i], tx, i, flags, cacheSigStore, &txdata);
+ CScriptCheck check(txdata.m_spent_outputs[i], tx, validation_cache.m_signature_cache, i, flags, cacheSigStore, &txdata);
if (pvChecks) {
pvChecks->emplace_back(std::move(check));
} else if (!check()) {
@@ -2188,7 +2188,7 @@ bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
// splitting the network between upgraded and
// non-upgraded nodes by banning CONSENSUS-failing
// data providers.
- CScriptCheck check2(txdata.m_spent_outputs[i], tx, i,
+ CScriptCheck check2(txdata.m_spent_outputs[i], tx, validation_cache.m_signature_cache, i,
flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheSigStore, &txdata);
if (check2())
return state.Invalid(TxValidationResult::TX_NOT_STANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(check.GetScriptError())));
@@ -2209,7 +2209,7 @@ bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
if (cacheFullScriptStore && !pvChecks) {
// We executed all of the provided scripts, and were told to
// cache the result. Do so now.
- g_scriptExecutionCache.insert(hashCacheEntry);
+ validation_cache.m_script_execution_cache.insert(hashCacheEntry);
}
return true;
@@ -2280,8 +2280,8 @@ DisconnectResult Chainstate::DisconnectBlock(const CBlock& block, const CBlockIn
// Note: the blocks specified here are different than the ones used in ConnectBlock because DisconnectBlock
// unwinds the blocks in reverse. As a result, the inconsistency is not discovered until the earlier
// blocks with the duplicate coinbase transactions are disconnected.
- bool fEnforceBIP30 = !((pindex->nHeight==91722 && pindex->GetBlockHash() == uint256S("0x00000000000271a2dc26e7667f8419f2e15416dc6955e5a6c6cdf3f2574dd08e")) ||
- (pindex->nHeight==91812 && pindex->GetBlockHash() == uint256S("0x00000000000af0aed4792b1acee3d966af36cf5def14935db8de83d6f9306f2f")));
+ bool fEnforceBIP30 = !((pindex->nHeight==91722 && pindex->GetBlockHash() == uint256{"00000000000271a2dc26e7667f8419f2e15416dc6955e5a6c6cdf3f2574dd08e"}) ||
+ (pindex->nHeight==91812 && pindex->GetBlockHash() == uint256{"00000000000af0aed4792b1acee3d966af36cf5def14935db8de83d6f9306f2f"}));
// undo transactions in reverse order
for (int i = block.vtx.size() - 1; i >= 0; i--) {
@@ -2397,15 +2397,6 @@ static unsigned int GetBlockScriptFlags(const CBlockIndex& block_index, const Ch
}
-static SteadyClock::duration time_check{};
-static SteadyClock::duration time_forks{};
-static SteadyClock::duration time_connect{};
-static SteadyClock::duration time_verify{};
-static SteadyClock::duration time_undo{};
-static SteadyClock::duration time_index{};
-static SteadyClock::duration time_total{};
-static int64_t num_blocks_total = 0;
-
/** Apply the effects of this block (with given index) on the UTXO set represented by coins.
* Validity checks that depend on the UTXO set are also done; ConnectBlock()
* can fail if those validity checks fail (among other reasons). */
@@ -2450,7 +2441,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
uint256 hashPrevBlock = pindex->pprev == nullptr ? uint256() : pindex->pprev->GetBlockHash();
assert(hashPrevBlock == view.GetBestBlock());
- num_blocks_total++;
+ m_chainman.num_blocks_total++;
// Special case for the genesis block, skipping connection of its transactions
// (its coinbase is unspendable)
@@ -2492,11 +2483,11 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
}
const auto time_1{SteadyClock::now()};
- time_check += time_1 - time_start;
- LogPrint(BCLog::BENCH, " - Sanity checks: %.2fms [%.2fs (%.2fms/blk)]\n",
+ m_chainman.time_check += time_1 - time_start;
+ LogDebug(BCLog::BENCH, " - Sanity checks: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_1 - time_start),
- Ticks<SecondsDouble>(time_check),
- Ticks<MillisecondsDouble>(time_check) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_check),
+ Ticks<MillisecondsDouble>(m_chainman.time_check) / m_chainman.num_blocks_total);
// Do not allow blocks that contain transactions which 'overwrite' older transactions,
// unless those are already completely spent.
@@ -2594,11 +2585,11 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
unsigned int flags{GetBlockScriptFlags(*pindex, m_chainman)};
const auto time_2{SteadyClock::now()};
- time_forks += time_2 - time_1;
- LogPrint(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs (%.2fms/blk)]\n",
+ m_chainman.time_forks += time_2 - time_1;
+ LogDebug(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_2 - time_1),
- Ticks<SecondsDouble>(time_forks),
- Ticks<MillisecondsDouble>(time_forks) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_forks),
+ Ticks<MillisecondsDouble>(m_chainman.time_forks) / m_chainman.num_blocks_total);
CBlockUndo blockundo;
@@ -2667,7 +2658,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
std::vector<CScriptCheck> vChecks;
bool fCacheResults = fJustCheck; /* Don't cache results if we're actually connecting blocks (still consult the cache, though) */
TxValidationState tx_state;
- if (fScriptChecks && !CheckInputScripts(tx, tx_state, view, flags, fCacheResults, fCacheResults, txsdata[i], parallel_script_checks ? &vChecks : nullptr)) {
+ if (fScriptChecks && !CheckInputScripts(tx, tx_state, view, flags, fCacheResults, fCacheResults, txsdata[i], m_chainman.m_validation_cache, parallel_script_checks ? &vChecks : nullptr)) {
// Any transaction validation failure in ConnectBlock is a block consensus failure
state.Invalid(BlockValidationResult::BLOCK_CONSENSUS,
tx_state.GetRejectReason(), tx_state.GetDebugMessage());
@@ -2685,12 +2676,12 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight);
}
const auto time_3{SteadyClock::now()};
- time_connect += time_3 - time_2;
- LogPrint(BCLog::BENCH, " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs (%.2fms/blk)]\n", (unsigned)block.vtx.size(),
+ m_chainman.time_connect += time_3 - time_2;
+ LogDebug(BCLog::BENCH, " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs (%.2fms/blk)]\n", (unsigned)block.vtx.size(),
Ticks<MillisecondsDouble>(time_3 - time_2), Ticks<MillisecondsDouble>(time_3 - time_2) / block.vtx.size(),
nInputs <= 1 ? 0 : Ticks<MillisecondsDouble>(time_3 - time_2) / (nInputs - 1),
- Ticks<SecondsDouble>(time_connect),
- Ticks<MillisecondsDouble>(time_connect) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_connect),
+ Ticks<MillisecondsDouble>(m_chainman.time_connect) / m_chainman.num_blocks_total);
CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, params.GetConsensus());
if (block.vtx[0]->GetValueOut() > blockReward) {
@@ -2703,12 +2694,12 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "block-validation-failed");
}
const auto time_4{SteadyClock::now()};
- time_verify += time_4 - time_2;
- LogPrint(BCLog::BENCH, " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs (%.2fms/blk)]\n", nInputs - 1,
+ m_chainman.time_verify += time_4 - time_2;
+ LogDebug(BCLog::BENCH, " - Verify %u txins: %.2fms (%.3fms/txin) [%.2fs (%.2fms/blk)]\n", nInputs - 1,
Ticks<MillisecondsDouble>(time_4 - time_2),
nInputs <= 1 ? 0 : Ticks<MillisecondsDouble>(time_4 - time_2) / (nInputs - 1),
- Ticks<SecondsDouble>(time_verify),
- Ticks<MillisecondsDouble>(time_verify) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_verify),
+ Ticks<MillisecondsDouble>(m_chainman.time_verify) / m_chainman.num_blocks_total);
if (fJustCheck)
return true;
@@ -2718,11 +2709,11 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
}
const auto time_5{SteadyClock::now()};
- time_undo += time_5 - time_4;
- LogPrint(BCLog::BENCH, " - Write undo data: %.2fms [%.2fs (%.2fms/blk)]\n",
+ m_chainman.time_undo += time_5 - time_4;
+ LogDebug(BCLog::BENCH, " - Write undo data: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_5 - time_4),
- Ticks<SecondsDouble>(time_undo),
- Ticks<MillisecondsDouble>(time_undo) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_undo),
+ Ticks<MillisecondsDouble>(m_chainman.time_undo) / m_chainman.num_blocks_total);
if (!pindex->IsValid(BLOCK_VALID_SCRIPTS)) {
pindex->RaiseValidity(BLOCK_VALID_SCRIPTS);
@@ -2733,11 +2724,11 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
view.SetBestBlock(pindex->GetBlockHash());
const auto time_6{SteadyClock::now()};
- time_index += time_6 - time_5;
- LogPrint(BCLog::BENCH, " - Index writing: %.2fms [%.2fs (%.2fms/blk)]\n",
+ m_chainman.time_index += time_6 - time_5;
+ LogDebug(BCLog::BENCH, " - Index writing: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_6 - time_5),
- Ticks<SecondsDouble>(time_index),
- Ticks<MillisecondsDouble>(time_index) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_index),
+ Ticks<MillisecondsDouble>(m_chainman.time_index) / m_chainman.num_blocks_total);
TRACE6(validation, block_connected,
block_hash.data(),
@@ -2820,7 +2811,7 @@ bool Chainstate::FlushStateToDisk(
}
if (limiting_lock) {
- LogPrint(BCLog::PRUNE, "%s limited pruning to height %d\n", limiting_lock.value(), last_prune);
+ LogDebug(BCLog::PRUNE, "%s limited pruning to height %d\n", limiting_lock.value(), last_prune);
}
if (nManualPruneHeight > 0) {
@@ -2909,7 +2900,7 @@ bool Chainstate::FlushStateToDisk(
return FatalError(m_chainman.GetNotifications(), state, _("Disk space is too low!"));
}
// Flush the chainstate (which may refer to block index entries).
- const auto empty_cache{(mode == FlushStateMode::ALWAYS) || fCacheLarge || fCacheCritical || fFlushForPrune};
+ const auto empty_cache{(mode == FlushStateMode::ALWAYS) || fCacheLarge || fCacheCritical};
if (empty_cache ? !CoinsTip().Flush() : !CoinsTip().Sync()) {
return FatalError(m_chainman.GetNotifications(), state, _("Failed to write to coin database."));
}
@@ -2963,7 +2954,7 @@ static void UpdateTipLog(
LogPrintf("%s%s: new best=%s height=%d version=0x%08x log2_work=%f tx=%lu date='%s' progress=%f cache=%.1fMiB(%utxo)%s\n",
prefix, func_name,
tip->GetBlockHash().ToString(), tip->nHeight, tip->nVersion,
- log(tip->nChainWork.getdouble()) / log(2.0), (unsigned long)tip->nChainTx,
+ log(tip->nChainWork.getdouble()) / log(2.0), tip->m_chain_tx_count,
FormatISO8601DateTime(tip->GetBlockTime()),
GuessVerificationProgress(params.TxData(), tip),
coins_tip.DynamicMemoryUsage() * (1.0 / (1 << 20)),
@@ -2994,12 +2985,6 @@ void Chainstate::UpdateTip(const CBlockIndex* pindexNew)
m_mempool->AddTransactionsUpdated(1);
}
- {
- LOCK(g_best_block_mutex);
- g_best_block = pindexNew->GetBlockHash();
- g_best_block_cv.notify_all();
- }
-
std::vector<bilingual_str> warning_messages;
if (!m_chainman.IsInitialBlockDownload()) {
const CBlockIndex* pindex = pindexNew;
@@ -3057,7 +3042,7 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
bool flushed = view.Flush();
assert(flushed);
}
- LogPrint(BCLog::BENCH, "- Disconnect block: %.2fms\n",
+ LogDebug(BCLog::BENCH, "- Disconnect block: %.2fms\n",
Ticks<MillisecondsDouble>(SteadyClock::now() - time_start));
{
@@ -3067,7 +3052,7 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
if (prune_lock.second.height_first <= max_height_first) continue;
prune_lock.second.height_first = max_height_first;
- LogPrint(BCLog::PRUNE, "%s prune lock moved back to %d\n", prune_lock.first, max_height_first);
+ LogDebug(BCLog::PRUNE, "%s prune lock moved back to %d\n", prune_lock.first, max_height_first);
}
}
@@ -3095,11 +3080,6 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
return true;
}
-static SteadyClock::duration time_connect_total{};
-static SteadyClock::duration time_flush{};
-static SteadyClock::duration time_chainstate{};
-static SteadyClock::duration time_post_connect{};
-
struct PerBlockConnectTrace {
CBlockIndex* pindex = nullptr;
std::shared_ptr<const CBlock> pblock;
@@ -3162,7 +3142,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
}
pthisBlock = pblockNew;
} else {
- LogPrint(BCLog::BENCH, " - Using cached block\n");
+ LogDebug(BCLog::BENCH, " - Using cached block\n");
pthisBlock = pblock;
}
const CBlock& blockConnecting = *pthisBlock;
@@ -3171,7 +3151,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
SteadyClock::time_point time_3;
// When adding aggregate statistics in the future, keep in mind that
// num_blocks_total may be zero until the ConnectBlock() call below.
- LogPrint(BCLog::BENCH, " - Load block from disk: %.2fms\n",
+ LogDebug(BCLog::BENCH, " - Load block from disk: %.2fms\n",
Ticks<MillisecondsDouble>(time_2 - time_1));
{
CCoinsViewCache view(&CoinsTip());
@@ -3186,31 +3166,31 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
return false;
}
time_3 = SteadyClock::now();
- time_connect_total += time_3 - time_2;
- assert(num_blocks_total > 0);
- LogPrint(BCLog::BENCH, " - Connect total: %.2fms [%.2fs (%.2fms/blk)]\n",
+ m_chainman.time_connect_total += time_3 - time_2;
+ assert(m_chainman.num_blocks_total > 0);
+ LogDebug(BCLog::BENCH, " - Connect total: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_3 - time_2),
- Ticks<SecondsDouble>(time_connect_total),
- Ticks<MillisecondsDouble>(time_connect_total) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_connect_total),
+ Ticks<MillisecondsDouble>(m_chainman.time_connect_total) / m_chainman.num_blocks_total);
bool flushed = view.Flush();
assert(flushed);
}
const auto time_4{SteadyClock::now()};
- time_flush += time_4 - time_3;
- LogPrint(BCLog::BENCH, " - Flush: %.2fms [%.2fs (%.2fms/blk)]\n",
+ m_chainman.time_flush += time_4 - time_3;
+ LogDebug(BCLog::BENCH, " - Flush: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_4 - time_3),
- Ticks<SecondsDouble>(time_flush),
- Ticks<MillisecondsDouble>(time_flush) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_flush),
+ Ticks<MillisecondsDouble>(m_chainman.time_flush) / m_chainman.num_blocks_total);
// Write the chain state to disk, if necessary.
if (!FlushStateToDisk(state, FlushStateMode::IF_NEEDED)) {
return false;
}
const auto time_5{SteadyClock::now()};
- time_chainstate += time_5 - time_4;
- LogPrint(BCLog::BENCH, " - Writing chainstate: %.2fms [%.2fs (%.2fms/blk)]\n",
+ m_chainman.time_chainstate += time_5 - time_4;
+ LogDebug(BCLog::BENCH, " - Writing chainstate: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_5 - time_4),
- Ticks<SecondsDouble>(time_chainstate),
- Ticks<MillisecondsDouble>(time_chainstate) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_chainstate),
+ Ticks<MillisecondsDouble>(m_chainman.time_chainstate) / m_chainman.num_blocks_total);
// Remove conflicting transactions from the mempool.;
if (m_mempool) {
m_mempool->removeForBlock(blockConnecting.vtx, pindexNew->nHeight);
@@ -3221,16 +3201,16 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
UpdateTip(pindexNew);
const auto time_6{SteadyClock::now()};
- time_post_connect += time_6 - time_5;
- time_total += time_6 - time_1;
- LogPrint(BCLog::BENCH, " - Connect postprocess: %.2fms [%.2fs (%.2fms/blk)]\n",
+ m_chainman.time_post_connect += time_6 - time_5;
+ m_chainman.time_total += time_6 - time_1;
+ LogDebug(BCLog::BENCH, " - Connect postprocess: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_6 - time_5),
- Ticks<SecondsDouble>(time_post_connect),
- Ticks<MillisecondsDouble>(time_post_connect) / num_blocks_total);
- LogPrint(BCLog::BENCH, "- Connect block: %.2fms [%.2fs (%.2fms/blk)]\n",
+ Ticks<SecondsDouble>(m_chainman.time_post_connect),
+ Ticks<MillisecondsDouble>(m_chainman.time_post_connect) / m_chainman.num_blocks_total);
+ LogDebug(BCLog::BENCH, "- Connect block: %.2fms [%.2fs (%.2fms/blk)]\n",
Ticks<MillisecondsDouble>(time_6 - time_1),
- Ticks<SecondsDouble>(time_total),
- Ticks<MillisecondsDouble>(time_total) / num_blocks_total);
+ Ticks<SecondsDouble>(m_chainman.time_total),
+ Ticks<MillisecondsDouble>(m_chainman.time_total) / m_chainman.num_blocks_total);
// If we are the background validation chainstate, check to see if we are done
// validating the snapshot (i.e. our tip has reached the snapshot's base block).
@@ -3369,7 +3349,7 @@ bool Chainstate::ActivateBestChainStep(BlockValidationState& state, CBlockIndex*
nHeight = nTargetHeight;
// Connect new blocks.
- for (CBlockIndex* pindexConnect : reverse_iterate(vpindexToConnect)) {
+ for (CBlockIndex* pindexConnect : vpindexToConnect | std::views::reverse) {
if (!ConnectTip(state, pindexConnect, pindexConnect == pindexMostWork ? pblock : std::shared_ptr<const CBlock>(), connectTrace, disconnectpool)) {
if (state.IsInvalid()) {
// The block violates a consensus rule.
@@ -3417,25 +3397,24 @@ static SynchronizationState GetSynchronizationState(bool init, bool blockfiles_i
return SynchronizationState::INIT_DOWNLOAD;
}
-static bool NotifyHeaderTip(ChainstateManager& chainman) LOCKS_EXCLUDED(cs_main)
+bool ChainstateManager::NotifyHeaderTip()
{
bool fNotify = false;
bool fInitialBlockDownload = false;
- static CBlockIndex* pindexHeaderOld = nullptr;
CBlockIndex* pindexHeader = nullptr;
{
- LOCK(cs_main);
- pindexHeader = chainman.m_best_header;
+ LOCK(GetMutex());
+ pindexHeader = m_best_header;
- if (pindexHeader != pindexHeaderOld) {
+ if (pindexHeader != m_last_notified_header) {
fNotify = true;
- fInitialBlockDownload = chainman.IsInitialBlockDownload();
- pindexHeaderOld = pindexHeader;
+ fInitialBlockDownload = IsInitialBlockDownload();
+ m_last_notified_header = pindexHeader;
}
}
- // Send block tip changed notifications without cs_main
+ // Send block tip changed notifications without the lock held
if (fNotify) {
- chainman.GetNotifications().headerTip(GetSynchronizationState(fInitialBlockDownload, chainman.m_blockman.m_blockfiles_indexed), pindexHeader->nHeight, pindexHeader->nTime, false);
+ GetNotifications().headerTip(GetSynchronizationState(fInitialBlockDownload, m_blockman.m_blockfiles_indexed), pindexHeader->nHeight, pindexHeader->nTime, false);
}
return fNotify;
}
@@ -3486,6 +3465,7 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
{
LOCK(cs_main);
+ {
// Lock transaction pool for at least as long as it takes for connectTrace to be consumed
LOCK(MempoolMutex());
const bool was_in_ibd = m_chainman.IsInitialBlockDownload();
@@ -3562,7 +3542,12 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
break;
}
}
- }
+ } // release MempoolMutex
+ // Notify external listeners about the new tip, even if pindexFork == pindexNewTip.
+ if (m_chainman.m_options.signals && this == &m_chainman.ActiveChainstate()) {
+ m_chainman.m_options.signals->ActiveTipChange(*Assert(pindexNewTip), m_chainman.IsInitialBlockDownload());
+ }
+ } // release cs_main
// When we reach this point, we switched to a new tip (stored in pindexNewTip).
if (exited_ibd) {
@@ -3581,8 +3566,8 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
//
// This cannot be done while holding cs_main (within
// MaybeCompleteSnapshotValidation) or a cs_main deadlock will occur.
- if (m_chainman.restart_indexes) {
- m_chainman.restart_indexes();
+ if (m_chainman.snapshot_download_completed) {
+ m_chainman.snapshot_download_completed();
}
break;
}
@@ -3781,6 +3766,12 @@ bool Chainstate::InvalidateBlock(BlockValidationState& state, CBlockIndex* pinde
// distinguish user-initiated invalidateblock changes from other
// changes.
(void)m_chainman.GetNotifications().blockTip(GetSynchronizationState(m_chainman.IsInitialBlockDownload(), m_chainman.m_blockman.m_blockfiles_indexed), *to_mark_failed->pprev);
+
+ // Fire ActiveTipChange now for the current chain tip to make sure clients are notified.
+ // ActivateBestChain may call this as well, but not necessarily.
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->ActiveTipChange(*Assert(m_chain.Tip()), m_chainman.IsInitialBlockDownload());
+ }
}
return true;
}
@@ -3847,17 +3838,17 @@ void ChainstateManager::ReceivedBlockTransactions(const CBlock& block, CBlockInd
{
AssertLockHeld(cs_main);
pindexNew->nTx = block.vtx.size();
- // Typically nChainTx will be 0 at this point, but it can be nonzero if this
+ // Typically m_chain_tx_count will be 0 at this point, but it can be nonzero if this
// is a pruned block which is being downloaded again, or if this is an
- // assumeutxo snapshot block which has a hardcoded nChainTx value from the
+ // assumeutxo snapshot block which has a hardcoded m_chain_tx_count value from the
// snapshot metadata. If the pindex is not the snapshot block and the
- // nChainTx value is not zero, assert that value is actually correct.
- auto prev_tx_sum = [](CBlockIndex& block) { return block.nTx + (block.pprev ? block.pprev->nChainTx : 0); };
- if (!Assume(pindexNew->nChainTx == 0 || pindexNew->nChainTx == prev_tx_sum(*pindexNew) ||
+ // m_chain_tx_count value is not zero, assert that value is actually correct.
+ auto prev_tx_sum = [](CBlockIndex& block) { return block.nTx + (block.pprev ? block.pprev->m_chain_tx_count : 0); };
+ if (!Assume(pindexNew->m_chain_tx_count == 0 || pindexNew->m_chain_tx_count == prev_tx_sum(*pindexNew) ||
pindexNew == GetSnapshotBaseBlock())) {
- LogWarning("Internal bug detected: block %d has unexpected nChainTx %i that should be %i (%s %s). Please report this issue here: %s\n",
- pindexNew->nHeight, pindexNew->nChainTx, prev_tx_sum(*pindexNew), PACKAGE_NAME, FormatFullVersion(), PACKAGE_BUGREPORT);
- pindexNew->nChainTx = 0;
+ LogWarning("Internal bug detected: block %d has unexpected m_chain_tx_count %i that should be %i (%s %s). Please report this issue here: %s\n",
+ pindexNew->nHeight, pindexNew->m_chain_tx_count, prev_tx_sum(*pindexNew), PACKAGE_NAME, FormatFullVersion(), PACKAGE_BUGREPORT);
+ pindexNew->m_chain_tx_count = 0;
}
pindexNew->nFile = pos.nFile;
pindexNew->nDataPos = pos.nPos;
@@ -3878,15 +3869,15 @@ void ChainstateManager::ReceivedBlockTransactions(const CBlock& block, CBlockInd
while (!queue.empty()) {
CBlockIndex *pindex = queue.front();
queue.pop_front();
- // Before setting nChainTx, assert that it is 0 or already set to
+ // Before setting m_chain_tx_count, assert that it is 0 or already set to
// the correct value. This assert will fail after receiving the
// assumeutxo snapshot block if assumeutxo snapshot metadata has an
- // incorrect hardcoded AssumeutxoData::nChainTx value.
- if (!Assume(pindex->nChainTx == 0 || pindex->nChainTx == prev_tx_sum(*pindex))) {
- LogWarning("Internal bug detected: block %d has unexpected nChainTx %i that should be %i (%s %s). Please report this issue here: %s\n",
- pindex->nHeight, pindex->nChainTx, prev_tx_sum(*pindex), PACKAGE_NAME, FormatFullVersion(), PACKAGE_BUGREPORT);
+ // incorrect hardcoded AssumeutxoData::m_chain_tx_count value.
+ if (!Assume(pindex->m_chain_tx_count == 0 || pindex->m_chain_tx_count == prev_tx_sum(*pindex))) {
+ LogWarning("Internal bug detected: block %d has unexpected m_chain_tx_count %i that should be %i (%s %s). Please report this issue here: %s\n",
+ pindex->nHeight, pindex->m_chain_tx_count, prev_tx_sum(*pindex), PACKAGE_NAME, FormatFullVersion(), PACKAGE_BUGREPORT);
}
- pindex->nChainTx = prev_tx_sum(*pindex);
+ pindex->m_chain_tx_count = prev_tx_sum(*pindex);
pindex->nSequenceId = nBlockSequenceId++;
for (Chainstate *c : GetAll()) {
c->TryAddBlockIndexCandidate(pindex);
@@ -4137,7 +4128,7 @@ bool IsBlockMutated(const CBlock& block, bool check_witness_root)
return false;
}
-arith_uint256 CalculateClaimedHeadersWork(const std::vector<CBlockHeader>& headers)
+arith_uint256 CalculateClaimedHeadersWork(std::span<const CBlockHeader> headers)
{
arith_uint256 total_work{0};
for (const CBlockHeader& header : headers) {
@@ -4183,6 +4174,18 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidatio
if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast())
return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "time-too-old", "block's timestamp is too early");
+ // Testnet4 and regtest only: Check timestamp against prev for difficulty-adjustment
+ // blocks to prevent timewarp attacks (see https://github.com/bitcoin/bitcoin/pull/15482).
+ if (consensusParams.enforce_BIP94) {
+ // Check timestamp for the first block of each difficulty adjustment
+ // interval, except the genesis block.
+ if (nHeight % consensusParams.DifficultyAdjustmentInterval() == 0) {
+ if (block.GetBlockTime() < pindexPrev->GetBlockTime() - MAX_TIMEWARP) {
+ return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "time-timewarp-attack", "block's timestamp is too early on diff adjustment block");
+ }
+ }
+ }
+
// Check timestamp
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");
@@ -4276,14 +4279,14 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
if (ppindex)
*ppindex = pindex;
if (pindex->nStatus & BLOCK_FAILED_MASK) {
- LogPrint(BCLog::VALIDATION, "%s: block %s is marked invalid\n", __func__, hash.ToString());
+ LogDebug(BCLog::VALIDATION, "%s: block %s is marked invalid\n", __func__, hash.ToString());
return state.Invalid(BlockValidationResult::BLOCK_CACHED_INVALID, "duplicate");
}
return true;
}
if (!CheckBlockHeader(block, state, GetConsensus())) {
- LogPrint(BCLog::VALIDATION, "%s: Consensus::CheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
+ LogDebug(BCLog::VALIDATION, "%s: Consensus::CheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
return false;
}
@@ -4291,16 +4294,16 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
CBlockIndex* pindexPrev = nullptr;
BlockMap::iterator mi{m_blockman.m_block_index.find(block.hashPrevBlock)};
if (mi == m_blockman.m_block_index.end()) {
- LogPrint(BCLog::VALIDATION, "header %s has prev block not found: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
+ LogDebug(BCLog::VALIDATION, "header %s has prev block not found: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
return state.Invalid(BlockValidationResult::BLOCK_MISSING_PREV, "prev-blk-not-found");
}
pindexPrev = &((*mi).second);
if (pindexPrev->nStatus & BLOCK_FAILED_MASK) {
- LogPrint(BCLog::VALIDATION, "header %s has prev block invalid: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
+ LogDebug(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)) {
- LogPrint(BCLog::VALIDATION, "%s: Consensus::ContextualCheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
+ LogDebug(BCLog::VALIDATION, "%s: Consensus::ContextualCheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
return false;
}
@@ -4337,14 +4340,14 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
m_blockman.m_dirty_blockindex.insert(invalid_walk);
invalid_walk = invalid_walk->pprev;
}
- LogPrint(BCLog::VALIDATION, "header %s has prev block invalid: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
+ LogDebug(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 (!min_pow_checked) {
- LogPrint(BCLog::VALIDATION, "%s: not adding new block header %s, missing anti-dos proof-of-work validation\n", __func__, hash.ToString());
+ LogDebug(BCLog::VALIDATION, "%s: not adding new block header %s, missing anti-dos proof-of-work validation\n", __func__, hash.ToString());
return state.Invalid(BlockValidationResult::BLOCK_HEADER_LOW_WORK, "too-little-chainwork");
}
CBlockIndex* pindex{m_blockman.AddToBlockIndex(block, m_best_header)};
@@ -4373,7 +4376,7 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
}
// Exposed wrapper for AcceptBlockHeader
-bool ChainstateManager::ProcessNewBlockHeaders(const std::vector<CBlockHeader>& headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex)
+bool ChainstateManager::ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex)
{
AssertLockNotHeld(cs_main);
{
@@ -4391,7 +4394,7 @@ bool ChainstateManager::ProcessNewBlockHeaders(const std::vector<CBlockHeader>&
}
}
}
- if (NotifyHeaderTip(*this)) {
+ if (NotifyHeaderTip()) {
if (IsInitialBlockDownload() && ppindex && *ppindex) {
const CBlockIndex& last_accepted{**ppindex};
int64_t blocks_left{(NodeClock::now() - last_accepted.Time()) / GetConsensus().PowTargetSpacing()};
@@ -4562,7 +4565,7 @@ bool ChainstateManager::ProcessNewBlock(const std::shared_ptr<const CBlock>& blo
}
}
- NotifyHeaderTip(*this);
+ NotifyHeaderTip();
BlockValidationState state; // Only used to report errors, not invalidity - ignore it
if (!ActiveChainstate().ActivateBestChain(state, block)) {
@@ -5073,7 +5076,7 @@ void ChainstateManager::LoadExternalBlockFile(
LOCK(cs_main);
// detect out of order blocks, and store them for later
if (hash != params.GetConsensus().hashGenesisBlock && !m_blockman.LookupBlockIndex(header.hashPrevBlock)) {
- LogPrint(BCLog::REINDEX, "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(),
+ LogDebug(BCLog::REINDEX, "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(),
header.hashPrevBlock.ToString());
if (dbp && blocks_with_unknown_parent) {
blocks_with_unknown_parent->emplace(header.hashPrevBlock, *dbp);
@@ -5098,7 +5101,7 @@ void ChainstateManager::LoadExternalBlockFile(
break;
}
} else if (hash != params.GetConsensus().hashGenesisBlock && pindex->nHeight % 1000 == 0) {
- LogPrint(BCLog::REINDEX, "Block Import: already had block %s at height %d\n", hash.ToString(), pindex->nHeight);
+ LogDebug(BCLog::REINDEX, "Block Import: already had block %s at height %d\n", hash.ToString(), pindex->nHeight);
}
}
@@ -5129,7 +5132,7 @@ void ChainstateManager::LoadExternalBlockFile(
for (auto c : GetAll()) {
BlockValidationState state;
if (!c->ActivateBestChain(state, pblock)) {
- LogPrint(BCLog::REINDEX, "failed to activate chain (%s)\n", state.ToString());
+ LogDebug(BCLog::REINDEX, "failed to activate chain (%s)\n", state.ToString());
activation_failure = true;
break;
}
@@ -5139,7 +5142,7 @@ void ChainstateManager::LoadExternalBlockFile(
}
}
- NotifyHeaderTip(*this);
+ NotifyHeaderTip();
if (!blocks_with_unknown_parent) continue;
@@ -5154,7 +5157,7 @@ void ChainstateManager::LoadExternalBlockFile(
std::multimap<uint256, FlatFilePos>::iterator it = range.first;
std::shared_ptr<CBlock> pblockrecursive = std::make_shared<CBlock>();
if (m_blockman.ReadBlockFromDisk(*pblockrecursive, it->second)) {
- LogPrint(BCLog::REINDEX, "%s: Processing out of order child %s of %s\n", __func__, pblockrecursive->GetHash().ToString(),
+ LogDebug(BCLog::REINDEX, "%s: Processing out of order child %s of %s\n", __func__, pblockrecursive->GetHash().ToString(),
head.ToString());
LOCK(cs_main);
BlockValidationState dummy;
@@ -5165,7 +5168,7 @@ void ChainstateManager::LoadExternalBlockFile(
}
range.first++;
blocks_with_unknown_parent->erase(it);
- NotifyHeaderTip(*this);
+ NotifyHeaderTip();
}
}
} catch (const std::exception& e) {
@@ -5180,7 +5183,7 @@ void ChainstateManager::LoadExternalBlockFile(
// the reindex process is not the place to attempt to clean and/or compact the block files. if so desired, a studious node operator
// may use knowledge of the fact that the block files are not entirely pristine in order to prepare a set of pristine, and
// perhaps ordered, block files for later reindexing.
- LogPrint(BCLog::REINDEX, "%s: unexpected data at file offset 0x%x - %s. continuing\n", __func__, (nRewind - 1), e.what());
+ LogDebug(BCLog::REINDEX, "%s: unexpected data at file offset 0x%x - %s. continuing\n", __func__, (nRewind - 1), e.what());
}
}
} catch (const std::runtime_error& e) {
@@ -5193,7 +5196,7 @@ bool ChainstateManager::ShouldCheckBlockIndex() const
{
// Assert to verify Flatten() has been called.
if (!*Assert(m_options.check_block_index)) return false;
- if (GetRand(*m_options.check_block_index) >= 1) return false;
+ if (FastRandomContext().randrange(*m_options.check_block_index) >= 1) return false;
return true;
}
@@ -5334,17 +5337,17 @@ 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.
+ // Make sure m_chain_tx_count sum is correctly computed.
if (!pindex->pprev) {
- // If no previous block, nTx and nChainTx must be the same.
- assert(pindex->nChainTx == pindex->nTx);
- } else if (pindex->pprev->nChainTx > 0 && pindex->nTx > 0) {
- // If previous nChainTx is set and number of transactions in block is known, sum must be set.
- assert(pindex->nChainTx == pindex->nTx + pindex->pprev->nChainTx);
+ // If no previous block, nTx and m_chain_tx_count must be the same.
+ assert(pindex->m_chain_tx_count == pindex->nTx);
+ } else if (pindex->pprev->m_chain_tx_count > 0 && pindex->nTx > 0) {
+ // If previous m_chain_tx_count is set and number of transactions in block is known, sum must be set.
+ assert(pindex->m_chain_tx_count == pindex->nTx + pindex->pprev->m_chain_tx_count);
} else {
- // Otherwise nChainTx should only be set if this is a snapshot
+ // Otherwise m_chain_tx_count should only be set if this is a snapshot
// block, and must be set if it is.
- assert((pindex->nChainTx != 0) == (pindex == snap_base));
+ assert((pindex->m_chain_tx_count != 0) == (pindex == snap_base));
}
// Chainstate-specific checks on setBlockIndexCandidates
@@ -5373,7 +5376,7 @@ void ChainstateManager::CheckBlockIndex()
// and the transactions were not pruned (pindexFirstMissing
// is null), it is a potential candidate. The check
// excludes pruned blocks, because if any blocks were
- // pruned between pindex the current chain tip, pindex will
+ // pruned between pindex and the current chain tip, pindex will
// only temporarily be added to setBlockIndexCandidates,
// before being moved to m_blocks_unlinked. This check
// could be improved to verify that if all blocks between
@@ -5549,13 +5552,13 @@ bool Chainstate::ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
}
//! Guess how far we are in the verification process at the given block index
-//! require cs_main if pindex has not been validated yet (because nChainTx might be unset)
+//! require cs_main if pindex has not been validated yet (because m_chain_tx_count might be unset)
double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex *pindex) {
if (pindex == nullptr)
return 0.0;
- if (!Assume(pindex->nChainTx > 0)) {
- LogWarning("Internal bug detected: block %d has unset nChainTx (%s %s). Please report this issue here: %s\n",
+ if (!Assume(pindex->m_chain_tx_count > 0)) {
+ LogWarning("Internal bug detected: block %d has unset m_chain_tx_count (%s %s). Please report this issue here: %s\n",
pindex->nHeight, PACKAGE_NAME, FormatFullVersion(), PACKAGE_BUGREPORT);
return 0.0;
}
@@ -5564,13 +5567,13 @@ double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex *pin
double fTxTotal;
- if (pindex->nChainTx <= data.nTxCount) {
- fTxTotal = data.nTxCount + (nNow - data.nTime) * data.dTxRate;
+ if (pindex->m_chain_tx_count <= data.tx_count) {
+ fTxTotal = data.tx_count + (nNow - data.nTime) * data.dTxRate;
} else {
- fTxTotal = pindex->nChainTx + (nNow - pindex->GetBlockTime()) * data.dTxRate;
+ fTxTotal = pindex->m_chain_tx_count + (nNow - pindex->GetBlockTime()) * data.dTxRate;
}
- return std::min<double>(pindex->nChainTx / fTxTotal, 1.0);
+ return std::min<double>(pindex->m_chain_tx_count / fTxTotal, 1.0);
}
std::optional<uint256> ChainstateManager::SnapshotBlockhash() const
@@ -5646,7 +5649,7 @@ Chainstate& ChainstateManager::InitializeChainstate(CTxMemPool* mempool)
return destroyed && !fs::exists(db_path);
}
-bool ChainstateManager::ActivateSnapshot(
+util::Result<CBlockIndex*> ChainstateManager::ActivateSnapshot(
AutoFile& coins_file,
const SnapshotMetadata& metadata,
bool in_memory)
@@ -5654,15 +5657,40 @@ bool ChainstateManager::ActivateSnapshot(
uint256 base_blockhash = metadata.m_base_blockhash;
if (this->SnapshotBlockhash()) {
- LogPrintf("[snapshot] can't activate a snapshot-based chainstate more than once\n");
- return false;
+ return util::Error{Untranslated("Can't activate a snapshot-based chainstate more than once")};
}
+ CBlockIndex* snapshot_start_block{};
+
{
LOCK(::cs_main);
- if (Assert(m_active_chainstate->GetMempool())->size() > 0) {
- LogPrintf("[snapshot] can't activate a snapshot when mempool not empty\n");
- return false;
+
+ if (!GetParams().AssumeutxoForBlockhash(base_blockhash).has_value()) {
+ auto available_heights = GetParams().GetAvailableSnapshotHeights();
+ std::string heights_formatted = util::Join(available_heights, ", ", [&](const auto& i) { return util::ToString(i); });
+ return util::Error{strprintf(Untranslated("assumeutxo block hash in snapshot metadata not recognized (hash: %s). The following snapshot heights are available: %s"),
+ base_blockhash.ToString(),
+ heights_formatted)};
+ }
+
+ snapshot_start_block = m_blockman.LookupBlockIndex(base_blockhash);
+ if (!snapshot_start_block) {
+ return util::Error{strprintf(Untranslated("The base block header (%s) must appear in the headers chain. Make sure all headers are syncing, and call loadtxoutset again"),
+ base_blockhash.ToString())};
+ }
+
+ bool start_block_invalid = snapshot_start_block->nStatus & BLOCK_FAILED_MASK;
+ if (start_block_invalid) {
+ return util::Error{strprintf(Untranslated("The base block header (%s) is part of an invalid chain"), base_blockhash.ToString())};
+ }
+
+ if (!m_best_header || m_best_header->GetAncestor(snapshot_start_block->nHeight) != snapshot_start_block) {
+ return util::Error{Untranslated("A forked headers-chain with more work than the chain with the snapshot base block header exists. Please proceed to sync without AssumeUtxo.")};
+ }
+
+ auto mempool{m_active_chainstate->GetMempool()};
+ if (mempool && mempool->size() > 0) {
+ return util::Error{Untranslated("Can't activate a snapshot when mempool not empty")};
}
}
@@ -5711,8 +5739,7 @@ bool ChainstateManager::ActivateSnapshot(
static_cast<size_t>(current_coinstip_cache_size * SNAPSHOT_CACHE_PERC));
}
- auto cleanup_bad_snapshot = [&](const char* reason) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
- LogPrintf("[snapshot] activation failed - %s\n", reason);
+ auto cleanup_bad_snapshot = [&](bilingual_str reason) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
this->MaybeRebalanceCaches();
// PopulateAndValidateSnapshot can return (in error) before the leveldb datadir
@@ -5728,12 +5755,12 @@ bool ChainstateManager::ActivateSnapshot(
"Manually remove it before restarting.\n"), fs::PathToString(*snapshot_datadir)));
}
}
- return false;
+ return util::Error{std::move(reason)};
};
- if (!this->PopulateAndValidateSnapshot(*snapshot_chainstate, coins_file, metadata)) {
+ if (auto res{this->PopulateAndValidateSnapshot(*snapshot_chainstate, coins_file, metadata)}; !res) {
LOCK(::cs_main);
- return cleanup_bad_snapshot("population failed");
+ return cleanup_bad_snapshot(strprintf(Untranslated("Population failed: %s"), util::ErrorString(res)));
}
LOCK(::cs_main); // cs_main required for rest of snapshot activation.
@@ -5742,13 +5769,13 @@ bool ChainstateManager::ActivateSnapshot(
// work chain than the active chainstate; a user could have loaded a snapshot
// very late in the IBD process, and we wouldn't want to load a useless chainstate.
if (!CBlockIndexWorkComparator()(ActiveTip(), snapshot_chainstate->m_chain.Tip())) {
- return cleanup_bad_snapshot("work does not exceed active chainstate");
+ return cleanup_bad_snapshot(Untranslated("work does not exceed active chainstate"));
}
// If not in-memory, persist the base blockhash for use during subsequent
// initialization.
if (!in_memory) {
if (!node::WriteSnapshotBaseBlockhash(*snapshot_chainstate)) {
- return cleanup_bad_snapshot("could not write base blockhash");
+ return cleanup_bad_snapshot(Untranslated("could not write base blockhash"));
}
}
@@ -5771,7 +5798,7 @@ bool ChainstateManager::ActivateSnapshot(
m_snapshot_chainstate->CoinsTip().DynamicMemoryUsage() / (1000 * 1000));
this->MaybeRebalanceCaches();
- return true;
+ return snapshot_start_block;
}
static void FlushSnapshotToDisk(CCoinsViewCache& coins_cache, bool snapshot_loaded)
@@ -5798,7 +5825,7 @@ static void SnapshotUTXOHashBreakpoint(const util::SignalInterrupt& interrupt)
if (interrupt) throw StopHashingException();
}
-bool ChainstateManager::PopulateAndValidateSnapshot(
+util::Result<void> ChainstateManager::PopulateAndValidateSnapshot(
Chainstate& snapshot_chainstate,
AutoFile& coins_file,
const SnapshotMetadata& metadata)
@@ -5814,18 +5841,16 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
if (!snapshot_start_block) {
// Needed for ComputeUTXOStats to determine the
// height and to avoid a crash when base_blockhash.IsNull()
- LogPrintf("[snapshot] Did not find snapshot start blockheader %s\n",
- base_blockhash.ToString());
- return false;
+ return util::Error{strprintf(Untranslated("Did not find snapshot start blockheader %s"),
+ base_blockhash.ToString())};
}
int base_height = snapshot_start_block->nHeight;
const auto& maybe_au_data = GetParams().AssumeutxoForHeight(base_height);
if (!maybe_au_data) {
- LogPrintf("[snapshot] assumeutxo height in snapshot metadata not recognized "
- "(%d) - refusing to load snapshot\n", base_height);
- return false;
+ return util::Error{strprintf(Untranslated("Assumeutxo height in snapshot metadata not recognized "
+ "(%d) - refusing to load snapshot"), base_height)};
}
const AssumeutxoData& au_data = *maybe_au_data;
@@ -5834,8 +5859,7 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
// ActivateSnapshot(), but is done so that we avoid doing the long work of staging
// a snapshot that isn't actually usable.
if (WITH_LOCK(::cs_main, return !CBlockIndexWorkComparator()(ActiveTip(), snapshot_start_block))) {
- LogPrintf("[snapshot] activation failed - work does not exceed active chainstate\n");
- return false;
+ return util::Error{Untranslated("Work does not exceed active chainstate")};
}
const uint64_t coins_count = metadata.m_coins_count;
@@ -5852,8 +5876,7 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
coins_per_txid = ReadCompactSize(coins_file);
if (coins_per_txid > coins_left) {
- LogPrintf("[snapshot] mismatch in coins count in snapshot metadata and actual snapshot data\n");
- return false;
+ return util::Error{Untranslated("Mismatch in coins count in snapshot metadata and actual snapshot data")};
}
for (size_t i = 0; i < coins_per_txid; i++) {
@@ -5865,14 +5888,12 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
if (coin.nHeight > base_height ||
outpoint.n >= std::numeric_limits<decltype(outpoint.n)>::max() // Avoid integer wrap-around in coinstats.cpp:ApplyHash
) {
- LogPrintf("[snapshot] bad snapshot data after deserializing %d coins\n",
- coins_count - coins_left);
- return false;
+ return util::Error{strprintf(Untranslated("Bad snapshot data after deserializing %d coins"),
+ coins_count - coins_left)};
}
if (!MoneyRange(coin.out.nValue)) {
- LogPrintf("[snapshot] bad snapshot data after deserializing %d coins - bad tx out value\n",
- coins_count - coins_left);
- return false;
+ return util::Error{strprintf(Untranslated("Bad snapshot data after deserializing %d coins - bad tx out value"),
+ coins_count - coins_left)};
}
coins_cache.EmplaceCoinInternalDANGER(std::move(outpoint), std::move(coin));
@@ -5892,7 +5913,7 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
// means <5MB of memory imprecision.
if (coins_processed % 120000 == 0) {
if (m_interrupt) {
- return false;
+ return util::Error{Untranslated("Aborting after an interrupt was requested")};
}
const auto snapshot_cache_state = WITH_LOCK(::cs_main,
@@ -5910,9 +5931,8 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
}
}
} catch (const std::ios_base::failure&) {
- LogPrintf("[snapshot] bad snapshot format or truncated snapshot after deserializing %d coins\n",
- coins_processed);
- return false;
+ return util::Error{strprintf(Untranslated("Bad snapshot format or truncated snapshot after deserializing %d coins"),
+ coins_processed)};
}
}
@@ -5932,9 +5952,8 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
out_of_coins = true;
}
if (!out_of_coins) {
- LogPrintf("[snapshot] bad snapshot - coins left over after deserializing %d coins\n",
- coins_count);
- return false;
+ return util::Error{strprintf(Untranslated("Bad snapshot - coins left over after deserializing %d coins"),
+ coins_count)};
}
LogPrintf("[snapshot] loaded %d (%.2f MB) coins from snapshot %s\n",
@@ -5957,18 +5976,16 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
maybe_stats = ComputeUTXOStats(
CoinStatsHashType::HASH_SERIALIZED, snapshot_coinsdb, m_blockman, [&interrupt = m_interrupt] { SnapshotUTXOHashBreakpoint(interrupt); });
} catch (StopHashingException const&) {
- return false;
+ return util::Error{Untranslated("Aborting after an interrupt was requested")};
}
if (!maybe_stats.has_value()) {
- LogPrintf("[snapshot] failed to generate coins stats\n");
- return false;
+ return util::Error{Untranslated("Failed to generate coins stats")};
}
// Assert that the deserialized chainstate contents match the expected assumeutxo value.
if (AssumeutxoHash{maybe_stats->hashSerialized} != au_data.hash_serialized) {
- LogPrintf("[snapshot] bad snapshot content hash: expected %s, got %s\n",
- au_data.hash_serialized.ToString(), maybe_stats->hashSerialized.ToString());
- return false;
+ return util::Error{strprintf(Untranslated("Bad snapshot content hash: expected %s, got %s"),
+ au_data.hash_serialized.ToString(), maybe_stats->hashSerialized.ToString())};
}
snapshot_chainstate.m_chain.SetTip(*snapshot_start_block);
@@ -5988,7 +6005,7 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
index = snapshot_chainstate.m_chain[i];
// Fake BLOCK_OPT_WITNESS so that Chainstate::NeedsRedownload()
- // won't ask to rewind the entire assumed-valid chain on startup.
+ // won't ask for -reindex on startup.
if (DeploymentActiveAt(*index, *this, Consensus::DEPLOYMENT_SEGWIT)) {
index->nStatus |= BLOCK_OPT_WITNESS;
}
@@ -6003,12 +6020,12 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
assert(index);
assert(index == snapshot_start_block);
- index->nChainTx = au_data.nChainTx;
+ index->m_chain_tx_count = au_data.m_chain_tx_count;
snapshot_chainstate.setBlockIndexCandidates.insert(snapshot_start_block);
LogPrintf("[snapshot] validated snapshot (%.2f MB)\n",
coins_cache.DynamicMemoryUsage() / (1000 * 1000));
- return true;
+ return {};
}
// Currently, this function holds cs_main for its duration, which could be for
@@ -6229,7 +6246,8 @@ ChainstateManager::ChainstateManager(const util::SignalInterrupt& interrupt, Opt
: m_script_check_queue{/*batch_size=*/128, options.worker_threads_num},
m_interrupt{interrupt},
m_options{Flatten(std::move(options))},
- m_blockman{interrupt, std::move(blockman_options)}
+ m_blockman{interrupt, std::move(blockman_options)},
+ m_validation_cache{m_options.script_execution_cache_bytes, m_options.signature_cache_bytes}
{
}
@@ -6276,14 +6294,14 @@ Chainstate& ChainstateManager::ActivateExistingSnapshot(uint256 base_blockhash)
bool IsBIP30Repeat(const CBlockIndex& block_index)
{
- return (block_index.nHeight==91842 && block_index.GetBlockHash() == uint256S("0x00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec")) ||
- (block_index.nHeight==91880 && block_index.GetBlockHash() == uint256S("0x00000000000743f190a18c5577a3c2d2a1f610ae9601ac046a38084ccb7cd721"));
+ return (block_index.nHeight==91842 && block_index.GetBlockHash() == uint256{"00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec"}) ||
+ (block_index.nHeight==91880 && block_index.GetBlockHash() == uint256{"00000000000743f190a18c5577a3c2d2a1f610ae9601ac046a38084ccb7cd721"});
}
bool IsBIP30Unspendable(const CBlockIndex& block_index)
{
- return (block_index.nHeight==91722 && block_index.GetBlockHash() == uint256S("0x00000000000271a2dc26e7667f8419f2e15416dc6955e5a6c6cdf3f2574dd08e")) ||
- (block_index.nHeight==91812 && block_index.GetBlockHash() == uint256S("0x00000000000af0aed4792b1acee3d966af36cf5def14935db8de83d6f9306f2f"));
+ return (block_index.nHeight==91722 && block_index.GetBlockHash() == uint256{"00000000000271a2dc26e7667f8419f2e15416dc6955e5a6c6cdf3f2574dd08e"}) ||
+ (block_index.nHeight==91812 && block_index.GetBlockHash() == uint256{"00000000000af0aed4792b1acee3d966af36cf5def14935db8de83d6f9306f2f"});
}
static fs::path GetSnapshotCoinsDBPath(Chainstate& cs) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
diff --git a/src/validation.h b/src/validation.h
index ab7891539a..f6aeea3faa 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -10,9 +10,10 @@
#include <attributes.h>
#include <chain.h>
#include <checkqueue.h>
-#include <kernel/chain.h>
#include <consensus/amount.h>
+#include <cuckoocache.h>
#include <deploymentstatus.h>
+#include <kernel/chain.h>
#include <kernel/chainparams.h>
#include <kernel/chainstatemanager_opts.h>
#include <kernel/cs_main.h> // IWYU pragma: export
@@ -21,6 +22,7 @@
#include <policy/packages.h>
#include <policy/policy.h>
#include <script/script_error.h>
+#include <script/sigcache.h>
#include <sync.h>
#include <txdb.h>
#include <txmempool.h> // For CTxMemPool::cs
@@ -37,9 +39,9 @@
#include <memory>
#include <optional>
#include <set>
+#include <span>
#include <stdint.h>
#include <string>
-#include <thread>
#include <type_traits>
#include <utility>
#include <vector>
@@ -83,11 +85,6 @@ enum class SynchronizationState {
POST_INIT
};
-extern GlobalMutex g_best_block_mutex;
-extern std::condition_variable g_best_block_cv;
-/** Used to notify getblocktemplate RPC of new tips. */
-extern uint256 g_best_block;
-
/** Documentation for argument 'checklevel'. */
extern const std::vector<std::string> CHECKLEVEL_DOC;
@@ -340,10 +337,11 @@ private:
bool cacheStore;
ScriptError error{SCRIPT_ERR_UNKNOWN_ERROR};
PrecomputedTransactionData *txdata;
+ SignatureCache* m_signature_cache;
public:
- CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* txdataIn) :
- m_tx_out(outIn), ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), txdata(txdataIn) { }
+ CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, SignatureCache& signature_cache, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* txdataIn) :
+ m_tx_out(outIn), ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), txdata(txdataIn), m_signature_cache(&signature_cache) { }
CScriptCheck(const CScriptCheck&) = delete;
CScriptCheck& operator=(const CScriptCheck&) = delete;
@@ -360,8 +358,28 @@ static_assert(std::is_nothrow_move_assignable_v<CScriptCheck>);
static_assert(std::is_nothrow_move_constructible_v<CScriptCheck>);
static_assert(std::is_nothrow_destructible_v<CScriptCheck>);
-/** Initializes the script-execution cache */
-[[nodiscard]] bool InitScriptExecutionCache(size_t max_size_bytes);
+/**
+ * Convenience class for initializing and passing the script execution cache
+ * and signature cache.
+ */
+class ValidationCache
+{
+private:
+ //! Pre-initialized hasher to avoid having to recreate it for every hash calculation.
+ CSHA256 m_script_execution_cache_hasher;
+
+public:
+ CuckooCache::cache<uint256, SignatureCacheHasher> m_script_execution_cache;
+ SignatureCache m_signature_cache;
+
+ ValidationCache(size_t script_execution_cache_bytes, size_t signature_cache_bytes);
+
+ ValidationCache(const ValidationCache&) = delete;
+ ValidationCache& operator=(const ValidationCache&) = delete;
+
+ //! Return a copy of the pre-initialized hasher.
+ CSHA256 ScriptExecutionCacheHasher() const { return m_script_execution_cache_hasher; }
+};
/** Functions for validating blocks and updating the block tree */
@@ -384,7 +402,7 @@ bool HasValidProofOfWork(const std::vector<CBlockHeader>& headers, const Consens
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);
+arith_uint256 CalculateClaimedHeadersWork(std::span<const CBlockHeader> headers);
enum class VerifyDBResult {
SUCCESS,
@@ -796,7 +814,6 @@ private:
friend ChainstateManager;
};
-
enum class SnapshotCompletionResult {
SUCCESS,
SKIPPED,
@@ -884,14 +901,19 @@ private:
CBlockIndex* m_best_invalid GUARDED_BY(::cs_main){nullptr};
+ /** The last header for which a headerTip notification was issued. */
+ CBlockIndex* m_last_notified_header GUARDED_BY(GetMutex()){nullptr};
+
+ bool NotifyHeaderTip() LOCKS_EXCLUDED(GetMutex());
+
//! Internal helper for ActivateSnapshot().
//!
//! De-serialization of a snapshot that is created with
- //! CreateUTXOSnapshot() in rpc/blockchain.cpp.
+ //! the dumptxoutset RPC.
//! To reduce space the serialization format of the snapshot avoids
//! duplication of tx hashes. The code takes advantage of the guarantee by
//! leveldb that keys are lexicographically sorted.
- [[nodiscard]] bool PopulateAndValidateSnapshot(
+ [[nodiscard]] util::Result<void> PopulateAndValidateSnapshot(
Chainstate& snapshot_chainstate,
AutoFile& coins_file,
const node::SnapshotMetadata& metadata);
@@ -927,6 +949,21 @@ private:
//! A queue for script verifications that have to be performed by worker threads.
CCheckQueue<CScriptCheck> m_script_check_queue;
+ //! Timers and counters used for benchmarking validation in both background
+ //! and active chainstates.
+ SteadyClock::duration GUARDED_BY(::cs_main) time_check{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_forks{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_connect{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_verify{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_undo{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_index{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_total{};
+ int64_t GUARDED_BY(::cs_main) num_blocks_total{0};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_connect_total{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_flush{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_chainstate{};
+ SteadyClock::duration GUARDED_BY(::cs_main) time_post_connect{};
+
public:
using Options = kernel::ChainstateManagerOpts;
@@ -934,7 +971,7 @@ public:
//! Function to restart active indexes; set dynamically to avoid a circular
//! dependency on `base/index.cpp`.
- std::function<void()> restart_indexes = std::function<void()>();
+ std::function<void()> snapshot_download_completed = std::function<void()>();
const CChainParams& GetParams() const { return m_options.chainparams; }
const Consensus::Params& GetConsensus() const { return m_options.chainparams.GetConsensus(); }
@@ -965,11 +1002,12 @@ public:
const util::SignalInterrupt& m_interrupt;
const Options m_options;
- std::thread m_thread_load;
//! A single BlockManager instance is shared across each constructed
//! chainstate to avoid duplicating block metadata.
node::BlockManager m_blockman;
+ ValidationCache m_validation_cache;
+
/**
* Whether initial block download has ended and IsInitialBlockDownload
* should return false from now on.
@@ -1050,11 +1088,10 @@ public:
//! - Verify that the hash of the resulting coinsdb matches the expected hash
//! per assumeutxo chain parameters.
//! - Wait for our headers chain to include the base block of the snapshot.
- //! - "Fast forward" the tip of the new chainstate to the base of the snapshot,
- //! faking nTx* block index data along the way.
+ //! - "Fast forward" the tip of the new chainstate to the base of the snapshot.
//! - Move the new chainstate to `m_snapshot_chainstate` and make it our
//! ChainstateActive().
- [[nodiscard]] bool ActivateSnapshot(
+ [[nodiscard]] util::Result<CBlockIndex*> ActivateSnapshot(
AutoFile& coins_file, const node::SnapshotMetadata& metadata, bool in_memory);
//! Once the background validation chainstate has reached the height which
@@ -1174,12 +1211,12 @@ public:
* May not be called in a
* validationinterface callback.
*
- * @param[in] block The block headers themselves
+ * @param[in] headers The block headers themselves
* @param[in] min_pow_checked True if proof-of-work anti-DoS checks have been done by caller for headers chain
* @param[out] state This may be set to an Error state if any error occurred processing them
* @param[out] ppindex If set, the pointer will be set to point to the last new block index object for the given headers
*/
- bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& block, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
+ bool ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
/**
* Sufficiently validate a block for disk storage (and store on disk).
diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp
index 813fde109c..e8ff1d78e3 100644
--- a/src/validationinterface.cpp
+++ b/src/validationinterface.cpp
@@ -95,7 +95,7 @@ public:
ValidationSignals::ValidationSignals(std::unique_ptr<util::TaskRunnerInterface> task_runner)
: m_internals{std::make_unique<ValidationSignalsImpl>(std::move(task_runner))} {}
-ValidationSignals::~ValidationSignals() {}
+ValidationSignals::~ValidationSignals() = default;
void ValidationSignals::FlushBackgroundCallbacks()
{
@@ -167,7 +167,7 @@ void ValidationSignals::SyncWithValidationInterfaceQueue()
} while (0)
#define LOG_EVENT(fmt, ...) \
- LogPrint(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
+ LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
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
@@ -183,6 +183,12 @@ void ValidationSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlo
fInitialDownload);
}
+void ValidationSignals::ActiveTipChange(const CBlockIndex& new_tip, bool is_ibd)
+{
+ LOG_EVENT("%s: new block hash=%s block height=%d", __func__, new_tip.GetBlockHash().ToString(), new_tip.nHeight);
+ m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.ActiveTipChange(new_tip, is_ibd); });
+}
+
void ValidationSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence)
{
auto event = [tx, mempool_sequence, this] {
diff --git a/src/validationinterface.h b/src/validationinterface.h
index 6f49a73c93..3cf75aa210 100644
--- a/src/validationinterface.h
+++ b/src/validationinterface.h
@@ -62,6 +62,10 @@ protected:
*/
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {}
/**
+ * Notifies listeners any time the block chain tip changes, synchronously.
+ */
+ virtual void ActiveTipChange(const CBlockIndex& new_tip, bool is_ibd) {};
+ /**
* Notifies listeners of a transaction having been added to mempool.
*
* Called on a background thread.
@@ -214,6 +218,7 @@ public:
void SyncWithValidationInterfaceQueue() LOCKS_EXCLUDED(cs_main);
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
+ void ActiveTipChange(const CBlockIndex&, bool);
void TransactionAddedToMempool(const NewMempoolTransactionInfo&, uint64_t mempool_sequence);
void TransactionRemovedFromMempool(const CTransactionRef&, MemPoolRemovalReason, uint64_t mempool_sequence);
void MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>&, unsigned int nBlockHeight);
diff --git a/src/wallet/CMakeLists.txt b/src/wallet/CMakeLists.txt
new file mode 100644
index 0000000000..121e6e3c83
--- /dev/null
+++ b/src/wallet/CMakeLists.txt
@@ -0,0 +1,59 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+# Wallet functionality used by bitcoind and bitcoin-wallet executables.
+add_library(bitcoin_wallet STATIC EXCLUDE_FROM_ALL
+ coincontrol.cpp
+ coinselection.cpp
+ context.cpp
+ crypter.cpp
+ db.cpp
+ dump.cpp
+ external_signer_scriptpubkeyman.cpp
+ feebumper.cpp
+ fees.cpp
+ interfaces.cpp
+ load.cpp
+ migrate.cpp
+ receive.cpp
+ rpc/addresses.cpp
+ rpc/backup.cpp
+ rpc/coins.cpp
+ rpc/encrypt.cpp
+ rpc/signmessage.cpp
+ rpc/spend.cpp
+ rpc/transactions.cpp
+ rpc/util.cpp
+ rpc/wallet.cpp
+ scriptpubkeyman.cpp
+ spend.cpp
+ transaction.cpp
+ wallet.cpp
+ walletdb.cpp
+ walletutil.cpp
+)
+target_link_libraries(bitcoin_wallet
+ PRIVATE
+ core_interface
+ bitcoin_common
+ univalue
+ Boost::headers
+ $<TARGET_NAME_IF_EXISTS:USDT::headers>
+)
+
+if(NOT USE_SQLITE AND NOT USE_BDB)
+ message(FATAL_ERROR "Wallet functionality requested but no BDB or SQLite support available.")
+endif()
+if(USE_SQLITE)
+ target_sources(bitcoin_wallet PRIVATE sqlite.cpp)
+ target_link_libraries(bitcoin_wallet
+ PRIVATE
+ $<TARGET_NAME_IF_EXISTS:unofficial::sqlite3::sqlite3>
+ $<TARGET_NAME_IF_EXISTS:SQLite::SQLite3>
+ )
+endif()
+if(USE_BDB)
+ target_sources(bitcoin_wallet PRIVATE bdb.cpp salvage.cpp)
+ target_link_libraries(bitcoin_wallet PUBLIC BerkeleyDB::BerkeleyDB)
+endif()
diff --git a/src/wallet/bdb.cpp b/src/wallet/bdb.cpp
index d82d8d4513..79851dff33 100644
--- a/src/wallet/bdb.cpp
+++ b/src/wallet/bdb.cpp
@@ -211,7 +211,7 @@ BerkeleyEnvironment::BerkeleyEnvironment() : m_use_shared_memory(false)
{
Reset();
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::MakeMock\n");
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::MakeMock\n");
dbenv->set_cachesize(1, 0, 1);
dbenv->set_lg_bsize(10485760 * 4);
@@ -605,7 +605,7 @@ void BerkeleyEnvironment::Flush(bool fShutdown)
{
const auto start{SteadyClock::now()};
// Flush log data to the actual data file on all files that are not in use
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: [%s] Flush(%s)%s\n", strPath, fShutdown ? "true" : "false", fDbEnvInit ? "" : " database not started");
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: [%s] Flush(%s)%s\n", strPath, fShutdown ? "true" : "false", fDbEnvInit ? "" : " database not started");
if (!fDbEnvInit)
return;
{
@@ -616,22 +616,22 @@ void BerkeleyEnvironment::Flush(bool fShutdown)
int nRefCount = db_it.second.get().m_refcount;
if (nRefCount < 0) continue;
const std::string strFile = fs::PathToString(filename);
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: Flushing %s (refcount = %d)...\n", strFile, nRefCount);
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: Flushing %s (refcount = %d)...\n", strFile, nRefCount);
if (nRefCount == 0) {
// Move log data to the dat file
CloseDb(filename);
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s checkpoint\n", strFile);
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s checkpoint\n", strFile);
dbenv->txn_checkpoint(0, 0, 0);
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s detach\n", strFile);
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s detach\n", strFile);
if (!fMockDb)
dbenv->lsn_reset(strFile.c_str(), 0);
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s closed\n", strFile);
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: %s closed\n", strFile);
nRefCount = -1;
} else {
no_dbs_accessed = false;
}
}
- LogPrint(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: Flush(%s)%s took %15dms\n", fShutdown ? "true" : "false", fDbEnvInit ? "" : " database not started", Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
+ LogDebug(BCLog::WALLETDB, "BerkeleyEnvironment::Flush: Flush(%s)%s took %15dms\n", fShutdown ? "true" : "false", fDbEnvInit ? "" : " database not started", Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
if (fShutdown) {
char** listp;
if (no_dbs_accessed) {
@@ -660,7 +660,7 @@ bool BerkeleyDatabase::PeriodicFlush()
if (m_refcount < 0) return false;
const std::string strFile = fs::PathToString(m_filename);
- LogPrint(BCLog::WALLETDB, "Flushing %s\n", strFile);
+ LogDebug(BCLog::WALLETDB, "Flushing %s\n", strFile);
const auto start{SteadyClock::now()};
// Flush wallet file so it's self contained
@@ -668,7 +668,7 @@ bool BerkeleyDatabase::PeriodicFlush()
env->CheckpointLSN(strFile);
m_refcount = -1;
- LogPrint(BCLog::WALLETDB, "Flushed %s %dms\n", strFile, Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
+ LogDebug(BCLog::WALLETDB, "Flushed %s %dms\n", strFile, Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
return true;
}
diff --git a/src/wallet/coincontrol.h b/src/wallet/coincontrol.h
index b2f813383d..d36314312a 100644
--- a/src/wallet/coincontrol.h
+++ b/src/wallet/coincontrol.h
@@ -115,6 +115,8 @@ public:
std::optional<uint32_t> m_locktime;
//! Version
std::optional<uint32_t> m_version;
+ //! Caps weight of resulting tx
+ std::optional<int> m_max_tx_weight{std::nullopt};
CCoinControl();
diff --git a/src/wallet/coinselection.cpp b/src/wallet/coinselection.cpp
index f1706b6800..cee558088f 100644
--- a/src/wallet/coinselection.cpp
+++ b/src/wallet/coinselection.cpp
@@ -84,14 +84,14 @@ 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.
+ * @param int max_selection_weight The maximum allowed weight for a selection result to be valid.
* @returns The result of this coin selection algorithm, or std::nullopt
*/
static const size_t TOTAL_TRIES = 100000;
util::Result<SelectionResult> SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, const CAmount& cost_of_change,
- int max_weight)
+ int max_selection_weight)
{
SelectionResult result(selection_target, SelectionAlgorithm::BNB);
CAmount curr_value = 0;
@@ -128,7 +128,7 @@ util::Result<SelectionResult> SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool
curr_value > selection_target + cost_of_change || // Selected value is out of range, go back and try other branch
(curr_waste > best_waste && is_feerate_high)) { // Don't select things which we know will be more wasteful if the waste is increasing
backtrack = true;
- } else if (curr_selection_weight > max_weight) { // Exceeding weight for standard tx, cannot find more solutions by adding more inputs
+ } else if (curr_selection_weight > max_selection_weight) { // Selected UTXOs weight exceeds the maximum weight allowed, cannot find more solutions by adding more inputs
max_tx_weight_exceeded = true; // at least one selection attempt exceeded the max weight
backtrack = true;
} else if (curr_value >= selection_target) { // Selected value is within range
@@ -319,10 +319,10 @@ util::Result<SelectionResult> SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool
* 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.
+ * @param int max_selection_weight The maximum allowed weight for a selection result to be valid.
* @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)
+util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, CAmount change_target, int max_selection_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)
@@ -359,7 +359,7 @@ util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, c
// 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
+ int best_selection_weight = max_selection_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;
@@ -436,8 +436,8 @@ util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, c
// 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;
+ // best_selection_weight is initialized to max_selection_weight
+ if (curr_weight > max_selection_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]) {
@@ -535,7 +535,7 @@ public:
};
util::Result<SelectionResult> SelectCoinsSRD(const std::vector<OutputGroup>& utxo_pool, CAmount target_value, CAmount change_fee, FastRandomContext& rng,
- int max_weight)
+ int max_selection_weight)
{
SelectionResult result(target_value, SelectionAlgorithm::SRD);
std::priority_queue<OutputGroup, std::vector<OutputGroup>, MinOutputGroupComparator> heap;
@@ -549,7 +549,7 @@ util::Result<SelectionResult> SelectCoinsSRD(const std::vector<OutputGroup>& utx
std::vector<size_t> indexes;
indexes.resize(utxo_pool.size());
std::iota(indexes.begin(), indexes.end(), 0);
- Shuffle(indexes.begin(), indexes.end(), rng);
+ std::shuffle(indexes.begin(), indexes.end(), rng);
CAmount selected_eff_value = 0;
int weight = 0;
@@ -565,14 +565,14 @@ util::Result<SelectionResult> SelectCoinsSRD(const std::vector<OutputGroup>& utx
// If the selection weight exceeds the maximum allowed size, remove the least valuable inputs until we
// are below max weight.
- if (weight > max_weight) {
+ if (weight > max_selection_weight) {
max_tx_weight_exceeded = true; // mark it in case we don't find any useful result.
do {
const OutputGroup& to_remove_group = heap.top();
selected_eff_value -= to_remove_group.GetSelectionAmount();
weight -= to_remove_group.m_weight;
heap.pop();
- } while (!heap.empty() && weight > max_weight);
+ } while (!heap.empty() && weight > max_selection_weight);
}
// Now check if we are above the target
@@ -597,11 +597,12 @@ util::Result<SelectionResult> SelectCoinsSRD(const std::vector<OutputGroup>& utx
* nTargetValue, with indices corresponding to groups. If the ith
* entry is true, that means the ith group in groups was selected.
* param@[out] nBest Total amount of subset chosen that is closest to nTargetValue.
+ * paramp[in] max_selection_weight The maximum allowed weight for a selection result to be valid.
* param@[in] iterations Maximum number of tries.
*/
static void ApproximateBestSubset(FastRandomContext& insecure_rand, const std::vector<OutputGroup>& groups,
const CAmount& nTotalLower, const CAmount& nTargetValue,
- std::vector<char>& vfBest, CAmount& nBest, int iterations = 1000)
+ std::vector<char>& vfBest, CAmount& nBest, int max_selection_weight, int iterations = 1000)
{
std::vector<char> vfIncluded;
@@ -613,6 +614,7 @@ static void ApproximateBestSubset(FastRandomContext& insecure_rand, const std::v
{
vfIncluded.assign(groups.size(), false);
CAmount nTotal = 0;
+ int selected_coins_weight{0};
bool fReachedTarget = false;
for (int nPass = 0; nPass < 2 && !fReachedTarget; nPass++)
{
@@ -627,9 +629,9 @@ static void ApproximateBestSubset(FastRandomContext& insecure_rand, const std::v
if (nPass == 0 ? insecure_rand.randbool() : !vfIncluded[i])
{
nTotal += groups[i].GetSelectionAmount();
+ selected_coins_weight += groups[i].m_weight;
vfIncluded[i] = true;
- if (nTotal >= nTargetValue)
- {
+ if (nTotal >= nTargetValue && selected_coins_weight <= max_selection_weight) {
fReachedTarget = true;
// If the total is between nTargetValue and nBest, it's our new best
// approximation.
@@ -639,6 +641,7 @@ static void ApproximateBestSubset(FastRandomContext& insecure_rand, const std::v
vfBest = vfIncluded;
}
nTotal -= groups[i].GetSelectionAmount();
+ selected_coins_weight -= groups[i].m_weight;
vfIncluded[i] = false;
}
}
@@ -648,10 +651,11 @@ static void ApproximateBestSubset(FastRandomContext& insecure_rand, const std::v
}
util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, const CAmount& nTargetValue,
- CAmount change_target, FastRandomContext& rng, int max_weight)
+ CAmount change_target, FastRandomContext& rng, int max_selection_weight)
{
SelectionResult result(nTargetValue, SelectionAlgorithm::KNAPSACK);
+ bool max_weight_exceeded{false};
// List of values less than target
std::optional<OutputGroup> lowest_larger;
// Groups with selection amount smaller than the target and any change we might produce.
@@ -659,9 +663,13 @@ util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, c
std::vector<OutputGroup> applicable_groups;
CAmount nTotalLower = 0;
- Shuffle(groups.begin(), groups.end(), rng);
+ std::shuffle(groups.begin(), groups.end(), rng);
for (const OutputGroup& group : groups) {
+ if (group.m_weight > max_selection_weight) {
+ max_weight_exceeded = true;
+ continue;
+ }
if (group.GetSelectionAmount() == nTargetValue) {
result.AddInput(group);
return result;
@@ -677,11 +685,18 @@ util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, c
for (const auto& group : applicable_groups) {
result.AddInput(group);
}
- return result;
+ if (result.GetWeight() <= max_selection_weight) return result;
+ else max_weight_exceeded = true;
+
+ // Try something else
+ result.Clear();
}
if (nTotalLower < nTargetValue) {
- if (!lowest_larger) return util::Error();
+ if (!lowest_larger) {
+ if (max_weight_exceeded) return ErrorMaxWeightExceeded();
+ return util::Error();
+ }
result.AddInput(*lowest_larger);
return result;
}
@@ -691,9 +706,9 @@ util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, c
std::vector<char> vfBest;
CAmount nBest;
- ApproximateBestSubset(rng, applicable_groups, nTotalLower, nTargetValue, vfBest, nBest);
+ ApproximateBestSubset(rng, applicable_groups, nTotalLower, nTargetValue, vfBest, nBest, max_selection_weight);
if (nBest != nTargetValue && nTotalLower >= nTargetValue + change_target) {
- ApproximateBestSubset(rng, applicable_groups, nTotalLower, nTargetValue + change_target, vfBest, nBest);
+ ApproximateBestSubset(rng, applicable_groups, nTotalLower, nTargetValue + change_target, vfBest, nBest, max_selection_weight);
}
// If we have a bigger coin and (either the stochastic approximation didn't find a good solution,
@@ -709,7 +724,7 @@ util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, c
}
// If the result exceeds the maximum allowed size, return closest UTXO above the target
- if (result.GetWeight() > max_weight) {
+ if (result.GetWeight() > max_selection_weight) {
// No coin above target, nothing to do.
if (!lowest_larger) return ErrorMaxWeightExceeded();
@@ -725,10 +740,10 @@ util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, c
log_message += strprintf("%s ", FormatMoney(applicable_groups[i].m_value));
}
}
- LogPrint(BCLog::SELECTCOINS, "%stotal %s\n", log_message, FormatMoney(nBest));
+ LogDebug(BCLog::SELECTCOINS, "%stotal %s\n", log_message, FormatMoney(nBest));
}
}
-
+ Assume(result.GetWeight() <= max_selection_weight);
return result;
}
@@ -927,7 +942,7 @@ const std::set<std::shared_ptr<COutput>>& SelectionResult::GetInputSet() const
std::vector<std::shared_ptr<COutput>> SelectionResult::GetShuffledInputVector() const
{
std::vector<std::shared_ptr<COutput>> coins(m_selected_inputs.begin(), m_selected_inputs.end());
- Shuffle(coins.begin(), coins.end(), FastRandomContext());
+ std::shuffle(coins.begin(), coins.end(), FastRandomContext());
return coins;
}
diff --git a/src/wallet/coinselection.h b/src/wallet/coinselection.h
index 9fb000422c..08889c8e06 100644
--- a/src/wallet/coinselection.h
+++ b/src/wallet/coinselection.h
@@ -139,9 +139,9 @@ struct CoinSelectionParams {
/** Randomness to use in the context of coin selection. */
FastRandomContext& rng_fast;
/** Size of a change output in bytes, determined by the output type. */
- size_t change_output_size = 0;
+ int change_output_size = 0;
/** Size of the input to spend a change output in virtual bytes. */
- size_t change_spend_size = 0;
+ int change_spend_size = 0;
/** 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};
@@ -162,7 +162,7 @@ struct CoinSelectionParams {
CFeeRate m_discard_feerate;
/** Size of the transaction before coin selection, consisting of the header and recipient
* output(s), excluding the inputs and change output(s). */
- size_t tx_noinputs_size = 0;
+ int tx_noinputs_size = 0;
/** Indicate that we are subtracting the fee from outputs */
bool m_subtract_fee_outputs = false;
/** When true, always spend all (up to OUTPUT_GROUP_MAX_ENTRIES) or none of the outputs
@@ -174,10 +174,13 @@ struct CoinSelectionParams {
* 1) Received from other wallets, 2) replacing other txs, 3) that have been replaced.
*/
bool m_include_unsafe_inputs = false;
+ /** The maximum weight for this transaction. */
+ std::optional<int> m_max_tx_weight{std::nullopt};
- CoinSelectionParams(FastRandomContext& rng_fast, size_t change_output_size, size_t change_spend_size,
+ CoinSelectionParams(FastRandomContext& rng_fast, int change_output_size, int change_spend_size,
CAmount min_change_target, CFeeRate effective_feerate,
- CFeeRate long_term_feerate, CFeeRate discard_feerate, size_t tx_noinputs_size, bool avoid_partial)
+ CFeeRate long_term_feerate, CFeeRate discard_feerate, int tx_noinputs_size, bool avoid_partial,
+ std::optional<int> max_tx_weight = std::nullopt)
: rng_fast{rng_fast},
change_output_size(change_output_size),
change_spend_size(change_spend_size),
@@ -186,7 +189,8 @@ struct CoinSelectionParams {
m_long_term_feerate(long_term_feerate),
m_discard_feerate(discard_feerate),
tx_noinputs_size(tx_noinputs_size),
- m_avoid_partial_spends(avoid_partial)
+ m_avoid_partial_spends(avoid_partial),
+ m_max_tx_weight(max_tx_weight)
{
}
CoinSelectionParams(FastRandomContext& rng_fast)
@@ -255,7 +259,7 @@ struct OutputGroup
/** Total weight of the UTXOs in this group. */
int m_weight{0};
- OutputGroup() {}
+ OutputGroup() = default;
OutputGroup(const CoinSelectionParams& params) :
m_long_term_feerate(params.m_long_term_feerate),
m_subtract_fee_outputs(params.m_subtract_fee_outputs)
@@ -440,9 +444,9 @@ public:
};
util::Result<SelectionResult> SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, const CAmount& cost_of_change,
- int max_weight);
+ int max_selection_weight);
-util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, CAmount change_target, int max_weight);
+util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, CAmount change_target, int max_selection_weight);
/** Select coins by Single Random Draw. OutputGroups are selected randomly from the eligible
* outputs until the target is satisfied
@@ -450,15 +454,15 @@ util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, c
* @param[in] utxo_pool The positive effective value OutputGroups eligible for selection
* @param[in] target_value The target value to select for
* @param[in] rng The randomness source to shuffle coins
- * @param[in] max_weight The maximum allowed weight for a selection result to be valid
+ * @param[in] max_selection_weight The maximum allowed weight for a selection result to be valid
* @returns If successful, a valid SelectionResult, otherwise, util::Error
*/
util::Result<SelectionResult> SelectCoinsSRD(const std::vector<OutputGroup>& utxo_pool, CAmount target_value, CAmount change_fee, FastRandomContext& rng,
- int max_weight);
+ int max_selection_weight);
// Original coin selection algorithm as a fallback
util::Result<SelectionResult> KnapsackSolver(std::vector<OutputGroup>& groups, const CAmount& nTargetValue,
- CAmount change_target, FastRandomContext& rng, int max_weight);
+ CAmount change_target, FastRandomContext& rng, int max_selection_weight);
} // namespace wallet
#endif // BITCOIN_WALLET_COINSELECTION_H
diff --git a/src/wallet/crypter.cpp b/src/wallet/crypter.cpp
index 57a19fb5f2..ffb1d29e16 100644
--- a/src/wallet/crypter.cpp
+++ b/src/wallet/crypter.cpp
@@ -8,10 +8,11 @@
#include <crypto/aes.h>
#include <crypto/sha512.h>
+#include <type_traits>
#include <vector>
namespace wallet {
-int CCrypter::BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, const SecureString& strKeyData, int count, unsigned char *key,unsigned char *iv) const
+int CCrypter::BytesToKeySHA512AES(const std::span<const unsigned char> salt, const SecureString& key_data, int count, unsigned char* key, unsigned char* iv) const
{
// This mimics the behavior of openssl's EVP_BytesToKey with an aes256cbc
// cipher and sha512 message digest. Because sha512's output size (64b) is
@@ -24,8 +25,8 @@ int CCrypter::BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, cons
unsigned char buf[CSHA512::OUTPUT_SIZE];
CSHA512 di;
- di.Write((const unsigned char*)strKeyData.data(), strKeyData.size());
- di.Write(chSalt.data(), chSalt.size());
+ di.Write(UCharCast(key_data.data()), key_data.size());
+ di.Write(salt.data(), salt.size());
di.Finalize(buf);
for(int i = 0; i != count - 1; i++)
@@ -37,14 +38,16 @@ int CCrypter::BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, cons
return WALLET_CRYPTO_KEY_SIZE;
}
-bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
+bool CCrypter::SetKeyFromPassphrase(const SecureString& key_data, const std::span<const unsigned char> salt, const unsigned int rounds, const unsigned int derivation_method)
{
- if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE)
+ if (rounds < 1 || salt.size() != WALLET_CRYPTO_SALT_SIZE) {
return false;
+ }
int i = 0;
- if (nDerivationMethod == 0)
- i = BytesToKeySHA512AES(chSalt, strKeyData, nRounds, vchKey.data(), vchIV.data());
+ if (derivation_method == 0) {
+ i = BytesToKeySHA512AES(salt, key_data, rounds, vchKey.data(), vchIV.data());
+ }
if (i != (int)WALLET_CRYPTO_KEY_SIZE)
{
@@ -57,13 +60,14 @@ bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::v
return true;
}
-bool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV)
+bool CCrypter::SetKey(const CKeyingMaterial& new_key, const std::span<const unsigned char> new_iv)
{
- if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_IV_SIZE)
+ if (new_key.size() != WALLET_CRYPTO_KEY_SIZE || new_iv.size() != WALLET_CRYPTO_IV_SIZE) {
return false;
+ }
- memcpy(vchKey.data(), chNewKey.data(), chNewKey.size());
- memcpy(vchIV.data(), chNewIV.data(), chNewIV.size());
+ memcpy(vchKey.data(), new_key.data(), new_key.size());
+ memcpy(vchIV.data(), new_iv.data(), new_iv.size());
fKeySet = true;
return true;
@@ -87,21 +91,20 @@ bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned
return true;
}
-bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext) const
+bool CCrypter::Decrypt(const std::span<const unsigned char> ciphertext, CKeyingMaterial& plaintext) const
{
if (!fKeySet)
return false;
// plaintext will always be equal to or lesser than length of ciphertext
- int nLen = vchCiphertext.size();
-
- vchPlaintext.resize(nLen);
+ plaintext.resize(ciphertext.size());
AES256CBCDecrypt dec(vchKey.data(), vchIV.data(), true);
- nLen = dec.Decrypt(vchCiphertext.data(), vchCiphertext.size(), vchPlaintext.data());
- if(nLen == 0)
+ int len = dec.Decrypt(ciphertext.data(), ciphertext.size(), plaintext.data());
+ if (len == 0) {
return false;
- vchPlaintext.resize(nLen);
+ }
+ plaintext.resize(len);
return true;
}
@@ -115,26 +118,29 @@ bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vch
return cKeyCrypter.Encrypt(vchPlaintext, vchCiphertext);
}
-bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext)
+bool DecryptSecret(const CKeyingMaterial& master_key, const std::span<const unsigned char> ciphertext, const uint256& iv, CKeyingMaterial& plaintext)
{
- CCrypter cKeyCrypter;
- std::vector<unsigned char> chIV(WALLET_CRYPTO_IV_SIZE);
- memcpy(chIV.data(), &nIV, WALLET_CRYPTO_IV_SIZE);
- if(!cKeyCrypter.SetKey(vMasterKey, chIV))
+ CCrypter key_crypter;
+ static_assert(WALLET_CRYPTO_IV_SIZE <= std::remove_reference_t<decltype(iv)>::size());
+ const std::span iv_prefix{iv.data(), WALLET_CRYPTO_IV_SIZE};
+ if (!key_crypter.SetKey(master_key, iv_prefix)) {
return false;
- return cKeyCrypter.Decrypt(vchCiphertext, vchPlaintext);
+ }
+ return key_crypter.Decrypt(ciphertext, plaintext);
}
-bool DecryptKey(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key)
+bool DecryptKey(const CKeyingMaterial& master_key, const std::span<const unsigned char> crypted_secret, const CPubKey& pub_key, CKey& key)
{
- CKeyingMaterial vchSecret;
- if(!DecryptSecret(vMasterKey, vchCryptedSecret, vchPubKey.GetHash(), vchSecret))
+ CKeyingMaterial secret;
+ if (!DecryptSecret(master_key, crypted_secret, pub_key.GetHash(), secret)) {
return false;
+ }
- if (vchSecret.size() != 32)
+ if (secret.size() != 32) {
return false;
+ }
- key.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed());
- return key.VerifyPubKey(vchPubKey);
+ key.Set(secret.begin(), secret.end(), pub_key.IsCompressed());
+ return key.VerifyPubKey(pub_key);
}
} // namespace wallet
diff --git a/src/wallet/crypter.h b/src/wallet/crypter.h
index b776a9c497..944858fb3f 100644
--- a/src/wallet/crypter.h
+++ b/src/wallet/crypter.h
@@ -75,13 +75,13 @@ private:
std::vector<unsigned char, secure_allocator<unsigned char>> vchIV;
bool fKeySet;
- int BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, const SecureString& strKeyData, int count, unsigned char *key,unsigned char *iv) const;
+ int BytesToKeySHA512AES(std::span<const unsigned char> salt, const SecureString& key_data, int count, unsigned char* key, unsigned char* iv) const;
public:
- bool SetKeyFromPassphrase(const SecureString &strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod);
+ bool SetKeyFromPassphrase(const SecureString& key_data, std::span<const unsigned char> salt, const unsigned int rounds, const unsigned int derivation_method);
bool Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext) const;
- bool Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext) const;
- bool SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV);
+ bool Decrypt(std::span<const unsigned char> ciphertext, CKeyingMaterial& plaintext) const;
+ bool SetKey(const CKeyingMaterial& new_key, std::span<const unsigned char> new_iv);
void CleanKey()
{
@@ -104,8 +104,8 @@ public:
};
bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext);
-bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext);
-bool DecryptKey(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key);
+bool DecryptSecret(const CKeyingMaterial& master_key, std::span<const unsigned char> ciphertext, const uint256& iv, CKeyingMaterial& plaintext);
+bool DecryptKey(const CKeyingMaterial& master_key, std::span<const unsigned char> crypted_secret, const CPubKey& pub_key, CKey& key);
} // namespace wallet
#endif // BITCOIN_WALLET_CRYPTER_H
diff --git a/src/wallet/db.cpp b/src/wallet/db.cpp
index a5a5f8ec6f..1c007ba949 100644
--- a/src/wallet/db.cpp
+++ b/src/wallet/db.cpp
@@ -9,6 +9,7 @@
#include <util/fs.h>
#include <wallet/db.h>
+#include <algorithm>
#include <exception>
#include <fstream>
#include <string>
@@ -16,12 +17,12 @@
#include <vector>
namespace wallet {
-bool operator<(BytePrefix a, Span<const std::byte> b) { return a.prefix < b.subspan(0, std::min(a.prefix.size(), b.size())); }
-bool operator<(Span<const std::byte> a, BytePrefix b) { return a.subspan(0, std::min(a.size(), b.prefix.size())) < b.prefix; }
+bool operator<(BytePrefix a, Span<const std::byte> b) { return std::ranges::lexicographical_compare(a.prefix, b.subspan(0, std::min(a.prefix.size(), b.size()))); }
+bool operator<(Span<const std::byte> a, BytePrefix b) { return std::ranges::lexicographical_compare(a.subspan(0, std::min(a.size(), b.prefix.size())), b.prefix); }
-std::vector<fs::path> ListDatabases(const fs::path& wallet_dir)
+std::vector<std::pair<fs::path, std::string>> ListDatabases(const fs::path& wallet_dir)
{
- std::vector<fs::path> paths;
+ std::vector<std::pair<fs::path, std::string>> paths;
std::error_code ec;
for (auto it = fs::recursive_directory_iterator(wallet_dir, ec); it != fs::recursive_directory_iterator(); it.increment(ec)) {
@@ -38,21 +39,29 @@ std::vector<fs::path> ListDatabases(const fs::path& wallet_dir)
try {
const fs::path path{it->path().lexically_relative(wallet_dir)};
- if (it->status().type() == fs::file_type::directory &&
- (IsBDBFile(BDBDataFile(it->path())) || IsSQLiteFile(SQLiteDataFile(it->path())))) {
- // Found a directory which contains wallet.dat btree file, add it as a wallet.
- paths.emplace_back(path);
- } else if (it.depth() == 0 && it->symlink_status().type() == fs::file_type::regular && IsBDBFile(it->path())) {
+ if (it->status().type() == fs::file_type::directory) {
+ if (IsBDBFile(BDBDataFile(it->path()))) {
+ // Found a directory which contains wallet.dat btree file, add it as a wallet with BERKELEY format.
+ paths.emplace_back(path, "bdb");
+ } else if (IsSQLiteFile(SQLiteDataFile(it->path()))) {
+ // Found a directory which contains wallet.dat sqlite file, add it as a wallet with SQLITE format.
+ paths.emplace_back(path, "sqlite");
+ }
+ } else if (it.depth() == 0 && it->symlink_status().type() == fs::file_type::regular && it->path().extension() != ".bak") {
if (it->path().filename() == "wallet.dat") {
- // Found top-level wallet.dat btree file, add top level directory ""
+ // Found top-level wallet.dat file, add top level directory ""
// as a wallet.
- paths.emplace_back();
- } else {
+ if (IsBDBFile(it->path())) {
+ paths.emplace_back(fs::path(), "bdb");
+ } else if (IsSQLiteFile(it->path())) {
+ paths.emplace_back(fs::path(), "sqlite");
+ }
+ } else if (IsBDBFile(it->path())) {
// Found top-level btree file not called wallet.dat. Current bitcoin
// software will never create these files but will allow them to be
// opened in a shared database environment for backwards compatibility.
// Add it to the list of available wallets.
- paths.emplace_back(path);
+ paths.emplace_back(path, "bdb");
}
}
} catch (const std::exception& e) {
diff --git a/src/wallet/db.h b/src/wallet/db.h
index b45076d10c..049af8dd19 100644
--- a/src/wallet/db.h
+++ b/src/wallet/db.h
@@ -30,8 +30,8 @@ bool operator<(Span<const std::byte> a, BytePrefix b);
class DatabaseCursor
{
public:
- explicit DatabaseCursor() {}
- virtual ~DatabaseCursor() {}
+ explicit DatabaseCursor() = default;
+ virtual ~DatabaseCursor() = default;
DatabaseCursor(const DatabaseCursor&) = delete;
DatabaseCursor& operator=(const DatabaseCursor&) = delete;
@@ -56,8 +56,8 @@ private:
virtual bool HasKey(DataStream&& key) = 0;
public:
- explicit DatabaseBatch() {}
- virtual ~DatabaseBatch() {}
+ explicit DatabaseBatch() = default;
+ virtual ~DatabaseBatch() = default;
DatabaseBatch(const DatabaseBatch&) = delete;
DatabaseBatch& operator=(const DatabaseBatch&) = delete;
@@ -131,7 +131,7 @@ class WalletDatabase
public:
/** Create dummy DB handle */
WalletDatabase() : nUpdateCounter(0) {}
- virtual ~WalletDatabase() {};
+ virtual ~WalletDatabase() = default;
/** Open the database if it is not already opened. */
virtual void Open() = 0;
@@ -216,7 +216,7 @@ enum class DatabaseStatus {
};
/** Recursively list database paths in directory. */
-std::vector<fs::path> ListDatabases(const fs::path& path);
+std::vector<std::pair<fs::path, std::string>> ListDatabases(const fs::path& path);
void ReadDatabaseArgs(const ArgsManager& args, DatabaseOptions& options);
std::unique_ptr<WalletDatabase> MakeDatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);
diff --git a/src/wallet/interfaces.cpp b/src/wallet/interfaces.cpp
index 9fab1b2ee4..21e8a0b3bd 100644
--- a/src/wallet/interfaces.cpp
+++ b/src/wallet/interfaces.cpp
@@ -652,15 +652,30 @@ public:
};
return out;
}
+ bool isEncrypted(const std::string& wallet_name) override
+ {
+ auto wallets{GetWallets(m_context)};
+ auto it = std::find_if(wallets.begin(), wallets.end(), [&](std::shared_ptr<CWallet> w){ return w->GetName() == wallet_name; });
+ if (it != wallets.end()) return (*it)->IsCrypted();
+
+ // Unloaded wallet, read db
+ DatabaseOptions options;
+ options.require_existing = true;
+ DatabaseStatus status;
+ bilingual_str error;
+ auto db = MakeWalletDatabase(wallet_name, options, status, error);
+ if (!db) return false;
+ return WalletBatch(*db).IsEncrypted();
+ }
std::string getWalletDir() override
{
return fs::PathToString(GetWalletDir());
}
- std::vector<std::string> listWalletDir() override
+ std::vector<std::pair<std::string, std::string>> listWalletDir() override
{
- std::vector<std::string> paths;
- for (auto& path : ListDatabases(GetWalletDir())) {
- paths.push_back(fs::PathToString(path));
+ std::vector<std::pair<std::string, std::string>> paths;
+ for (auto& [path, format] : ListDatabases(GetWalletDir())) {
+ paths.emplace_back(fs::PathToString(path), format);
}
return paths;
}
diff --git a/src/wallet/load.cpp b/src/wallet/load.cpp
index fe35f6b223..2b5c021cda 100644
--- a/src/wallet/load.cpp
+++ b/src/wallet/load.cpp
@@ -69,7 +69,7 @@ bool VerifyWallets(WalletContext& context)
// Pass write=false because no need to write file and probably
// better not to. If unnamed wallet needs to be added next startup
// and the setting is empty, this code will just run again.
- chain.updateRwSetting("wallet", wallets, /* write= */ false);
+ chain.overwriteRwSetting("wallet", std::move(wallets), interfaces::SettingsAction::SKIP_WRITE);
}
}
@@ -77,6 +77,11 @@ bool VerifyWallets(WalletContext& context)
std::set<fs::path> wallet_paths;
for (const auto& wallet : chain.getSettingsList("wallet")) {
+ if (!wallet.isStr()) {
+ chain.initError(_("Invalid value detected for '-wallet' or '-nowallet'. "
+ "'-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets"));
+ return false;
+ }
const auto& wallet_file = wallet.get_str();
const fs::path path = fsbridge::AbsPathJoin(GetWalletDir(), fs::PathFromString(wallet_file));
@@ -110,6 +115,11 @@ bool LoadWallets(WalletContext& context)
try {
std::set<fs::path> wallet_paths;
for (const auto& wallet : chain.getSettingsList("wallet")) {
+ if (!wallet.isStr()) {
+ chain.initError(_("Invalid value detected for '-wallet' or '-nowallet'. "
+ "'-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets"));
+ return false;
+ }
const auto& name = wallet.get_str();
if (!wallet_paths.insert(fs::PathFromString(name)).second) {
continue;
@@ -178,7 +188,7 @@ void UnloadWallets(WalletContext& context)
wallets.pop_back();
std::vector<bilingual_str> warnings;
RemoveWallet(context, wallet, /* load_on_start= */ std::nullopt, warnings);
- UnloadWallet(std::move(wallet));
+ WaitForDeleteWallet(std::move(wallet));
}
}
} // namespace wallet
diff --git a/src/wallet/migrate.h b/src/wallet/migrate.h
index e4826450af..58c8c0adf4 100644
--- a/src/wallet/migrate.h
+++ b/src/wallet/migrate.h
@@ -28,7 +28,7 @@ public:
{
if (open) Open();
}
- ~BerkeleyRODatabase(){};
+ ~BerkeleyRODatabase() = default;
BerkeleyROData m_records;
@@ -81,7 +81,7 @@ private:
public:
explicit BerkeleyROCursor(const BerkeleyRODatabase& database, Span<const std::byte> prefix = {});
- ~BerkeleyROCursor() {}
+ ~BerkeleyROCursor() = default;
Status Next(DataStream& key, DataStream& value) override;
};
@@ -102,7 +102,7 @@ private:
public:
explicit BerkeleyROBatch(const BerkeleyRODatabase& database) : m_database(database) {}
- ~BerkeleyROBatch() {}
+ ~BerkeleyROBatch() = default;
BerkeleyROBatch(const BerkeleyROBatch&) = delete;
BerkeleyROBatch& operator=(const BerkeleyROBatch&) = delete;
diff --git a/src/wallet/rpc/addresses.cpp b/src/wallet/rpc/addresses.cpp
index 0c2ad06eea..838d062108 100644
--- a/src/wallet/rpc/addresses.cpp
+++ b/src/wallet/rpc/addresses.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2022 The Bitcoin Core developers
+// Copyright (c) 2011-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.
@@ -501,6 +501,7 @@ public:
}
UniValue operator()(const WitnessV1Taproot& id) const { return UniValue(UniValue::VOBJ); }
+ UniValue operator()(const PayToAnchor& id) const { return UniValue(UniValue::VOBJ); }
UniValue operator()(const WitnessUnknown& id) const { return UniValue(UniValue::VOBJ); }
};
@@ -528,13 +529,13 @@ RPCHelpMan getaddressinfo()
RPCResult::Type::OBJ, "", "",
{
{RPCResult::Type::STR, "address", "The bitcoin address validated."},
- {RPCResult::Type::STR_HEX, "scriptPubKey", "The hex-encoded scriptPubKey generated by the address."},
+ {RPCResult::Type::STR_HEX, "scriptPubKey", "The hex-encoded output script generated by the address."},
{RPCResult::Type::BOOL, "ismine", "If the address is yours."},
{RPCResult::Type::BOOL, "iswatchonly", "If the address is watchonly."},
{RPCResult::Type::BOOL, "solvable", "If we know how to spend coins sent to this address, ignoring the possible lack of private keys."},
{RPCResult::Type::STR, "desc", /*optional=*/true, "A descriptor for spending coins sent to this address (only when solvable)."},
{RPCResult::Type::STR, "parent_desc", /*optional=*/true, "The descriptor used to derive this address if this is a descriptor wallet"},
- {RPCResult::Type::BOOL, "isscript", "If the key is a script."},
+ {RPCResult::Type::BOOL, "isscript", /*optional=*/true, "If the key is a script."},
{RPCResult::Type::BOOL, "ischange", "If the address was used for change output."},
{RPCResult::Type::BOOL, "iswitness", "If the address is a witness address."},
{RPCResult::Type::NUM, "witness_version", /*optional=*/true, "The version number of the witness program."},
diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp
index 8cddb8b099..20d09b1d9a 100644
--- a/src/wallet/rpc/backup.cpp
+++ b/src/wallet/rpc/backup.cpp
@@ -471,7 +471,7 @@ RPCHelpMan importpubkey()
pwallet->ImportScriptPubKeys(strLabel, script_pub_keys, /*have_solving_data=*/true, /*apply_label=*/true, /*timestamp=*/1);
- pwallet->ImportPubKeys({pubKey.GetID()}, {{pubKey.GetID(), pubKey}} , /*key_origins=*/{}, /*add_keypool=*/false, /*internal=*/false, /*timestamp=*/1);
+ pwallet->ImportPubKeys({{pubKey.GetID(), false}}, {{pubKey.GetID(), pubKey}} , /*key_origins=*/{}, /*add_keypool=*/false, /*timestamp=*/1);
}
if (fRescan)
{
@@ -910,12 +910,13 @@ static std::string RecurseImportData(const CScript& script, ImportData& import_d
case TxoutType::NONSTANDARD:
case TxoutType::WITNESS_UNKNOWN:
case TxoutType::WITNESS_V1_TAPROOT:
+ case TxoutType::ANCHOR:
return "unrecognized script";
} // no default case, so the compiler can warn about missing cases
NONFATAL_UNREACHABLE();
}
-static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<CKeyID>& ordered_pubkeys)
+static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys)
{
UniValue warnings(UniValue::VARR);
@@ -981,7 +982,7 @@ static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CP
for (size_t i = 0; i < pubKeys.size(); ++i) {
CPubKey pubkey = HexToPubKey(pubKeys[i].get_str());
pubkey_map.emplace(pubkey.GetID(), pubkey);
- ordered_pubkeys.push_back(pubkey.GetID());
+ ordered_pubkeys.emplace_back(pubkey.GetID(), internal);
}
for (size_t i = 0; i < keys.size(); ++i) {
const auto& str = keys[i].get_str();
@@ -1054,28 +1055,36 @@ static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CP
return warnings;
}
-static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<CKeyID>& ordered_pubkeys)
+static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys)
{
UniValue warnings(UniValue::VARR);
const std::string& descriptor = data["desc"].get_str();
FlatSigningProvider keys;
std::string error;
- auto parsed_desc = Parse(descriptor, keys, error, /* require_checksum = */ true);
- if (!parsed_desc) {
+ auto parsed_descs = Parse(descriptor, keys, error, /* require_checksum = */ true);
+ if (parsed_descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
- if (parsed_desc->GetOutputType() == OutputType::BECH32M) {
+ if (parsed_descs.at(0)->GetOutputType() == OutputType::BECH32M) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Bech32m descriptors cannot be imported into legacy wallets");
}
- have_solving_data = parsed_desc->IsSolvable();
+ std::optional<bool> internal;
+ if (data.exists("internal")) {
+ if (parsed_descs.size() > 1) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot have multipath descriptor while also specifying \'internal\'");
+ }
+ internal = data["internal"].get_bool();
+ }
+
+ have_solving_data = parsed_descs.at(0)->IsSolvable();
const bool watch_only = data.exists("watchonly") ? data["watchonly"].get_bool() : false;
int64_t range_start = 0, range_end = 0;
- if (!parsed_desc->IsRange() && data.exists("range")) {
+ if (!parsed_descs.at(0)->IsRange() && data.exists("range")) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor");
- } else if (parsed_desc->IsRange()) {
+ } else if (parsed_descs.at(0)->IsRange()) {
if (!data.exists("range")) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Descriptor is ranged, please specify the range");
}
@@ -1084,25 +1093,34 @@ static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID
const UniValue& priv_keys = data.exists("keys") ? data["keys"].get_array() : UniValue();
- // Expand all descriptors to get public keys and scripts, and private keys if available.
- for (int i = range_start; i <= range_end; ++i) {
- FlatSigningProvider out_keys;
- std::vector<CScript> scripts_temp;
- parsed_desc->Expand(i, keys, scripts_temp, out_keys);
- std::copy(scripts_temp.begin(), scripts_temp.end(), std::inserter(script_pub_keys, script_pub_keys.end()));
- for (const auto& key_pair : out_keys.pubkeys) {
- ordered_pubkeys.push_back(key_pair.first);
- }
+ for (size_t j = 0; j < parsed_descs.size(); ++j) {
+ const auto& parsed_desc = parsed_descs.at(j);
+ bool desc_internal = internal.has_value() && internal.value();
+ if (parsed_descs.size() == 2) {
+ desc_internal = j == 1;
+ } else if (parsed_descs.size() > 2) {
+ CHECK_NONFATAL(!desc_internal);
+ }
+ // Expand all descriptors to get public keys and scripts, and private keys if available.
+ for (int i = range_start; i <= range_end; ++i) {
+ FlatSigningProvider out_keys;
+ std::vector<CScript> scripts_temp;
+ parsed_desc->Expand(i, keys, scripts_temp, out_keys);
+ std::copy(scripts_temp.begin(), scripts_temp.end(), std::inserter(script_pub_keys, script_pub_keys.end()));
+ for (const auto& key_pair : out_keys.pubkeys) {
+ ordered_pubkeys.emplace_back(key_pair.first, desc_internal);
+ }
- for (const auto& x : out_keys.scripts) {
- import_data.import_scripts.emplace(x.second);
- }
+ for (const auto& x : out_keys.scripts) {
+ import_data.import_scripts.emplace(x.second);
+ }
- parsed_desc->ExpandPrivate(i, keys, out_keys);
+ parsed_desc->ExpandPrivate(i, keys, out_keys);
- std::copy(out_keys.pubkeys.begin(), out_keys.pubkeys.end(), std::inserter(pubkey_map, pubkey_map.end()));
- std::copy(out_keys.keys.begin(), out_keys.keys.end(), std::inserter(privkey_map, privkey_map.end()));
- import_data.key_origins.insert(out_keys.origins.begin(), out_keys.origins.end());
+ std::copy(out_keys.pubkeys.begin(), out_keys.pubkeys.end(), std::inserter(pubkey_map, pubkey_map.end()));
+ std::copy(out_keys.keys.begin(), out_keys.keys.end(), std::inserter(privkey_map, privkey_map.end()));
+ import_data.key_origins.insert(out_keys.origins.begin(), out_keys.origins.end());
+ }
}
for (size_t i = 0; i < priv_keys.size(); ++i) {
@@ -1166,7 +1184,7 @@ static UniValue ProcessImport(CWallet& wallet, const UniValue& data, const int64
std::map<CKeyID, CPubKey> pubkey_map;
std::map<CKeyID, CKey> privkey_map;
std::set<CScript> script_pub_keys;
- std::vector<CKeyID> ordered_pubkeys;
+ std::vector<std::pair<CKeyID, bool>> ordered_pubkeys;
bool have_solving_data;
if (data.exists("scriptPubKey") && data.exists("desc")) {
@@ -1199,7 +1217,7 @@ static UniValue ProcessImport(CWallet& wallet, const UniValue& data, const int64
if (!wallet.ImportPrivKeys(privkey_map, timestamp)) {
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding key to wallet");
}
- if (!wallet.ImportPubKeys(ordered_pubkeys, pubkey_map, import_data.key_origins, add_keypool, internal, timestamp)) {
+ if (!wallet.ImportPubKeys(ordered_pubkeys, pubkey_map, import_data.key_origins, add_keypool, timestamp)) {
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding address to wallet");
}
if (!wallet.ImportScriptPubKeys(label, script_pub_keys, have_solving_data, !internal, timestamp)) {
@@ -1446,22 +1464,28 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
const std::string& descriptor = data["desc"].get_str();
const bool active = data.exists("active") ? data["active"].get_bool() : false;
- const bool internal = data.exists("internal") ? data["internal"].get_bool() : false;
const std::string label{LabelFromValue(data["label"])};
// Parse descriptor string
FlatSigningProvider keys;
std::string error;
- auto parsed_desc = Parse(descriptor, keys, error, /* require_checksum = */ true);
- if (!parsed_desc) {
+ auto parsed_descs = Parse(descriptor, keys, error, /* require_checksum = */ true);
+ if (parsed_descs.empty()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
+ std::optional<bool> internal;
+ if (data.exists("internal")) {
+ if (parsed_descs.size() > 1) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot have multipath descriptor while also specifying \'internal\'");
+ }
+ internal = data["internal"].get_bool();
+ }
// Range check
int64_t range_start = 0, range_end = 1, next_index = 0;
- if (!parsed_desc->IsRange() && data.exists("range")) {
+ if (!parsed_descs.at(0)->IsRange() && data.exists("range")) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor");
- } else if (parsed_desc->IsRange()) {
+ } else if (parsed_descs.at(0)->IsRange()) {
if (data.exists("range")) {
auto range = ParseDescriptorRange(data["range"]);
range_start = range.first;
@@ -1483,10 +1507,15 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
}
// Active descriptors must be ranged
- if (active && !parsed_desc->IsRange()) {
+ if (active && !parsed_descs.at(0)->IsRange()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Active descriptors must be ranged");
}
+ // Multipath descriptors should not have a label
+ if (parsed_descs.size() > 1 && data.exists("label")) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Multipath descriptors should not have a label");
+ }
+
// Ranged descriptors should not have a label
if (data.exists("range") && data.exists("label")) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Ranged descriptors should not have a label");
@@ -1498,7 +1527,7 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
}
// Combo descriptor check
- if (active && !parsed_desc->IsSingleType()) {
+ if (active && !parsed_descs.at(0)->IsSingleType()) {
throw JSONRPCError(RPC_WALLET_ERROR, "Combo descriptors cannot be set to active");
}
@@ -1507,61 +1536,70 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import private keys to a wallet with private keys disabled");
}
- // Need to ExpandPrivate to check if private keys are available for all pubkeys
- FlatSigningProvider expand_keys;
- std::vector<CScript> scripts;
- if (!parsed_desc->Expand(0, keys, scripts, expand_keys)) {
- throw JSONRPCError(RPC_WALLET_ERROR, "Cannot expand descriptor. Probably because of hardened derivations without private keys provided");
- }
- parsed_desc->ExpandPrivate(0, keys, expand_keys);
-
- // Check if all private keys are provided
- bool have_all_privkeys = !expand_keys.keys.empty();
- for (const auto& entry : expand_keys.origins) {
- const CKeyID& key_id = entry.first;
- CKey key;
- if (!expand_keys.GetKey(key_id, key)) {
- have_all_privkeys = false;
- break;
+ for (size_t j = 0; j < parsed_descs.size(); ++j) {
+ auto parsed_desc = std::move(parsed_descs[j]);
+ bool desc_internal = internal.has_value() && internal.value();
+ if (parsed_descs.size() == 2) {
+ desc_internal = j == 1;
+ } else if (parsed_descs.size() > 2) {
+ CHECK_NONFATAL(!desc_internal);
+ }
+ // Need to ExpandPrivate to check if private keys are available for all pubkeys
+ FlatSigningProvider expand_keys;
+ std::vector<CScript> scripts;
+ if (!parsed_desc->Expand(0, keys, scripts, expand_keys)) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "Cannot expand descriptor. Probably because of hardened derivations without private keys provided");
+ }
+ parsed_desc->ExpandPrivate(0, keys, expand_keys);
+
+ // Check if all private keys are provided
+ bool have_all_privkeys = !expand_keys.keys.empty();
+ for (const auto& entry : expand_keys.origins) {
+ const CKeyID& key_id = entry.first;
+ CKey key;
+ if (!expand_keys.GetKey(key_id, key)) {
+ have_all_privkeys = false;
+ break;
+ }
}
- }
- // If private keys are enabled, check some things.
- if (!wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
- if (keys.keys.empty()) {
- throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import descriptor without private keys to a wallet with private keys enabled");
- }
- if (!have_all_privkeys) {
- warnings.push_back("Not all private keys provided. Some wallet functionality may return unexpected errors");
- }
- }
+ // If private keys are enabled, check some things.
+ if (!wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
+ if (keys.keys.empty()) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import descriptor without private keys to a wallet with private keys enabled");
+ }
+ if (!have_all_privkeys) {
+ warnings.push_back("Not all private keys provided. Some wallet functionality may return unexpected errors");
+ }
+ }
- WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
+ WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
- // Check if the wallet already contains the descriptor
- auto existing_spk_manager = wallet.GetDescriptorScriptPubKeyMan(w_desc);
- if (existing_spk_manager) {
- if (!existing_spk_manager->CanUpdateToWalletDescriptor(w_desc, error)) {
- throw JSONRPCError(RPC_INVALID_PARAMETER, error);
+ // Check if the wallet already contains the descriptor
+ auto existing_spk_manager = wallet.GetDescriptorScriptPubKeyMan(w_desc);
+ if (existing_spk_manager) {
+ if (!existing_spk_manager->CanUpdateToWalletDescriptor(w_desc, error)) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, error);
+ }
}
- }
- // Add descriptor to the wallet
- auto spk_manager = wallet.AddWalletDescriptor(w_desc, keys, label, internal);
- if (spk_manager == nullptr) {
- throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s'", descriptor));
- }
+ // Add descriptor to the wallet
+ auto spk_manager = wallet.AddWalletDescriptor(w_desc, keys, label, desc_internal);
+ if (spk_manager == nullptr) {
+ throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s'", descriptor));
+ }
- // Set descriptor as active if necessary
- if (active) {
- if (!w_desc.descriptor->GetOutputType()) {
- warnings.push_back("Unknown output type, cannot set descriptor to active.");
+ // Set descriptor as active if necessary
+ if (active) {
+ if (!w_desc.descriptor->GetOutputType()) {
+ warnings.push_back("Unknown output type, cannot set descriptor to active.");
+ } else {
+ wallet.AddActiveScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), desc_internal);
+ }
} else {
- wallet.AddActiveScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), internal);
- }
- } else {
- if (w_desc.descriptor->GetOutputType()) {
- wallet.DeactivateScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), internal);
+ if (w_desc.descriptor->GetOutputType()) {
+ wallet.DeactivateScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), desc_internal);
+ }
}
}
@@ -1578,6 +1616,7 @@ RPCHelpMan importdescriptors()
{
return RPCHelpMan{"importdescriptors",
"\nImport descriptors. This will trigger a rescan of the blockchain based on the earliest timestamp of all descriptors being imported. Requires a new wallet backup.\n"
+ "When importing descriptors with multipath key expressions, if the multipath specifier contains exactly two elements, the descriptor produced from the second elements will be imported as an internal descriptor.\n"
"\nNote: This call can take over an hour to complete if using an early timestamp; during that time, other rpc calls\n"
"may report that the imported keys, addresses or scripts exist but related transactions are still missing.\n"
"The rescan is significantly faster if block filters are available (using startup option \"-blockfilterindex=1\").\n",
diff --git a/src/wallet/rpc/coins.cpp b/src/wallet/rpc/coins.cpp
index 2cf94a5722..f1430a3c60 100644
--- a/src/wallet/rpc/coins.cpp
+++ b/src/wallet/rpc/coins.cpp
@@ -530,19 +530,19 @@ RPCHelpMan listunspent()
{RPCResult::Type::NUM, "vout", "the vout value"},
{RPCResult::Type::STR, "address", /*optional=*/true, "the bitcoin address"},
{RPCResult::Type::STR, "label", /*optional=*/true, "The associated label, or \"\" for the default label"},
- {RPCResult::Type::STR, "scriptPubKey", "the script key"},
+ {RPCResult::Type::STR, "scriptPubKey", "the output script"},
{RPCResult::Type::STR_AMOUNT, "amount", "the transaction output amount in " + CURRENCY_UNIT},
{RPCResult::Type::NUM, "confirmations", "The number of confirmations"},
{RPCResult::Type::NUM, "ancestorcount", /*optional=*/true, "The number of in-mempool ancestor transactions, including this one (if transaction is in the mempool)"},
{RPCResult::Type::NUM, "ancestorsize", /*optional=*/true, "The virtual transaction size of in-mempool ancestors, including this one (if transaction is in the mempool)"},
{RPCResult::Type::STR_AMOUNT, "ancestorfees", /*optional=*/true, "The total fees of in-mempool ancestors (including this one) with fee deltas used for mining priority in " + CURRENCY_ATOM + " (if transaction is in the mempool)"},
- {RPCResult::Type::STR_HEX, "redeemScript", /*optional=*/true, "The redeemScript if scriptPubKey is P2SH"},
- {RPCResult::Type::STR, "witnessScript", /*optional=*/true, "witnessScript if the scriptPubKey is P2WSH or P2SH-P2WSH"},
+ {RPCResult::Type::STR_HEX, "redeemScript", /*optional=*/true, "The redeem script if the output script is P2SH"},
+ {RPCResult::Type::STR, "witnessScript", /*optional=*/true, "witness script if the output script is P2WSH or P2SH-P2WSH"},
{RPCResult::Type::BOOL, "spendable", "Whether we have the private keys to spend this output"},
{RPCResult::Type::BOOL, "solvable", "Whether we know how to spend this output, ignoring the lack of keys"},
{RPCResult::Type::BOOL, "reused", /*optional=*/true, "(only present if avoid_reuse is set) Whether this output is reused/dirty (sent to an address that was previously spent from)"},
{RPCResult::Type::STR, "desc", /*optional=*/true, "(only when solvable) A descriptor for spending this output"},
- {RPCResult::Type::ARR, "parent_descs", /*optional=*/false, "List of parent descriptors for the scriptPubKey of this coin.", {
+ {RPCResult::Type::ARR, "parent_descs", /*optional=*/false, "List of parent descriptors for the output script of this coin.", {
{RPCResult::Type::STR, "desc", "The descriptor string."},
}},
{RPCResult::Type::BOOL, "safe", "Whether this output is considered safe to spend. Unconfirmed transactions\n"
diff --git a/src/wallet/rpc/spend.cpp b/src/wallet/rpc/spend.cpp
index ac2a4826f0..bea9b2eec1 100644
--- a/src/wallet/rpc/spend.cpp
+++ b/src/wallet/rpc/spend.cpp
@@ -24,7 +24,7 @@
#include <univalue.h>
using common::FeeModeFromString;
-using common::FeeModes;
+using common::FeeModesDetail;
using common::InvalidEstimateModeErrorMessage;
using common::StringForFeeReason;
using common::TransactionErrorString;
@@ -245,7 +245,7 @@ RPCHelpMan sendtoaddress()
{"replaceable", RPCArg::Type::BOOL, RPCArg::DefaultHint{"wallet default"}, "Signal that this transaction can be replaced by a transaction (BIP 125)"},
{"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks"},
{"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n"
- "\"" + FeeModes("\"\n\"") + "\""},
+ + FeeModesDetail(std::string("economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
{"avoid_reuse", RPCArg::Type::BOOL, RPCArg::Default{true}, "(only available if avoid_reuse wallet flag is set) Avoid spending from dirty addresses; addresses are considered\n"
"dirty if they have previously been used in a transaction. If true, this also activates avoidpartialspends, grouping outputs by their addresses."},
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."},
@@ -349,7 +349,7 @@ RPCHelpMan sendmany()
{"replaceable", RPCArg::Type::BOOL, RPCArg::DefaultHint{"wallet default"}, "Signal that this transaction can be replaced by a transaction (BIP 125)"},
{"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks"},
{"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n"
- "\"" + FeeModes("\"\n\"") + "\""},
+ + FeeModesDetail(std::string("economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."},
{"verbose", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, return extra information about the transaction."},
},
@@ -463,7 +463,7 @@ static std::vector<RPCArg> FundTxDoc(bool solving_data = true)
std::vector<RPCArg> args = {
{"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks", RPCArgOptions{.also_positional = true}},
{"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n"
- "\"" + FeeModes("\"\n\"") + "\"", RPCArgOptions{.also_positional = true}},
+ + FeeModesDetail(std::string("economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used")), RPCArgOptions{.also_positional = true}},
{
"replaceable", RPCArg::Type::BOOL, RPCArg::DefaultHint{"wallet default"}, "Marks this transaction as BIP125-replaceable.\n"
"Allows this transaction to be replaced by a transaction with higher fees"
@@ -542,6 +542,7 @@ CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransact
{"minconf", UniValueType(UniValue::VNUM)},
{"maxconf", UniValueType(UniValue::VNUM)},
{"input_weights", UniValueType(UniValue::VARR)},
+ {"max_tx_weight", UniValueType(UniValue::VNUM)},
},
true, true);
@@ -660,11 +661,13 @@ CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransact
FlatSigningProvider desc_out;
std::string error;
std::vector<CScript> scripts_temp;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, desc_out, error, true);
- if (!desc) {
+ auto descs = Parse(desc_str, desc_out, error, true);
+ if (descs.empty()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Unable to parse descriptor '%s': %s", desc_str, error));
}
- desc->Expand(0, desc_out, scripts_temp, desc_out);
+ for (auto& desc : descs) {
+ desc->Expand(0, desc_out, scripts_temp, desc_out);
+ }
coinControl.m_external_provider.Merge(std::move(desc_out));
}
}
@@ -701,6 +704,10 @@ CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransact
}
}
+ if (options.exists("max_tx_weight")) {
+ coinControl.m_max_tx_weight = options["max_tx_weight"].getInt<int>();
+ }
+
if (recipients.empty())
throw JSONRPCError(RPC_INVALID_PARAMETER, "TX must have at least one output");
@@ -786,6 +793,8 @@ RPCHelpMan fundrawtransaction()
},
},
},
+ {"max_tx_weight", RPCArg::Type::NUM, RPCArg::Default{MAX_STANDARD_TX_WEIGHT}, "The maximum acceptable transaction weight.\n"
+ "Transaction building will fail if this can not be satisfied."},
},
FundTxDoc()),
RPCArgOptions{
@@ -875,7 +884,7 @@ RPCHelpMan signrawtransactionwithwallet()
{
{"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
{"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
- {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "script key"},
+ {"scriptPubKey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The output script"},
{"redeemScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2SH) redeem script"},
{"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2WSH or P2SH-P2WSH) witness script"},
{"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "(required for Segwit inputs) the amount spent"},
@@ -1011,7 +1020,7 @@ static RPCHelpMan bumpfee_helper(std::string method_name)
"still be replaceable in practice, for example if it has unconfirmed ancestors which\n"
"are replaceable).\n"},
{"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n"
- "\"" + FeeModes("\"\n\"") + "\""},
+ + FeeModesDetail(std::string("economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
{"outputs", RPCArg::Type::ARR, RPCArg::Default{UniValue::VARR}, "The outputs specified as key-value pairs.\n"
"Each key may only appear once, i.e. there can only be one 'data' output, and no address may be duplicated.\n"
"At least one output of either type must be specified.\n"
@@ -1198,7 +1207,7 @@ RPCHelpMan send()
RPCArgOptions{.skip_type_check = true}},
{"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks"},
{"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n"
- "\"" + FeeModes("\"\n\"") + "\""},
+ + FeeModesDetail(std::string("economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."},
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
Cat<std::vector<RPCArg>>(
@@ -1240,6 +1249,8 @@ RPCHelpMan send()
{"vout_index", RPCArg::Type::NUM, RPCArg::Optional::OMITTED, "The zero-based output index, before a change output is added."},
},
},
+ {"max_tx_weight", RPCArg::Type::NUM, RPCArg::Default{MAX_STANDARD_TX_WEIGHT}, "The maximum acceptable transaction weight.\n"
+ "Transaction building will fail if this can not be satisfied."},
},
FundTxDoc()),
RPCArgOptions{.oneline_description="options"}},
@@ -1287,6 +1298,9 @@ RPCHelpMan send()
// 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;
+ if (options.exists("max_tx_weight")) {
+ coin_control.m_max_tx_weight = options["max_tx_weight"].getInt<int>();
+ }
SetOptionsInputWeights(options["inputs"], options);
// 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
@@ -1319,7 +1333,7 @@ RPCHelpMan sendall()
},
{"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks"},
{"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n"
- "\"" + FeeModes("\"\n\"") + "\""},
+ + FeeModesDetail(std::string("economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."},
{
"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
@@ -1697,6 +1711,8 @@ RPCHelpMan walletcreatefundedpsbt()
{"vout_index", RPCArg::Type::NUM, RPCArg::Optional::OMITTED, "The zero-based output index, before a change output is added."},
},
},
+ {"max_tx_weight", RPCArg::Type::NUM, RPCArg::Default{MAX_STANDARD_TX_WEIGHT}, "The maximum acceptable transaction weight.\n"
+ "Transaction building will fail if this can not be satisfied."},
},
FundTxDoc()),
RPCArgOptions{.oneline_description="options"}},
diff --git a/src/wallet/rpc/transactions.cpp b/src/wallet/rpc/transactions.cpp
index 5abc983701..61cf36a6c1 100644
--- a/src/wallet/rpc/transactions.cpp
+++ b/src/wallet/rpc/transactions.cpp
@@ -415,13 +415,13 @@ static std::vector<RPCResult> TransactionDescriptionString()
{RPCResult::Type::NUM_TIME, "blocktime", /*optional=*/true, "The block time expressed in " + UNIX_EPOCH_TIME + "."},
{RPCResult::Type::STR_HEX, "txid", "The transaction id."},
{RPCResult::Type::STR_HEX, "wtxid", "The hash of serialized transaction, including witness data."},
- {RPCResult::Type::ARR, "walletconflicts", "Conflicting transaction ids.",
+ {RPCResult::Type::ARR, "walletconflicts", "Confirmed transactions that have been detected by the wallet to conflict with this transaction.",
{
{RPCResult::Type::STR_HEX, "txid", "The transaction id."},
}},
{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::ARR, "mempoolconflicts", "Transactions that directly conflict with either this transaction or an ancestor transaction",
+ {RPCResult::Type::ARR, "mempoolconflicts", "Transactions in the mempool that directly conflict with either this transaction or an ancestor transaction",
{
{RPCResult::Type::STR_HEX, "txid", "The transaction id."},
}},
@@ -431,7 +431,7 @@ static std::vector<RPCResult> TransactionDescriptionString()
{RPCResult::Type::STR, "comment", /*optional=*/true, "If a comment is associated with the transaction, only present if not empty."},
{RPCResult::Type::STR, "bip125-replaceable", "(\"yes|no|unknown\") Whether this transaction signals BIP125 replaceability or has an unconfirmed ancestor signaling BIP125 replaceability.\n"
"May be unknown for unconfirmed transactions not in the mempool because their unconfirmed ancestors are unknown."},
- {RPCResult::Type::ARR, "parent_descs", /*optional=*/true, "Only if 'category' is 'received'. List of parent descriptors for the scriptPubKey of this coin.", {
+ {RPCResult::Type::ARR, "parent_descs", /*optional=*/true, "Only if 'category' is 'received'. List of parent descriptors for the output script of this coin.", {
{RPCResult::Type::STR, "desc", "The descriptor string."},
}},
};
@@ -729,7 +729,7 @@ RPCHelpMan gettransaction()
{RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the \n"
"'send' category of transactions."},
{RPCResult::Type::BOOL, "abandoned", "'true' if the transaction has been abandoned (inputs are respendable)."},
- {RPCResult::Type::ARR, "parent_descs", /*optional=*/true, "Only if 'category' is 'received'. List of parent descriptors for the scriptPubKey of this coin.", {
+ {RPCResult::Type::ARR, "parent_descs", /*optional=*/true, "Only if 'category' is 'received'. List of parent descriptors for the output script of this coin.", {
{RPCResult::Type::STR, "desc", "The descriptor string."},
}},
}},
diff --git a/src/wallet/rpc/util.cpp b/src/wallet/rpc/util.cpp
index 67b5ae0fe2..ec3b7c1085 100644
--- a/src/wallet/rpc/util.cpp
+++ b/src/wallet/rpc/util.cpp
@@ -91,7 +91,7 @@ std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& reques
RPC_WALLET_NOT_FOUND, "No wallet is loaded. Load a wallet using loadwallet or create a new one with createwallet. (Note: A default wallet is no longer automatically created)");
}
throw JSONRPCError(RPC_WALLET_NOT_SPECIFIED,
- "Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path).");
+ "Multiple wallets are loaded. Please select which wallet to use by requesting the RPC through the /wallet/<walletname> URI path.");
}
void EnsureWalletIsUnlocked(const CWallet& wallet)
diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp
index 8c218ad766..39582b3f6a 100644
--- a/src/wallet/rpc/wallet.cpp
+++ b/src/wallet/rpc/wallet.cpp
@@ -68,7 +68,7 @@ static RPCHelpMan getwalletinfo()
{RPCResult::Type::NUM, "duration", "elapsed seconds since scan start"},
{RPCResult::Type::NUM, "progress", "scanning progress percentage [0.0, 1.0]"},
}, /*skip_type_check=*/true},
- {RPCResult::Type::BOOL, "descriptors", "whether this wallet uses descriptors for scriptPubKey management"},
+ {RPCResult::Type::BOOL, "descriptors", "whether this wallet uses descriptors for output script management"},
{RPCResult::Type::BOOL, "external_signer", "whether this wallet is configured to use an external signer such as a hardware wallet"},
{RPCResult::Type::BOOL, "blank", "Whether this wallet intentionally does not contain any keys, scripts, or descriptors"},
{RPCResult::Type::NUM_TIME, "birthtime", /*optional=*/true, "The start time for blocks scanning. It could be modified by (re)importing any descriptor with an earlier timestamp."},
@@ -169,7 +169,7 @@ static RPCHelpMan listwalletdir()
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
UniValue wallets(UniValue::VARR);
- for (const auto& path : ListDatabases(GetWalletDir())) {
+ for (const auto& [path, _] : ListDatabases(GetWalletDir())) {
UniValue wallet(UniValue::VOBJ);
wallet.pushKV("name", path.utf8string());
wallets.push_back(std::move(wallet));
@@ -495,7 +495,7 @@ static RPCHelpMan unloadwallet()
}
}
- UnloadWallet(std::move(wallet));
+ WaitForDeleteWallet(std::move(wallet));
UniValue result(UniValue::VOBJ);
PushWarnings(warnings, result);
diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp
index c64aff5fe2..46ec5dc1ac 100644
--- a/src/wallet/scriptpubkeyman.cpp
+++ b/src/wallet/scriptpubkeyman.cpp
@@ -84,7 +84,7 @@ bool PermitsUncompressed(IsMineSigVersion sigversion)
return sigversion == IsMineSigVersion::TOP || sigversion == IsMineSigVersion::P2SH;
}
-bool HaveKeys(const std::vector<valtype>& pubkeys, const LegacyScriptPubKeyMan& keystore)
+bool HaveKeys(const std::vector<valtype>& pubkeys, const LegacyDataSPKM& keystore)
{
for (const valtype& pubkey : pubkeys) {
CKeyID keyID = CPubKey(pubkey).GetID();
@@ -102,7 +102,7 @@ bool HaveKeys(const std::vector<valtype>& pubkeys, const LegacyScriptPubKeyMan&
//! scripts or simply treat any script that has been
//! stored in the keystore as spendable
// NOLINTNEXTLINE(misc-no-recursion)
-IsMineResult IsMineInner(const LegacyScriptPubKeyMan& keystore, const CScript& scriptPubKey, IsMineSigVersion sigversion, bool recurse_scripthash=true)
+IsMineResult IsMineInner(const LegacyDataSPKM& keystore, const CScript& scriptPubKey, IsMineSigVersion sigversion, bool recurse_scripthash=true)
{
IsMineResult ret = IsMineResult::NO;
@@ -115,6 +115,7 @@ IsMineResult IsMineInner(const LegacyScriptPubKeyMan& keystore, const CScript& s
case TxoutType::NULL_DATA:
case TxoutType::WITNESS_UNKNOWN:
case TxoutType::WITNESS_V1_TAPROOT:
+ case TxoutType::ANCHOR:
break;
case TxoutType::PUBKEY:
keyID = CPubKey(vSolutions[0]).GetID();
@@ -217,7 +218,7 @@ IsMineResult IsMineInner(const LegacyScriptPubKeyMan& keystore, const CScript& s
} // namespace
-isminetype LegacyScriptPubKeyMan::IsMine(const CScript& script) const
+isminetype LegacyDataSPKM::IsMine(const CScript& script) const
{
switch (IsMineInner(*this, script, IsMineSigVersion::TOP)) {
case IsMineResult::INVALID:
@@ -231,7 +232,7 @@ isminetype LegacyScriptPubKeyMan::IsMine(const CScript& script) const
assert(false);
}
-bool LegacyScriptPubKeyMan::CheckDecryptionKey(const CKeyingMaterial& master_key)
+bool LegacyDataSPKM::CheckDecryptionKey(const CKeyingMaterial& master_key)
{
{
LOCK(cs_KeyStore);
@@ -585,7 +586,7 @@ int64_t LegacyScriptPubKeyMan::GetTimeFirstKey() const
return nTimeFirstKey;
}
-std::unique_ptr<SigningProvider> LegacyScriptPubKeyMan::GetSolvingProvider(const CScript& script) const
+std::unique_ptr<SigningProvider> LegacyDataSPKM::GetSolvingProvider(const CScript& script) const
{
return std::make_unique<LegacySigningProvider>(*this);
}
@@ -721,7 +722,7 @@ void LegacyScriptPubKeyMan::UpdateTimeFirstKey(int64_t nCreateTime)
NotifyFirstKeyTimeChanged(this, nTimeFirstKey);
}
-bool LegacyScriptPubKeyMan::LoadKey(const CKey& key, const CPubKey &pubkey)
+bool LegacyDataSPKM::LoadKey(const CKey& key, const CPubKey &pubkey)
{
return AddKeyPubKeyInner(key, pubkey);
}
@@ -773,7 +774,7 @@ bool LegacyScriptPubKeyMan::AddKeyPubKeyWithDB(WalletBatch& batch, const CKey& s
return true;
}
-bool LegacyScriptPubKeyMan::LoadCScript(const CScript& redeemScript)
+bool LegacyDataSPKM::LoadCScript(const CScript& redeemScript)
{
/* A sanity check was added in pull #3843 to avoid adding redeemScripts
* that never can be redeemed. However, old wallets may still contain
@@ -788,18 +789,36 @@ bool LegacyScriptPubKeyMan::LoadCScript(const CScript& redeemScript)
return FillableSigningProvider::AddCScript(redeemScript);
}
+void LegacyDataSPKM::LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata& meta)
+{
+ LOCK(cs_KeyStore);
+ mapKeyMetadata[keyID] = meta;
+}
+
void LegacyScriptPubKeyMan::LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata& meta)
{
LOCK(cs_KeyStore);
+ LegacyDataSPKM::LoadKeyMetadata(keyID, meta);
UpdateTimeFirstKey(meta.nCreateTime);
- mapKeyMetadata[keyID] = meta;
+}
+
+void LegacyDataSPKM::LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata& meta)
+{
+ LOCK(cs_KeyStore);
+ m_script_metadata[script_id] = meta;
}
void LegacyScriptPubKeyMan::LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata& meta)
{
LOCK(cs_KeyStore);
+ LegacyDataSPKM::LoadScriptMetadata(script_id, meta);
UpdateTimeFirstKey(meta.nCreateTime);
- m_script_metadata[script_id] = meta;
+}
+
+bool LegacyDataSPKM::AddKeyPubKeyInner(const CKey& key, const CPubKey& pubkey)
+{
+ LOCK(cs_KeyStore);
+ return FillableSigningProvider::AddKeyPubKey(key, pubkey);
}
bool LegacyScriptPubKeyMan::AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey)
@@ -827,7 +846,7 @@ bool LegacyScriptPubKeyMan::AddKeyPubKeyInner(const CKey& key, const CPubKey &pu
return true;
}
-bool LegacyScriptPubKeyMan::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid)
+bool LegacyDataSPKM::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid)
{
// Set fDecryptionThoroughlyChecked to false when the checksum is invalid
if (!checksum_valid) {
@@ -837,7 +856,7 @@ bool LegacyScriptPubKeyMan::LoadCryptedKey(const CPubKey &vchPubKey, const std::
return AddCryptedKeyInner(vchPubKey, vchCryptedSecret);
}
-bool LegacyScriptPubKeyMan::AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
+bool LegacyDataSPKM::AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
{
LOCK(cs_KeyStore);
assert(mapKeys.empty());
@@ -865,13 +884,13 @@ bool LegacyScriptPubKeyMan::AddCryptedKey(const CPubKey &vchPubKey,
}
}
-bool LegacyScriptPubKeyMan::HaveWatchOnly(const CScript &dest) const
+bool LegacyDataSPKM::HaveWatchOnly(const CScript &dest) const
{
LOCK(cs_KeyStore);
return setWatchOnly.count(dest) > 0;
}
-bool LegacyScriptPubKeyMan::HaveWatchOnly() const
+bool LegacyDataSPKM::HaveWatchOnly() const
{
LOCK(cs_KeyStore);
return (!setWatchOnly.empty());
@@ -905,12 +924,12 @@ bool LegacyScriptPubKeyMan::RemoveWatchOnly(const CScript &dest)
return true;
}
-bool LegacyScriptPubKeyMan::LoadWatchOnly(const CScript &dest)
+bool LegacyDataSPKM::LoadWatchOnly(const CScript &dest)
{
return AddWatchOnlyInMem(dest);
}
-bool LegacyScriptPubKeyMan::AddWatchOnlyInMem(const CScript &dest)
+bool LegacyDataSPKM::AddWatchOnlyInMem(const CScript &dest)
{
LOCK(cs_KeyStore);
setWatchOnly.insert(dest);
@@ -954,7 +973,7 @@ bool LegacyScriptPubKeyMan::AddWatchOnly(const CScript& dest, int64_t nCreateTim
return AddWatchOnly(dest);
}
-void LegacyScriptPubKeyMan::LoadHDChain(const CHDChain& chain)
+void LegacyDataSPKM::LoadHDChain(const CHDChain& chain)
{
LOCK(cs_KeyStore);
m_hd_chain = chain;
@@ -975,14 +994,14 @@ void LegacyScriptPubKeyMan::AddHDChain(const CHDChain& chain)
m_hd_chain = chain;
}
-void LegacyScriptPubKeyMan::AddInactiveHDChain(const CHDChain& chain)
+void LegacyDataSPKM::AddInactiveHDChain(const CHDChain& chain)
{
LOCK(cs_KeyStore);
assert(!chain.seed_id.IsNull());
m_inactive_hd_chains[chain.seed_id] = chain;
}
-bool LegacyScriptPubKeyMan::HaveKey(const CKeyID &address) const
+bool LegacyDataSPKM::HaveKey(const CKeyID &address) const
{
LOCK(cs_KeyStore);
if (!m_storage.HasEncryptionKeys()) {
@@ -991,7 +1010,7 @@ bool LegacyScriptPubKeyMan::HaveKey(const CKeyID &address) const
return mapCryptedKeys.count(address) > 0;
}
-bool LegacyScriptPubKeyMan::GetKey(const CKeyID &address, CKey& keyOut) const
+bool LegacyDataSPKM::GetKey(const CKeyID &address, CKey& keyOut) const
{
LOCK(cs_KeyStore);
if (!m_storage.HasEncryptionKeys()) {
@@ -1010,7 +1029,7 @@ bool LegacyScriptPubKeyMan::GetKey(const CKeyID &address, CKey& keyOut) const
return false;
}
-bool LegacyScriptPubKeyMan::GetKeyOrigin(const CKeyID& keyID, KeyOriginInfo& info) const
+bool LegacyDataSPKM::GetKeyOrigin(const CKeyID& keyID, KeyOriginInfo& info) const
{
CKeyMetadata meta;
{
@@ -1030,7 +1049,7 @@ bool LegacyScriptPubKeyMan::GetKeyOrigin(const CKeyID& keyID, KeyOriginInfo& inf
return true;
}
-bool LegacyScriptPubKeyMan::GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const
+bool LegacyDataSPKM::GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const
{
LOCK(cs_KeyStore);
WatchKeyMap::const_iterator it = mapWatchKeys.find(address);
@@ -1041,7 +1060,7 @@ bool LegacyScriptPubKeyMan::GetWatchPubKey(const CKeyID &address, CPubKey &pubke
return false;
}
-bool LegacyScriptPubKeyMan::GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const
+bool LegacyDataSPKM::GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const
{
LOCK(cs_KeyStore);
if (!m_storage.HasEncryptionKeys()) {
@@ -1160,7 +1179,7 @@ void LegacyScriptPubKeyMan::DeriveNewChildKey(WalletBatch &batch, CKeyMetadata&
throw std::runtime_error(std::string(__func__) + ": writing HD chain model failed");
}
-void LegacyScriptPubKeyMan::LoadKeyPool(int64_t nIndex, const CKeyPool &keypool)
+void LegacyDataSPKM::LoadKeyPool(int64_t nIndex, const CKeyPool &keypool)
{
LOCK(cs_KeyStore);
if (keypool.m_pre_split) {
@@ -1623,13 +1642,13 @@ bool LegacyScriptPubKeyMan::ImportPrivKeys(const std::map<CKeyID, CKey>& privkey
return true;
}
-bool LegacyScriptPubKeyMan::ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp)
+bool LegacyScriptPubKeyMan::ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp)
{
WalletBatch batch(m_storage.GetDatabase());
for (const auto& entry : key_origins) {
AddKeyOriginWithDB(batch, entry.second.first, entry.second.second);
}
- for (const CKeyID& id : ordered_pubkeys) {
+ for (const auto& [id, internal] : ordered_pubkeys) {
auto entry = pubkey_map.find(id);
if (entry == pubkey_map.end()) {
continue;
@@ -1681,7 +1700,7 @@ std::set<CKeyID> LegacyScriptPubKeyMan::GetKeys() const
return set_address;
}
-std::unordered_set<CScript, SaltedSipHasher> LegacyScriptPubKeyMan::GetScriptPubKeys() const
+std::unordered_set<CScript, SaltedSipHasher> LegacyDataSPKM::GetScriptPubKeys() const
{
LOCK(cs_KeyStore);
std::unordered_set<CScript, SaltedSipHasher> spks;
@@ -1739,7 +1758,7 @@ std::unordered_set<CScript, SaltedSipHasher> LegacyScriptPubKeyMan::GetScriptPub
return spks;
}
-std::unordered_set<CScript, SaltedSipHasher> LegacyScriptPubKeyMan::GetNotMineScriptPubKeys() const
+std::unordered_set<CScript, SaltedSipHasher> LegacyDataSPKM::GetNotMineScriptPubKeys() const
{
LOCK(cs_KeyStore);
std::unordered_set<CScript, SaltedSipHasher> spks;
@@ -1749,7 +1768,7 @@ std::unordered_set<CScript, SaltedSipHasher> LegacyScriptPubKeyMan::GetNotMineSc
return spks;
}
-std::optional<MigrationData> LegacyScriptPubKeyMan::MigrateToDescriptor()
+std::optional<MigrationData> LegacyDataSPKM::MigrateToDescriptor()
{
LOCK(cs_KeyStore);
if (m_storage.IsLocked()) {
@@ -1812,11 +1831,12 @@ std::optional<MigrationData> LegacyScriptPubKeyMan::MigrateToDescriptor()
std::string desc_str = "combo(" + origin_str + HexStr(key.GetPubKey()) + ")";
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ std::vector<std::unique_ptr<Descriptor>> descs = Parse(desc_str, keys, error, false);
+ CHECK_NONFATAL(descs.size() == 1); // It shouldn't be possible to have an invalid or multipath descriptor
+ WalletDescriptor w_desc(std::move(descs.at(0)), creation_time, 0, 0, 0);
// Make the DescriptorScriptPubKeyMan and get the scriptPubKeys
- auto desc_spk_man = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(m_storage, w_desc, m_keypool_size));
+ auto desc_spk_man = std::make_unique<DescriptorScriptPubKeyMan>(m_storage, w_desc, /*keypool_size=*/0);
desc_spk_man->AddDescriptorKey(key, key.GetPubKey());
desc_spk_man->TopUp();
auto desc_spks = desc_spk_man->GetScriptPubKeys();
@@ -1856,12 +1876,13 @@ std::optional<MigrationData> LegacyScriptPubKeyMan::MigrateToDescriptor()
std::string desc_str = "combo(" + xpub + "/0h/" + ToString(i) + "h/*h)";
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
+ std::vector<std::unique_ptr<Descriptor>> descs = Parse(desc_str, keys, error, false);
+ CHECK_NONFATAL(descs.size() == 1); // It shouldn't be possible to have an invalid or multipath descriptor
uint32_t chain_counter = std::max((i == 1 ? chain.nInternalChainCounter : chain.nExternalChainCounter), (uint32_t)0);
- WalletDescriptor w_desc(std::move(desc), 0, 0, chain_counter, 0);
+ WalletDescriptor w_desc(std::move(descs.at(0)), 0, 0, chain_counter, 0);
// Make the DescriptorScriptPubKeyMan and get the scriptPubKeys
- auto desc_spk_man = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(m_storage, w_desc, m_keypool_size));
+ auto desc_spk_man = std::make_unique<DescriptorScriptPubKeyMan>(m_storage, w_desc, /*keypool_size=*/0);
desc_spk_man->AddDescriptorKey(master_key.key, master_key.key.GetPubKey());
desc_spk_man->TopUp();
auto desc_spks = desc_spk_man->GetScriptPubKeys();
@@ -1923,7 +1944,7 @@ std::optional<MigrationData> LegacyScriptPubKeyMan::MigrateToDescriptor()
} else {
// Make the DescriptorScriptPubKeyMan and get the scriptPubKeys
WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
- auto desc_spk_man = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(m_storage, w_desc, m_keypool_size));
+ auto desc_spk_man = std::make_unique<DescriptorScriptPubKeyMan>(m_storage, w_desc, /*keypool_size=*/0);
for (const auto& keyid : privkeyids) {
CKey key;
if (!GetKey(keyid, key)) {
@@ -2001,7 +2022,7 @@ std::optional<MigrationData> LegacyScriptPubKeyMan::MigrateToDescriptor()
return out;
}
-bool LegacyScriptPubKeyMan::DeleteRecords()
+bool LegacyDataSPKM::DeleteRecords()
{
LOCK(cs_KeyStore);
WalletBatch batch(m_storage.GetDatabase());
diff --git a/src/wallet/scriptpubkeyman.h b/src/wallet/scriptpubkeyman.h
index 4d9f7bb1fa..cf7b7eaf31 100644
--- a/src/wallet/scriptpubkeyman.h
+++ b/src/wallet/scriptpubkeyman.h
@@ -178,7 +178,7 @@ protected:
public:
explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
- virtual ~ScriptPubKeyMan() {};
+ virtual ~ScriptPubKeyMan() = default;
virtual util::Result<CTxDestination> GetNewDestination(const OutputType type) { return util::Error{Untranslated("Not supported")}; }
virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
@@ -254,9 +254,9 @@ public:
/** Prepends the wallet name in logging output to ease debugging in multi-wallet use cases */
template <typename... Params>
- void WalletLogPrintf(const char* fmt, Params... parameters) const
+ void WalletLogPrintf(util::ConstevalFormatString<sizeof...(Params)> wallet_fmt, const Params&... params) const
{
- LogPrintf(("%s " + std::string{fmt}).c_str(), m_storage.GetDisplayName(), parameters...);
+ LogInfo("%s %s", m_storage.GetDisplayName(), tfm::format(wallet_fmt, params...));
};
/** Watch-only address added */
@@ -278,31 +278,111 @@ static const std::unordered_set<OutputType> LEGACY_OUTPUT_TYPES {
class DescriptorScriptPubKeyMan;
-class LegacyScriptPubKeyMan : public ScriptPubKeyMan, public FillableSigningProvider
+// Manages the data for a LegacyScriptPubKeyMan.
+// This is the minimum necessary to load a legacy wallet so that it can be migrated.
+class LegacyDataSPKM : public ScriptPubKeyMan, public FillableSigningProvider
{
-private:
- //! keeps track of whether Unlock has run a thorough check before
- bool fDecryptionThoroughlyChecked = true;
-
+protected:
using WatchOnlySet = std::set<CScript>;
using WatchKeyMap = std::map<CKeyID, CPubKey>;
-
- WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
-
using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
CryptedKeyMap mapCryptedKeys GUARDED_BY(cs_KeyStore);
WatchOnlySet setWatchOnly GUARDED_BY(cs_KeyStore);
WatchKeyMap mapWatchKeys GUARDED_BY(cs_KeyStore);
+ /* the HD chain data model (external chain counters) */
+ CHDChain m_hd_chain;
+ std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
+
+ //! keeps track of whether Unlock has run a thorough check before
+ bool fDecryptionThoroughlyChecked = true;
+
+ bool AddWatchOnlyInMem(const CScript &dest);
+ virtual bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
+ bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
+
+public:
+ using ScriptPubKeyMan::ScriptPubKeyMan;
+
+ // Map from Key ID to key metadata.
+ std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
+
+ // Map from Script ID to key metadata (for watch-only keys).
+ std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
+
+ // ScriptPubKeyMan overrides
+ bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
+ std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
+ std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
+ uint256 GetID() const override { return uint256::ONE; }
+ // TODO: Remove IsMine when deleting LegacyScriptPubKeyMan
+ isminetype IsMine(const CScript& script) const override;
+
+ // FillableSigningProvider overrides
+ bool HaveKey(const CKeyID &address) const override;
+ bool GetKey(const CKeyID &address, CKey& keyOut) const override;
+ bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
+ bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
+
+ std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
+ std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
+ std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
+ int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
+ std::map<CKeyID, int64_t> m_pool_key_to_index;
+
+ //! Load metadata (used by LoadWallet)
+ virtual void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
+ virtual void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
+
+ //! Adds a watch-only address to the store, without saving it to disk (used by LoadWallet)
+ bool LoadWatchOnly(const CScript &dest);
+ //! Returns whether the watch-only script is in the wallet
+ bool HaveWatchOnly(const CScript &dest) const;
+ //! Returns whether there are any watch-only things in the wallet
+ bool HaveWatchOnly() const;
+ //! Adds a key to the store, without saving it to disk (used by LoadWallet)
+ bool LoadKey(const CKey& key, const CPubKey &pubkey);
+ //! Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
+ bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
+ //! Adds a CScript to the store
+ bool LoadCScript(const CScript& redeemScript);
+ //! Load a HD chain model (used by LoadWallet)
+ void LoadHDChain(const CHDChain& chain);
+ void AddInactiveHDChain(const CHDChain& chain);
+ const CHDChain& GetHDChain() const { return m_hd_chain; }
+ //! Load a keypool entry
+ void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
+
+ //! Fetches a pubkey from mapWatchKeys if it exists there
+ bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
+
+ /**
+ * Retrieves scripts that were imported by bugs into the legacy spkm and are
+ * simply invalid, such as a sh(sh(pkh())) script, or not watched.
+ */
+ std::unordered_set<CScript, SaltedSipHasher> GetNotMineScriptPubKeys() const;
+
+ /** Get the DescriptorScriptPubKeyMans (with private keys) that have the same scriptPubKeys as this LegacyScriptPubKeyMan.
+ * Does not modify this ScriptPubKeyMan. */
+ std::optional<MigrationData> MigrateToDescriptor();
+ /** Delete all the records ofthis LegacyScriptPubKeyMan from disk*/
+ bool DeleteRecords();
+};
+
+// Implements the full legacy wallet behavior
+class LegacyScriptPubKeyMan : public LegacyDataSPKM
+{
+private:
+ WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
+
// By default, do not scan any block until keys/scripts are generated/imported
int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = UNKNOWN_TIME;
//! Number of pre-generated keys/scripts (part of the look-ahead process, used to detect payments)
int64_t m_keypool_size GUARDED_BY(cs_KeyStore){DEFAULT_KEYPOOL_SIZE};
- bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
- bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
+ bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey) override;
/**
* Private version of AddWatchOnly method which does not accept a
@@ -315,7 +395,6 @@ private:
*/
bool AddWatchOnly(const CScript& dest) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript& dest) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
- bool AddWatchOnlyInMem(const CScript &dest);
//! Adds a watch-only address to the store, and saves it to disk.
bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript& dest, int64_t create_time) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
@@ -330,18 +409,9 @@ private:
/** Add a KeyOriginInfo to the wallet */
bool AddKeyOriginWithDB(WalletBatch& batch, const CPubKey& pubkey, const KeyOriginInfo& info);
- /* the HD chain data model (external chain counters) */
- CHDChain m_hd_chain;
- std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
-
/* HD derive new child key (on internal or external chain) */
void DeriveNewChildKey(WalletBatch& batch, CKeyMetadata& metadata, CKey& secret, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
- std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
- std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
- std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
- int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
- std::map<CKeyID, int64_t> m_pool_key_to_index;
// Tracks keypool indexes to CKeyIDs of keys that have been taken out of the keypool but may be returned to it
std::map<int64_t, CKeyID> m_index_to_reserved_key;
@@ -378,12 +448,10 @@ private:
bool TopUpChain(WalletBatch& batch, CHDChain& chain, unsigned int size);
public:
- LegacyScriptPubKeyMan(WalletStorage& storage, int64_t keypool_size) : ScriptPubKeyMan(storage), m_keypool_size(keypool_size) {}
+ LegacyScriptPubKeyMan(WalletStorage& storage, int64_t keypool_size) : LegacyDataSPKM(storage), m_keypool_size(keypool_size) {}
util::Result<CTxDestination> GetNewDestination(const OutputType type) override;
- isminetype IsMine(const CScript& script) const 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;
@@ -417,8 +485,6 @@ public:
bool CanGetAddresses(bool internal = false) const override;
- std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
-
bool CanProvide(const CScript& script, SignatureData& sigdata) override;
bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
@@ -427,64 +493,33 @@ public:
uint256 GetID() const override;
- // Map from Key ID to key metadata.
- std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
-
- // Map from Script ID to key metadata (for watch-only keys).
- std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
-
//! Adds a key to the store, and saves it to disk.
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override;
- //! Adds a key to the store, without saving it to disk (used by LoadWallet)
- bool LoadKey(const CKey& key, const CPubKey &pubkey);
//! Adds an encrypted key to the store, and saves it to disk.
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
- //! Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
- bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
- //! Adds a CScript to the store
- bool LoadCScript(const CScript& redeemScript);
//! Load metadata (used by LoadWallet)
- void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
- void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
+ void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata) override;
+ void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata) override;
//! Generate a new key
CPubKey GenerateNewKey(WalletBatch& batch, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
/* Set the HD chain model (chain child index counters) and writes it to the database */
void AddHDChain(const CHDChain& chain);
- //! Load a HD chain model (used by LoadWallet)
- void LoadHDChain(const CHDChain& chain);
- const CHDChain& GetHDChain() const { return m_hd_chain; }
- void AddInactiveHDChain(const CHDChain& chain);
- //! Adds a watch-only address to the store, without saving it to disk (used by LoadWallet)
- bool LoadWatchOnly(const CScript &dest);
- //! Returns whether the watch-only script is in the wallet
- bool HaveWatchOnly(const CScript &dest) const;
- //! Returns whether there are any watch-only things in the wallet
- bool HaveWatchOnly() const;
//! Remove a watch only script from the keystore
bool RemoveWatchOnly(const CScript &dest);
bool AddWatchOnly(const CScript& dest, int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
- //! Fetches a pubkey from mapWatchKeys if it exists there
- bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
-
/* SigningProvider overrides */
- bool HaveKey(const CKeyID &address) const override;
- bool GetKey(const CKeyID &address, CKey& keyOut) const override;
- bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
bool AddCScript(const CScript& redeemScript) override;
- bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
- //! Load a keypool entry
- void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
bool NewKeyPool();
void MarkPreSplitKeys() EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
- bool ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
+ bool ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
bool ImportScriptPubKeys(const std::set<CScript>& script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
/* Returns true if the wallet can generate new keys */
@@ -527,28 +562,15 @@ public:
const std::map<CKeyID, int64_t>& GetAllReserveKeys() const { return m_pool_key_to_index; }
std::set<CKeyID> GetKeys() const override;
- std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
-
- /**
- * Retrieves scripts that were imported by bugs into the legacy spkm and are
- * simply invalid, such as a sh(sh(pkh())) script, or not watched.
- */
- std::unordered_set<CScript, SaltedSipHasher> GetNotMineScriptPubKeys() const;
-
- /** Get the DescriptorScriptPubKeyMans (with private keys) that have the same scriptPubKeys as this LegacyScriptPubKeyMan.
- * Does not modify this ScriptPubKeyMan. */
- std::optional<MigrationData> MigrateToDescriptor();
- /** Delete all the records ofthis LegacyScriptPubKeyMan from disk*/
- bool DeleteRecords();
};
/** Wraps a LegacyScriptPubKeyMan so that it can be returned in a new unique_ptr. Does not provide privkeys */
class LegacySigningProvider : public SigningProvider
{
private:
- const LegacyScriptPubKeyMan& m_spk_man;
+ const LegacyDataSPKM& m_spk_man;
public:
- explicit LegacySigningProvider(const LegacyScriptPubKeyMan& spk_man) : m_spk_man(spk_man) {}
+ explicit LegacySigningProvider(const LegacyDataSPKM& spk_man) : m_spk_man(spk_man) {}
bool GetCScript(const CScriptID &scriptid, CScript& script) const override { return m_spk_man.GetCScript(scriptid, script); }
bool HaveCScript(const CScriptID &scriptid) const override { return m_spk_man.HaveCScript(scriptid); }
diff --git a/src/wallet/spend.cpp b/src/wallet/spend.cpp
index 0a59353052..7abf7f59c0 100644
--- a/src/wallet/spend.cpp
+++ b/src/wallet/spend.cpp
@@ -226,7 +226,7 @@ void CoinsResult::Erase(const std::unordered_set<COutPoint, SaltedOutpointHasher
void CoinsResult::Shuffle(FastRandomContext& rng_fast)
{
for (auto& it : coins) {
- ::Shuffle(it.second.begin(), it.second.end(), rng_fast);
+ std::shuffle(it.second.begin(), it.second.end(), rng_fast);
}
}
@@ -695,26 +695,35 @@ util::Result<SelectionResult> ChooseSelectionResult(interfaces::Chain& chain, co
}
};
- // Maximum allowed weight
- int max_inputs_weight = MAX_STANDARD_TX_WEIGHT - (coin_selection_params.tx_noinputs_size * WITNESS_SCALE_FACTOR);
+ // Maximum allowed weight for selected coins.
+ int max_transaction_weight = coin_selection_params.m_max_tx_weight.value_or(MAX_STANDARD_TX_WEIGHT);
+ int tx_weight_no_input = coin_selection_params.tx_noinputs_size * WITNESS_SCALE_FACTOR;
+ int max_selection_weight = max_transaction_weight - tx_weight_no_input;
+ if (max_selection_weight <= 0) {
+ return util::Error{_("Maximum transaction weight is less than transaction weight without inputs")};
+ }
// SFFO frequently causes issues in the context of changeless input sets: skip BnB when SFFO is active
if (!coin_selection_params.m_subtract_fee_outputs) {
- if (auto bnb_result{SelectCoinsBnB(groups.positive_group, nTargetValue, coin_selection_params.m_cost_of_change, max_inputs_weight)}) {
+ if (auto bnb_result{SelectCoinsBnB(groups.positive_group, nTargetValue, coin_selection_params.m_cost_of_change, max_selection_weight)}) {
results.push_back(*bnb_result);
} else append_error(std::move(bnb_result));
}
- // As Knapsack and SRD can create change, also deduce change weight.
- max_inputs_weight -= (coin_selection_params.change_output_size * WITNESS_SCALE_FACTOR);
+ // Deduct change weight because remaining Coin Selection algorithms can create change output
+ int change_outputs_weight = coin_selection_params.change_output_size * WITNESS_SCALE_FACTOR;
+ max_selection_weight -= change_outputs_weight;
+ if (max_selection_weight < 0 && results.empty()) {
+ return util::Error{_("Maximum transaction weight is too low, can not accommodate change output")};
+ }
// The knapsack solver has some legacy behavior where it will spend dust outputs. We retain this behavior, so don't filter for positive only here.
- if (auto knapsack_result{KnapsackSolver(groups.mixed_group, nTargetValue, coin_selection_params.m_min_change_target, coin_selection_params.rng_fast, max_inputs_weight)}) {
+ if (auto knapsack_result{KnapsackSolver(groups.mixed_group, nTargetValue, coin_selection_params.m_min_change_target, coin_selection_params.rng_fast, max_selection_weight)}) {
results.push_back(*knapsack_result);
} else append_error(std::move(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)}) {
+ if (auto cg_result{CoinGrinder(groups.positive_group, nTargetValue, coin_selection_params.m_min_change_target, max_selection_weight)}) {
cg_result->RecalculateWaste(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 {
@@ -722,7 +731,7 @@ util::Result<SelectionResult> ChooseSelectionResult(interfaces::Chain& chain, co
}
}
- if (auto srd_result{SelectCoinsSRD(groups.positive_group, nTargetValue, coin_selection_params.m_change_fee, coin_selection_params.rng_fast, max_inputs_weight)}) {
+ if (auto srd_result{SelectCoinsSRD(groups.positive_group, nTargetValue, coin_selection_params.m_change_fee, coin_selection_params.rng_fast, max_selection_weight)}) {
results.push_back(*srd_result);
} else append_error(std::move(srd_result));
@@ -801,7 +810,7 @@ util::Result<SelectionResult> SelectCoins(const CWallet& wallet, CoinsResult& av
coin_selection_params.m_change_fee);
// Verify we haven't exceeded the maximum allowed weight
- int max_inputs_weight = MAX_STANDARD_TX_WEIGHT - (coin_selection_params.tx_noinputs_size * WITNESS_SCALE_FACTOR);
+ int max_inputs_weight = coin_selection_params.m_max_tx_weight.value_or(MAX_STANDARD_TX_WEIGHT) - (coin_selection_params.tx_noinputs_size * WITNESS_SCALE_FACTOR);
if (op_selection_result->GetWeight() > max_inputs_weight) {
return util::Error{_("The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. "
"Please try sending a smaller amount or manually consolidating your wallet's UTXOs")};
@@ -1012,7 +1021,11 @@ static util::Result<CreatedTransactionResult> CreateTransactionInternal(
CoinSelectionParams coin_selection_params{rng_fast}; // Parameters for coin selection, init with dummy
coin_selection_params.m_avoid_partial_spends = coin_control.m_avoid_partial_spends;
coin_selection_params.m_include_unsafe_inputs = coin_control.m_include_unsafe_inputs;
-
+ coin_selection_params.m_max_tx_weight = coin_control.m_max_tx_weight.value_or(MAX_STANDARD_TX_WEIGHT);
+ int minimum_tx_weight = MIN_STANDARD_TX_NONWITNESS_SIZE * WITNESS_SCALE_FACTOR;
+ if (coin_selection_params.m_max_tx_weight.value() < minimum_tx_weight || coin_selection_params.m_max_tx_weight.value() > MAX_STANDARD_TX_WEIGHT) {
+ return util::Error{strprintf(_("Maximum transaction weight must be between %d and %d"), minimum_tx_weight, MAX_STANDARD_TX_WEIGHT)};
+ }
// Set the long term feerate estimate to the wallet's consolidate feerate
coin_selection_params.m_long_term_feerate = wallet.m_consolidate_feerate;
// Static vsize overhead + outputs vsize. 4 nVersion, 4 nLocktime, 1 input count, 1 witness overhead (dummy, flag, stack size)
@@ -1077,7 +1090,7 @@ static util::Result<CreatedTransactionResult> CreateTransactionInternal(
if (change_spend_size == -1) {
coin_selection_params.change_spend_size = DUMMY_NESTED_P2WPKH_INPUT_SIZE;
} else {
- coin_selection_params.change_spend_size = (size_t)change_spend_size;
+ coin_selection_params.change_spend_size = change_spend_size;
}
// Set discard feerate
diff --git a/src/wallet/sqlite.cpp b/src/wallet/sqlite.cpp
index 5e3a8179a2..f2110ea3f7 100644
--- a/src/wallet/sqlite.cpp
+++ b/src/wallet/sqlite.cpp
@@ -52,7 +52,7 @@ static int TraceSqlCallback(unsigned code, void* context, void* param1, void* pa
// in the log file, only expand statements that query the database, not
// statements that update the database.
char* expanded{sqlite3_stmt_readonly(stmt) ? sqlite3_expanded_sql(stmt) : nullptr};
- LogPrintf("[%s] SQLite Statement: %s\n", db->Filename(), expanded ? expanded : sqlite3_sql(stmt));
+ LogTrace(BCLog::WALLETDB, "[%s] SQLite Statement: %s\n", db->Filename(), expanded ? expanded : sqlite3_sql(stmt));
if (expanded) sqlite3_free(expanded);
}
return SQLITE_OK;
diff --git a/src/wallet/sqlite.h b/src/wallet/sqlite.h
index 0a3243fe19..6b84f34366 100644
--- a/src/wallet/sqlite.h
+++ b/src/wallet/sqlite.h
@@ -26,7 +26,7 @@ public:
std::vector<std::byte> m_prefix_range_start;
std::vector<std::byte> m_prefix_range_end;
- explicit SQLiteCursor() {}
+ explicit SQLiteCursor() = default;
explicit SQLiteCursor(std::vector<std::byte> start_range, std::vector<std::byte> end_range)
: m_prefix_range_start(std::move(start_range)),
m_prefix_range_end(std::move(end_range))
@@ -41,7 +41,7 @@ public:
class SQliteExecHandler
{
public:
- virtual ~SQliteExecHandler() {}
+ virtual ~SQliteExecHandler() = default;
virtual int Exec(SQLiteDatabase& database, const std::string& statement);
};
diff --git a/src/wallet/test/CMakeLists.txt b/src/wallet/test/CMakeLists.txt
new file mode 100644
index 0000000000..7332674242
--- /dev/null
+++ b/src/wallet/test/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+# Do not use generator expressions in test sources because the
+# SOURCES property is processed to gather test suite macros.
+target_sources(test_bitcoin
+ PRIVATE
+ init_test_fixture.cpp
+ wallet_test_fixture.cpp
+ coinselector_tests.cpp
+ feebumper_tests.cpp
+ group_outputs_tests.cpp
+ init_tests.cpp
+ ismine_tests.cpp
+ psbt_wallet_tests.cpp
+ rpc_util_tests.cpp
+ scriptpubkeyman_tests.cpp
+ spend_tests.cpp
+ wallet_crypto_tests.cpp
+ wallet_tests.cpp
+ wallet_transaction_tests.cpp
+ walletdb_tests.cpp
+ walletload_tests.cpp
+)
+if(USE_BDB)
+ target_sources(test_bitcoin
+ PRIVATE
+ db_tests.cpp
+ )
+endif()
+target_link_libraries(test_bitcoin bitcoin_wallet)
diff --git a/src/wallet/test/coinselector_tests.cpp b/src/wallet/test/coinselector_tests.cpp
index 7bd92b471c..eb9c349c22 100644
--- a/src/wallet/test/coinselector_tests.cpp
+++ b/src/wallet/test/coinselector_tests.cpp
@@ -1097,13 +1097,13 @@ BOOST_AUTO_TEST_CASE(effective_value_test)
static util::Result<SelectionResult> CoinGrinder(const CAmount& target,
const CoinSelectionParams& cs_params,
const node::NodeContext& m_node,
- int max_weight,
+ int max_selection_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);
+ return CoinGrinder(group.positive_group, target, cs_params.m_min_change_target, max_selection_weight);
}
BOOST_AUTO_TEST_CASE(coin_grinder_tests)
@@ -1135,8 +1135,8 @@ BOOST_AUTO_TEST_CASE(coin_grinder_tests)
// 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) {
+ int max_selection_weight = 10'000; // high enough to not fail for this reason.
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_selection_weight, [&](CWallet& wallet) {
CoinsResult available_coins;
for (int j = 0; j < 10; ++j) {
add_coin(available_coins, wallet, CAmount(1 * COIN));
@@ -1153,8 +1153,8 @@ BOOST_AUTO_TEST_CASE(coin_grinder_tests)
// 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) {
+ int max_selection_weight = 3000;
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_selection_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);
@@ -1171,8 +1171,8 @@ BOOST_AUTO_TEST_CASE(coin_grinder_tests)
// 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) {
+ int max_selection_weight = 10'000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_selection_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);
@@ -1193,8 +1193,8 @@ BOOST_AUTO_TEST_CASE(coin_grinder_tests)
// 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) {
+ int max_selection_weight = 400'000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_selection_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);
@@ -1215,8 +1215,8 @@ BOOST_AUTO_TEST_CASE(coin_grinder_tests)
// 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) {
+ int max_selection_weight = 400'000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_selection_weight, [&](CWallet& wallet) {
CoinsResult available_coins;
for (int j = 0; j < 5; ++j) {
// Add heavy coins {3, 6, 9, 12, 15}
@@ -1244,8 +1244,8 @@ BOOST_AUTO_TEST_CASE(coin_grinder_tests)
// 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) {
+ int max_selection_weight = 400'000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_selection_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);
@@ -1283,8 +1283,8 @@ BOOST_AUTO_TEST_CASE(coin_grinder_tests)
// 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) {
+ int max_selection_weight = 40000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_selection_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);
@@ -1308,13 +1308,13 @@ BOOST_AUTO_TEST_CASE(coin_grinder_tests)
static util::Result<SelectionResult> SelectCoinsSRD(const CAmount& target,
const CoinSelectionParams& cs_params,
const node::NodeContext& m_node,
- int max_weight,
+ int max_selection_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 SelectCoinsSRD(group.positive_group, target, cs_params.m_change_fee, cs_params.rng_fast, max_weight);
+ return SelectCoinsSRD(group.positive_group, target, cs_params.m_change_fee, cs_params.rng_fast, max_selection_weight);
}
BOOST_AUTO_TEST_CASE(srd_tests)
@@ -1342,8 +1342,8 @@ BOOST_AUTO_TEST_CASE(srd_tests)
// 1) Insufficient funds, select all provided coins and fail
// #########################################################
CAmount target = 49.5L * COIN;
- int max_weight = 10000; // high enough to not fail for this reason.
- const auto& res = SelectCoinsSRD(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ int max_selection_weight = 10000; // high enough to not fail for this reason.
+ const auto& res = SelectCoinsSRD(target, dummy_params, m_node, max_selection_weight, [&](CWallet& wallet) {
CoinsResult available_coins;
for (int j = 0; j < 10; ++j) {
add_coin(available_coins, wallet, CAmount(1 * COIN));
@@ -1360,8 +1360,8 @@ BOOST_AUTO_TEST_CASE(srd_tests)
// 2) Test max weight exceeded
// ###########################
CAmount target = 49.5L * COIN;
- int max_weight = 3000;
- const auto& res = SelectCoinsSRD(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ int max_selection_weight = 3000;
+ const auto& res = SelectCoinsSRD(target, dummy_params, m_node, max_selection_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 */
@@ -1379,8 +1379,8 @@ BOOST_AUTO_TEST_CASE(srd_tests)
// 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 = 10000; // WU
- const auto& res = SelectCoinsSRD(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ int max_selection_weight = 10000; // WU
+ const auto& res = SelectCoinsSRD(target, dummy_params, m_node, max_selection_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(0), 144, false, 0, true);
@@ -1415,7 +1415,7 @@ static bool has_coin(const CoinSet& set, CAmount amount)
return std::any_of(set.begin(), set.end(), [&](const auto& coin) { return coin->GetEffectiveValue() == amount; });
}
-BOOST_AUTO_TEST_CASE(check_max_weight)
+BOOST_AUTO_TEST_CASE(check_max_selection_weight)
{
const CAmount target = 49.5L * COIN;
CCoinControl cc;
diff --git a/src/wallet/test/fuzz/CMakeLists.txt b/src/wallet/test/fuzz/CMakeLists.txt
new file mode 100644
index 0000000000..c30671db48
--- /dev/null
+++ b/src/wallet/test/fuzz/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+target_sources(fuzz
+ PRIVATE
+ coincontrol.cpp
+ coinselection.cpp
+ crypter.cpp
+ fees.cpp
+ $<$<BOOL:${USE_SQLITE}>:${CMAKE_CURRENT_LIST_DIR}/notifications.cpp>
+ parse_iso8601.cpp
+ $<$<BOOL:${USE_SQLITE}>:${CMAKE_CURRENT_LIST_DIR}/scriptpubkeyman.cpp>
+ wallet_bdb_parser.cpp
+)
+target_link_libraries(fuzz bitcoin_wallet)
diff --git a/src/wallet/test/fuzz/coinselection.cpp b/src/wallet/test/fuzz/coinselection.cpp
index 644a8dd7ad..31fa00c0a2 100644
--- a/src/wallet/test/fuzz/coinselection.cpp
+++ b/src/wallet/test/fuzz/coinselection.cpp
@@ -195,11 +195,11 @@ FUZZ_TARGET(coin_grinder_is_optimal)
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());
+ int high_max_selection_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);
+ auto result_cg = CoinGrinder(group_pos, target, coin_params.m_min_change_target, high_max_selection_weight);
assert(result_cg);
- assert(result_cg->GetWeight() <= high_max_weight);
+ assert(result_cg->GetWeight() <= high_max_selection_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()) {
@@ -210,8 +210,8 @@ FUZZ_TARGET(coin_grinder_is_optimal)
}
// 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);
+ int low_max_selection_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_selection_weight);
// Max_weight should have been exceeded, or there were insufficient funds
assert(!result_cg);
}
@@ -252,33 +252,38 @@ FUZZ_TARGET(coinselection)
GroupCoins(fuzzed_data_provider, utxo_pool, coin_params, /*positive_only=*/false, group_all);
for (const OutputGroup& group : group_all) {
- const CoinEligibilityFilter filter(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<uint64_t>());
+ const CoinEligibilityFilter filter{fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
(void)group.EligibleForSpending(filter);
}
+ int max_selection_weight = fuzzed_data_provider.ConsumeIntegralInRange<int>(0, std::numeric_limits<int>::max());
+
// Run coinselection algorithms
auto result_bnb = coin_params.m_subtract_fee_outputs ? util::Error{Untranslated("BnB disabled when SFFO is enabled")} :
- SelectCoinsBnB(group_pos, target, coin_params.m_cost_of_change, MAX_STANDARD_TX_WEIGHT);
+ SelectCoinsBnB(group_pos, target, coin_params.m_cost_of_change, max_selection_weight);
if (result_bnb) {
assert(result_bnb->GetChange(coin_params.min_viable_change, coin_params.m_change_fee) == 0);
assert(result_bnb->GetSelectedValue() >= target);
+ assert(result_bnb->GetWeight() <= max_selection_weight);
(void)result_bnb->GetShuffledInputVector();
(void)result_bnb->GetInputSet();
}
- auto result_srd = SelectCoinsSRD(group_pos, target, coin_params.m_change_fee, fast_random_context, MAX_STANDARD_TX_WEIGHT);
+ auto result_srd = SelectCoinsSRD(group_pos, target, coin_params.m_change_fee, fast_random_context, max_selection_weight);
if (result_srd) {
assert(result_srd->GetSelectedValue() >= target);
assert(result_srd->GetChange(CHANGE_LOWER, coin_params.m_change_fee) > 0); // Demonstrate that SRD creates change of at least CHANGE_LOWER
+ assert(result_srd->GetWeight() <= max_selection_weight);
result_srd->RecalculateWaste(coin_params.min_viable_change, coin_params.m_cost_of_change, coin_params.m_change_fee);
(void)result_srd->GetShuffledInputVector();
(void)result_srd->GetInputSet();
}
CAmount change_target{GenerateChangeTarget(target, coin_params.m_change_fee, fast_random_context)};
- auto result_knapsack = KnapsackSolver(group_all, target, change_target, fast_random_context, MAX_STANDARD_TX_WEIGHT);
+ auto result_knapsack = KnapsackSolver(group_all, target, change_target, fast_random_context, max_selection_weight);
if (result_knapsack) {
assert(result_knapsack->GetSelectedValue() >= target);
+ assert(result_knapsack->GetWeight() <= max_selection_weight);
result_knapsack->RecalculateWaste(coin_params.min_viable_change, coin_params.m_cost_of_change, coin_params.m_change_fee);
(void)result_knapsack->GetShuffledInputVector();
(void)result_knapsack->GetInputSet();
diff --git a/src/wallet/test/fuzz/crypter.cpp b/src/wallet/test/fuzz/crypter.cpp
index 62dd1bfde0..7869f5f39c 100644
--- a/src/wallet/test/fuzz/crypter.cpp
+++ b/src/wallet/test/fuzz/crypter.cpp
@@ -27,36 +27,31 @@ FUZZ_TARGET(crypter, .init = initialize_crypter)
// These values are regularly updated within `CallOneOf`
std::vector<unsigned char> cipher_text_ed;
CKeyingMaterial plain_text_ed;
- const std::vector<unsigned char> random_key = ConsumeRandomLengthByteVector(fuzzed_data_provider);
+ const std::vector<unsigned char> random_key = ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_KEY_SIZE);
- LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 10000)
+ if (fuzzed_data_provider.ConsumeBool()) {
+ const std::string random_string = fuzzed_data_provider.ConsumeRandomLengthString(100);
+ SecureString secure_string(random_string.begin(), random_string.end());
+
+ const unsigned int derivation_method = fuzzed_data_provider.ConsumeBool() ? 0 : fuzzed_data_provider.ConsumeIntegral<unsigned int>();
+
+ // Limiting the value of rounds since it is otherwise uselessly expensive and causes a timeout when fuzzing.
+ crypt.SetKeyFromPassphrase(/*key_data=*/secure_string,
+ /*salt=*/ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_SALT_SIZE),
+ /*rounds=*/fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, 25000),
+ /*derivation_method=*/derivation_method);
+ }
+
+ LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 100)
{
CallOneOf(
fuzzed_data_provider,
[&] {
- const std::string random_string = fuzzed_data_provider.ConsumeRandomLengthString();
- SecureString secure_string(random_string.begin(), random_string.end());
-
- const unsigned int derivation_method = fuzzed_data_provider.ConsumeBool() ? 0 : fuzzed_data_provider.ConsumeIntegral<unsigned int>();
-
- // Limiting the value of nRounds since it is otherwise uselessly expensive and causes a timeout when fuzzing.
- crypt.SetKeyFromPassphrase(/*strKeyData=*/secure_string,
- /*chSalt=*/ConsumeRandomLengthByteVector(fuzzed_data_provider),
- /*nRounds=*/fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, 25000),
- /*nDerivationMethod=*/derivation_method);
- },
- [&] {
- const std::vector<unsigned char> random_vector = ConsumeFixedLengthByteVector(fuzzed_data_provider, 32);
- const CKeyingMaterial new_key(random_vector.begin(), random_vector.end());
- const std::vector<unsigned char>& new_IV = ConsumeFixedLengthByteVector(fuzzed_data_provider, 16);
- crypt.SetKey(new_key, new_IV);
- },
- [&] {
- const std::vector<unsigned char> random_vector = ConsumeRandomLengthByteVector(fuzzed_data_provider);
+ const std::vector<unsigned char> random_vector = ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_KEY_SIZE);
plain_text_ed = CKeyingMaterial(random_vector.begin(), random_vector.end());
},
[&] {
- cipher_text_ed = ConsumeRandomLengthByteVector(fuzzed_data_provider);
+ cipher_text_ed = ConsumeRandomLengthByteVector(fuzzed_data_provider, 64);
},
[&] {
(void)crypt.Encrypt(plain_text_ed, cipher_text_ed);
@@ -67,12 +62,12 @@ FUZZ_TARGET(crypter, .init = initialize_crypter)
[&] {
const CKeyingMaterial master_key(random_key.begin(), random_key.end());
const uint256 iv = ConsumeUInt256(fuzzed_data_provider);
- EncryptSecret(master_key, plain_text_ed, iv, cipher_text_ed);
+ (void)EncryptSecret(master_key, plain_text_ed, iv, cipher_text_ed);
},
[&] {
const CKeyingMaterial master_key(random_key.begin(), random_key.end());
const uint256 iv = ConsumeUInt256(fuzzed_data_provider);
- DecryptSecret(master_key, cipher_text_ed, iv, plain_text_ed);
+ (void)DecryptSecret(master_key, cipher_text_ed, iv, plain_text_ed);
},
[&] {
std::optional<CPubKey> random_pub_key = ConsumeDeserializable<CPubKey>(fuzzed_data_provider);
@@ -82,9 +77,9 @@ FUZZ_TARGET(crypter, .init = initialize_crypter)
}
const CPubKey pub_key = *random_pub_key;
const CKeyingMaterial master_key(random_key.begin(), random_key.end());
- const std::vector<unsigned char> crypted_secret = ConsumeRandomLengthByteVector(fuzzed_data_provider);
+ const std::vector<unsigned char> crypted_secret = ConsumeRandomLengthByteVector(fuzzed_data_provider, 64);
CKey key;
- DecryptKey(master_key, crypted_secret, pub_key, key);
+ (void)DecryptKey(master_key, crypted_secret, pub_key, key);
});
}
}
diff --git a/src/wallet/test/fuzz/notifications.cpp b/src/wallet/test/fuzz/notifications.cpp
index 792079e6c6..a7015f6685 100644
--- a/src/wallet/test/fuzz/notifications.cpp
+++ b/src/wallet/test/fuzz/notifications.cpp
@@ -68,7 +68,7 @@ void ImportDescriptors(CWallet& wallet, const std::string& seed_insecure)
FlatSigningProvider keys;
std::string error;
- auto parsed_desc = Parse(descriptor, keys, error, /*require_checksum=*/false);
+ auto parsed_desc = std::move(Parse(descriptor, keys, error, /*require_checksum=*/false).at(0));
assert(parsed_desc);
assert(error.empty());
assert(parsed_desc->IsRange());
diff --git a/src/wallet/test/fuzz/scriptpubkeyman.cpp b/src/wallet/test/fuzz/scriptpubkeyman.cpp
index 835470aeae..091d42f6cf 100644
--- a/src/wallet/test/fuzz/scriptpubkeyman.cpp
+++ b/src/wallet/test/fuzz/scriptpubkeyman.cpp
@@ -69,10 +69,10 @@ static std::optional<std::pair<WalletDescriptor, FlatSigningProvider>> CreateWal
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> parsed_desc{Parse(desc_str.value(), keys, error, false)};
- if (!parsed_desc) return std::nullopt;
+ std::vector<std::unique_ptr<Descriptor>> parsed_descs = Parse(desc_str.value(), keys, error, false);
+ if (parsed_descs.empty()) return std::nullopt;
- WalletDescriptor w_desc{std::move(parsed_desc), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/1, /*next_index=*/1};
+ WalletDescriptor w_desc{std::move(parsed_descs.at(0)), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/1, /*next_index=*/1};
return std::make_pair(w_desc, keys);
}
@@ -94,6 +94,7 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
LOCK(wallet.cs_wallet);
wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
wallet.SetLastBlockProcessed(chainstate.m_chain.Height(), chainstate.m_chain.Tip()->GetBlockHash());
+ wallet.m_keypool_size = 1;
}
auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
@@ -101,23 +102,23 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
auto spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
if (spk_manager == nullptr) return;
+ if (fuzzed_data_provider.ConsumeBool()) {
+ auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
+ if (!wallet_desc.has_value()) {
+ return;
+ }
+ std::string error;
+ if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
+ auto new_spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
+ if (new_spk_manager != nullptr) spk_manager = new_spk_manager;
+ }
+ }
+
bool good_data{true};
- LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 300) {
+ LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 20) {
CallOneOf(
fuzzed_data_provider,
[&] {
- auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
- if (!wallet_desc.has_value()) {
- good_data = false;
- return;
- }
- std::string error;
- if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
- auto new_spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
- if (new_spk_manager != nullptr) spk_manager = new_spk_manager;
- }
- },
- [&] {
const CScript script{ConsumeScript(fuzzed_data_provider)};
auto is_mine{spk_manager->IsMine(script)};
if (is_mine == isminetype::ISMINE_SPENDABLE) {
@@ -143,30 +144,12 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
},
[&] {
auto spks{spk_manager->GetScriptPubKeys()};
- for (const CScript& spk : spks) {
- if (fuzzed_data_provider.ConsumeBool()) {
- spk_manager->MarkUnusedAddresses(spk);
- }
+ if (!spks.empty()) {
+ auto& spk{PickValue(fuzzed_data_provider, spks)};
+ (void)spk_manager->MarkUnusedAddresses(spk);
}
},
[&] {
- CKey key{ConsumePrivateKey(fuzzed_data_provider, /*compressed=*/fuzzed_data_provider.ConsumeBool())};
- if (!key.IsValid()) {
- good_data = false;
- return;
- }
- spk_manager->AddDescriptorKey(key, key.GetPubKey());
- spk_manager->TopUp();
- LOCK(spk_manager->cs_desc_man);
- auto particular_key{spk_manager->GetKey(key.GetPubKey().GetID())};
- assert(*particular_key == key);
- assert(spk_manager->HasPrivKey(key.GetPubKey().GetID()));
- },
- [&] {
- std::string descriptor;
- (void)spk_manager->GetDescriptorString(descriptor, /*priv=*/fuzzed_data_provider.ConsumeBool());
- },
- [&] {
LOCK(spk_manager->cs_desc_man);
auto wallet_desc{spk_manager->GetWalletDescriptor()};
if (wallet_desc.descriptor->IsSingleType()) {
@@ -203,11 +186,16 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
auto psbt{*opt_psbt};
const PrecomputedTransactionData txdata{PrecomputePSBTData(psbt)};
const int sighash_type{fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 150)};
- (void)spk_manager->FillPSBT(psbt, txdata, sighash_type, fuzzed_data_provider.ConsumeBool(), fuzzed_data_provider.ConsumeBool(), nullptr, fuzzed_data_provider.ConsumeBool());
+ auto sign = fuzzed_data_provider.ConsumeBool();
+ auto bip32derivs = fuzzed_data_provider.ConsumeBool();
+ auto finalize = fuzzed_data_provider.ConsumeBool();
+ (void)spk_manager->FillPSBT(psbt, txdata, sighash_type, sign, bip32derivs, nullptr, finalize);
}
);
}
+ std::string descriptor;
+ (void)spk_manager->GetDescriptorString(descriptor, /*priv=*/fuzzed_data_provider.ConsumeBool());
(void)spk_manager->GetEndRange();
(void)spk_manager->GetKeyPoolSize();
}
diff --git a/src/wallet/test/fuzz/wallet_bdb_parser.cpp b/src/wallet/test/fuzz/wallet_bdb_parser.cpp
index 6fbd695fc5..5ec24faede 100644
--- a/src/wallet/test/fuzz/wallet_bdb_parser.cpp
+++ b/src/wallet/test/fuzz/wallet_bdb_parser.cpp
@@ -18,6 +18,13 @@
#include <fstream>
#include <iostream>
+// There is an inconsistency in BDB on Windows.
+// See: https://github.com/bitcoin/bitcoin/pull/26606#issuecomment-2322763212
+#undef USE_BDB_NON_MSVC
+#if defined(USE_BDB) && !defined(_MSC_VER)
+#define USE_BDB_NON_MSVC
+#endif
+
using wallet::DatabaseOptions;
using wallet::DatabaseStatus;
@@ -50,7 +57,7 @@ FUZZ_TARGET(wallet_bdb_parser, .init = initialize_wallet_bdb_parser)
}
g_setup->m_args.ForceSetArg("-dumpfile", fs::PathToString(bdb_ro_dumpfile));
-#ifdef USE_BDB
+#ifdef USE_BDB_NON_MSVC
bool bdb_ro_err = false;
bool bdb_ro_strict_err = false;
#endif
@@ -58,7 +65,7 @@ FUZZ_TARGET(wallet_bdb_parser, .init = initialize_wallet_bdb_parser)
if (db) {
assert(DumpWallet(g_setup->m_args, *db, error));
} else {
-#ifdef USE_BDB
+#ifdef USE_BDB_NON_MSVC
bdb_ro_err = true;
#endif
if (error.original.starts_with("AutoFile::ignore: end of file") ||
@@ -90,7 +97,7 @@ FUZZ_TARGET(wallet_bdb_parser, .init = initialize_wallet_bdb_parser)
error.original == "Subdatabase has an unexpected name" ||
error.original == "Unsupported BDB data file version number" ||
error.original == "BDB builtin encryption is not supported") {
-#ifdef USE_BDB
+#ifdef USE_BDB_NON_MSVC
bdb_ro_strict_err = true;
#endif
} else {
@@ -98,7 +105,7 @@ FUZZ_TARGET(wallet_bdb_parser, .init = initialize_wallet_bdb_parser)
}
}
-#ifdef USE_BDB
+#ifdef USE_BDB_NON_MSVC
// Try opening with BDB
fs::path bdb_dumpfile{g_setup->m_args.GetDataDirNet() / "fuzzed_dumpfile_bdb.dump"};
if (fs::exists(bdb_dumpfile)) { // Writing into an existing dump file will throw an exception
diff --git a/src/wallet/test/ismine_tests.cpp b/src/wallet/test/ismine_tests.cpp
index dfad0e2126..f6688ed30a 100644
--- a/src/wallet/test/ismine_tests.cpp
+++ b/src/wallet/test/ismine_tests.cpp
@@ -15,6 +15,7 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
namespace wallet {
BOOST_FIXTURE_TEST_SUITE(ismine_tests, BasicTestingSetup)
@@ -25,13 +26,14 @@ wallet::ScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string&
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> parsed_desc = Parse(desc_str, keys, error, false);
- BOOST_CHECK(success == (parsed_desc != nullptr));
+ auto parsed_descs = Parse(desc_str, keys, error, false);
+ BOOST_CHECK(success == (!parsed_descs.empty()));
if (!success) return nullptr;
+ auto& desc = parsed_descs.at(0);
const int64_t range_start = 0, range_end = 1, next_index = 0, timestamp = 1;
- WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
+ WalletDescriptor w_desc(std::move(desc), timestamp, range_start, range_end, next_index);
LOCK(keystore.cs_wallet);
@@ -682,7 +684,7 @@ BOOST_AUTO_TEST_CASE(ismine_standard)
BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
scriptPubKey.clear();
- scriptPubKey << OP_0 << ToByteVector(ParseHex("aabb"));
+ scriptPubKey << OP_0 << "aabb"_hex;
result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
BOOST_CHECK_EQUAL(result, ISMINE_NO);
@@ -697,7 +699,7 @@ BOOST_AUTO_TEST_CASE(ismine_standard)
BOOST_CHECK(keystore.GetLegacyScriptPubKeyMan()->AddKey(keys[0]));
scriptPubKey.clear();
- scriptPubKey << OP_16 << ToByteVector(ParseHex("aabb"));
+ scriptPubKey << OP_16 << "aabb"_hex;
result = keystore.GetLegacyScriptPubKeyMan()->IsMine(scriptPubKey);
BOOST_CHECK_EQUAL(result, ISMINE_NO);
diff --git a/src/wallet/test/psbt_wallet_tests.cpp b/src/wallet/test/psbt_wallet_tests.cpp
index b5a3b22c54..09057114a0 100644
--- a/src/wallet/test/psbt_wallet_tests.cpp
+++ b/src/wallet/test/psbt_wallet_tests.cpp
@@ -12,6 +12,8 @@
#include <test/util/setup_common.h>
#include <wallet/test/wallet_test_fixture.h>
+using namespace util::hex_literals;
+
namespace wallet {
BOOST_FIXTURE_TEST_SUITE(psbt_wallet_tests, WalletTestingSetup)
@@ -21,8 +23,9 @@ static void import_descriptor(CWallet& wallet, const std::string& descriptor)
AssertLockHeld(wallet.cs_wallet);
FlatSigningProvider provider;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse(descriptor, provider, error, /* require_checksum=*/ false);
- assert(desc);
+ auto descs = Parse(descriptor, provider, error, /* require_checksum=*/ false);
+ assert(descs.size() == 1);
+ auto& desc = descs.at(0);
WalletDescriptor w_desc(std::move(desc), 0, 0, 10, 0);
wallet.AddWalletDescriptor(w_desc, provider, "", false);
}
@@ -34,14 +37,14 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test)
// Create prevtxs and add to wallet
DataStream s_prev_tx1{
- ParseHex("0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"),
+ "0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"_hex,
};
CTransactionRef prev_tx1;
s_prev_tx1 >> TX_WITH_WITNESS(prev_tx1);
m_wallet.mapWallet.emplace(std::piecewise_construct, std::forward_as_tuple(prev_tx1->GetHash()), std::forward_as_tuple(prev_tx1, TxStateInactive{}));
DataStream s_prev_tx2{
- ParseHex("0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000"),
+ "0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000"_hex,
};
CTransactionRef prev_tx2;
s_prev_tx2 >> TX_WITH_WITNESS(prev_tx2);
@@ -55,7 +58,7 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test)
// Call FillPSBT
PartiallySignedTransaction psbtx;
DataStream ssData{
- ParseHex("70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000"),
+ "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000"_hex,
};
ssData >> psbtx;
diff --git a/src/wallet/test/util.cpp b/src/wallet/test/util.cpp
index b21a9a601d..43fd91fe60 100644
--- a/src/wallet/test/util.cpp
+++ b/src/wallet/test/util.cpp
@@ -31,8 +31,9 @@ std::unique_ptr<CWallet> CreateSyncedWallet(interfaces::Chain& chain, CChain& cc
FlatSigningProvider provider;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
- assert(desc);
+ auto descs = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
+ assert(descs.size() == 1);
+ auto& desc = descs.at(0);
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
if (!wallet->AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
}
@@ -74,7 +75,7 @@ void TestUnloadWallet(std::shared_ptr<CWallet>&& wallet)
// Calls SyncWithValidationInterfaceQueue
wallet->chain().waitForNotificationsIfTipChanged({});
wallet->m_chain_notifications_handler.reset();
- UnloadWallet(std::move(wallet));
+ WaitForDeleteWallet(std::move(wallet));
}
std::unique_ptr<WalletDatabase> DuplicateMockDatabase(WalletDatabase& database)
diff --git a/src/wallet/test/util.h b/src/wallet/test/util.h
index a3e6ede81e..fc7674e961 100644
--- a/src/wallet/test/util.h
+++ b/src/wallet/test/util.h
@@ -61,7 +61,7 @@ public:
explicit MockableCursor(const MockableData& records, bool pass) : m_cursor(records.begin()), m_cursor_end(records.end()), m_pass(pass) {}
MockableCursor(const MockableData& records, bool pass, Span<const std::byte> prefix);
- ~MockableCursor() {}
+ ~MockableCursor() = default;
Status Next(DataStream& key, DataStream& value) override;
};
@@ -80,7 +80,7 @@ private:
public:
explicit MockableBatch(MockableData& records, bool pass) : m_records(records), m_pass(pass) {}
- ~MockableBatch() {}
+ ~MockableBatch() = default;
void Flush() override {}
void Close() override {}
@@ -106,7 +106,7 @@ public:
bool m_pass{true};
MockableDatabase(MockableData records = {}) : WalletDatabase(), m_records(records) {}
- ~MockableDatabase() {};
+ ~MockableDatabase() = default;
void Open() override {}
void AddRef() override {}
diff --git a/src/wallet/test/wallet_crypto_tests.cpp b/src/wallet/test/wallet_crypto_tests.cpp
index d5e75bb892..7c74c31308 100644
--- a/src/wallet/test/wallet_crypto_tests.cpp
+++ b/src/wallet/test/wallet_crypto_tests.cpp
@@ -11,64 +11,71 @@
#include <boost/test/unit_test.hpp>
+using namespace util::hex_literals;
+
namespace wallet {
BOOST_FIXTURE_TEST_SUITE(wallet_crypto_tests, BasicTestingSetup)
class TestCrypter
{
public:
-static void TestPassphraseSingle(const std::vector<unsigned char>& vchSalt, const SecureString& passphrase, uint32_t rounds,
- const std::vector<unsigned char>& correctKey = std::vector<unsigned char>(),
- const std::vector<unsigned char>& correctIV=std::vector<unsigned char>())
+static void TestPassphraseSingle(const std::span<const unsigned char> salt, const SecureString& passphrase, uint32_t rounds,
+ const std::span<const unsigned char> correct_key = {},
+ const std::span<const unsigned char> correct_iv = {})
{
CCrypter crypt;
- crypt.SetKeyFromPassphrase(passphrase, vchSalt, rounds, 0);
-
- if(!correctKey.empty())
- BOOST_CHECK_MESSAGE(memcmp(crypt.vchKey.data(), correctKey.data(), crypt.vchKey.size()) == 0, \
- HexStr(crypt.vchKey) + std::string(" != ") + HexStr(correctKey));
- if(!correctIV.empty())
- BOOST_CHECK_MESSAGE(memcmp(crypt.vchIV.data(), correctIV.data(), crypt.vchIV.size()) == 0,
- HexStr(crypt.vchIV) + std::string(" != ") + HexStr(correctIV));
+ crypt.SetKeyFromPassphrase(passphrase, salt, rounds, 0);
+
+ if (!correct_key.empty()) {
+ BOOST_CHECK_MESSAGE(memcmp(crypt.vchKey.data(), correct_key.data(), crypt.vchKey.size()) == 0,
+ HexStr(crypt.vchKey) + std::string(" != ") + HexStr(correct_key));
+ }
+ if (!correct_iv.empty()) {
+ BOOST_CHECK_MESSAGE(memcmp(crypt.vchIV.data(), correct_iv.data(), crypt.vchIV.size()) == 0,
+ HexStr(crypt.vchIV) + std::string(" != ") + HexStr(correct_iv));
+ }
}
-static void TestPassphrase(const std::vector<unsigned char>& vchSalt, const SecureString& passphrase, uint32_t rounds,
- const std::vector<unsigned char>& correctKey = std::vector<unsigned char>(),
- const std::vector<unsigned char>& correctIV=std::vector<unsigned char>())
+static void TestPassphrase(const std::span<const unsigned char> salt, const SecureString& passphrase, uint32_t rounds,
+ const std::span<const unsigned char> correct_key = {},
+ const std::span<const unsigned char> correct_iv = {})
{
- TestPassphraseSingle(vchSalt, passphrase, rounds, correctKey, correctIV);
- for(SecureString::const_iterator i(passphrase.begin()); i != passphrase.end(); ++i)
- TestPassphraseSingle(vchSalt, SecureString(i, passphrase.end()), rounds);
+ TestPassphraseSingle(salt, passphrase, rounds, correct_key, correct_iv);
+ for (SecureString::const_iterator it{passphrase.begin()}; it != passphrase.end(); ++it) {
+ TestPassphraseSingle(salt, SecureString{it, passphrase.end()}, rounds);
+ }
}
-static void TestDecrypt(const CCrypter& crypt, const std::vector<unsigned char>& vchCiphertext, \
- const std::vector<unsigned char>& vchPlaintext = std::vector<unsigned char>())
+static void TestDecrypt(const CCrypter& crypt, const std::span<const unsigned char> ciphertext,
+ const std::span<const unsigned char> correct_plaintext = {})
{
- CKeyingMaterial vchDecrypted;
- crypt.Decrypt(vchCiphertext, vchDecrypted);
- if (vchPlaintext.size())
- BOOST_CHECK(CKeyingMaterial(vchPlaintext.begin(), vchPlaintext.end()) == vchDecrypted);
+ CKeyingMaterial decrypted;
+ crypt.Decrypt(ciphertext, decrypted);
+ if (!correct_plaintext.empty()) {
+ BOOST_CHECK_EQUAL_COLLECTIONS(decrypted.begin(), decrypted.end(), correct_plaintext.begin(), correct_plaintext.end());
+ }
}
-static void TestEncryptSingle(const CCrypter& crypt, const CKeyingMaterial& vchPlaintext,
- const std::vector<unsigned char>& vchCiphertextCorrect = std::vector<unsigned char>())
+static void TestEncryptSingle(const CCrypter& crypt, const CKeyingMaterial& plaintext,
+ const std::span<const unsigned char> correct_ciphertext = {})
{
- std::vector<unsigned char> vchCiphertext;
- crypt.Encrypt(vchPlaintext, vchCiphertext);
+ std::vector<unsigned char> ciphertext;
+ crypt.Encrypt(plaintext, ciphertext);
- if (!vchCiphertextCorrect.empty())
- BOOST_CHECK(vchCiphertext == vchCiphertextCorrect);
+ if (!correct_ciphertext.empty()) {
+ BOOST_CHECK_EQUAL_COLLECTIONS(ciphertext.begin(), ciphertext.end(), correct_ciphertext.begin(), correct_ciphertext.end());
+ }
- const std::vector<unsigned char> vchPlaintext2(vchPlaintext.begin(), vchPlaintext.end());
- TestDecrypt(crypt, vchCiphertext, vchPlaintext2);
+ TestDecrypt(crypt, ciphertext, /*correct_plaintext=*/plaintext);
}
-static void TestEncrypt(const CCrypter& crypt, const std::vector<unsigned char>& vchPlaintextIn, \
- const std::vector<unsigned char>& vchCiphertextCorrect = std::vector<unsigned char>())
+static void TestEncrypt(const CCrypter& crypt, const std::span<const unsigned char> plaintext,
+ const std::span<const unsigned char> correct_ciphertext = {})
{
- TestEncryptSingle(crypt, CKeyingMaterial(vchPlaintextIn.begin(), vchPlaintextIn.end()), vchCiphertextCorrect);
- for(std::vector<unsigned char>::const_iterator i(vchPlaintextIn.begin()); i != vchPlaintextIn.end(); ++i)
- TestEncryptSingle(crypt, CKeyingMaterial(i, vchPlaintextIn.end()));
+ TestEncryptSingle(crypt, CKeyingMaterial{plaintext.begin(), plaintext.end()}, correct_ciphertext);
+ for (auto it{plaintext.begin()}; it != plaintext.end(); ++it) {
+ TestEncryptSingle(crypt, CKeyingMaterial{it, plaintext.end()});
+ }
}
};
@@ -76,47 +83,45 @@ static void TestEncrypt(const CCrypter& crypt, const std::vector<unsigned char>&
BOOST_AUTO_TEST_CASE(passphrase) {
// These are expensive.
- TestCrypter::TestPassphrase(ParseHex("0000deadbeef0000"), "test", 25000, \
- ParseHex("fc7aba077ad5f4c3a0988d8daa4810d0d4a0e3bcb53af662998898f33df0556a"), \
- ParseHex("cf2f2691526dd1aa220896fb8bf7c369"));
+ TestCrypter::TestPassphrase("0000deadbeef0000"_hex_u8, "test", 25000,
+ "fc7aba077ad5f4c3a0988d8daa4810d0d4a0e3bcb53af662998898f33df0556a"_hex_u8,
+ "cf2f2691526dd1aa220896fb8bf7c369"_hex_u8);
std::string hash(GetRandHash().ToString());
std::vector<unsigned char> vchSalt(8);
GetRandBytes(vchSalt);
- uint32_t rounds = InsecureRand32();
+ uint32_t rounds = m_rng.rand32();
if (rounds > 30000)
rounds = 30000;
TestCrypter::TestPassphrase(vchSalt, SecureString(hash.begin(), hash.end()), rounds);
}
BOOST_AUTO_TEST_CASE(encrypt) {
- std::vector<unsigned char> vchSalt = ParseHex("0000deadbeef0000");
- BOOST_CHECK(vchSalt.size() == WALLET_CRYPTO_SALT_SIZE);
+ constexpr std::array<uint8_t, WALLET_CRYPTO_SALT_SIZE> salt{"0000deadbeef0000"_hex_u8};
CCrypter crypt;
- crypt.SetKeyFromPassphrase("passphrase", vchSalt, 25000, 0);
- TestCrypter::TestEncrypt(crypt, ParseHex("22bcade09ac03ff6386914359cfe885cfeb5f77ff0d670f102f619687453b29d"));
+ crypt.SetKeyFromPassphrase("passphrase", salt, 25000, 0);
+ TestCrypter::TestEncrypt(crypt, "22bcade09ac03ff6386914359cfe885cfeb5f77ff0d670f102f619687453b29d"_hex_u8);
for (int i = 0; i != 100; i++)
{
uint256 hash(GetRandHash());
- TestCrypter::TestEncrypt(crypt, std::vector<unsigned char>(hash.begin(), hash.end()));
+ TestCrypter::TestEncrypt(crypt, std::span<unsigned char>{hash.begin(), hash.end()});
}
}
BOOST_AUTO_TEST_CASE(decrypt) {
- std::vector<unsigned char> vchSalt = ParseHex("0000deadbeef0000");
- BOOST_CHECK(vchSalt.size() == WALLET_CRYPTO_SALT_SIZE);
+ constexpr std::array<uint8_t, WALLET_CRYPTO_SALT_SIZE> salt{"0000deadbeef0000"_hex_u8};
CCrypter crypt;
- crypt.SetKeyFromPassphrase("passphrase", vchSalt, 25000, 0);
+ crypt.SetKeyFromPassphrase("passphrase", salt, 25000, 0);
// Some corner cases the came up while testing
- TestCrypter::TestDecrypt(crypt,ParseHex("795643ce39d736088367822cdc50535ec6f103715e3e48f4f3b1a60a08ef59ca"));
- TestCrypter::TestDecrypt(crypt,ParseHex("de096f4a8f9bd97db012aa9d90d74de8cdea779c3ee8bc7633d8b5d6da703486"));
- TestCrypter::TestDecrypt(crypt,ParseHex("32d0a8974e3afd9c6c3ebf4d66aa4e6419f8c173de25947f98cf8b7ace49449c"));
- TestCrypter::TestDecrypt(crypt,ParseHex("e7c055cca2faa78cb9ac22c9357a90b4778ded9b2cc220a14cea49f931e596ea"));
- TestCrypter::TestDecrypt(crypt,ParseHex("b88efddd668a6801d19516d6830da4ae9811988ccbaf40df8fbb72f3f4d335fd"));
- TestCrypter::TestDecrypt(crypt,ParseHex("8cae76aa6a43694e961ebcb28c8ca8f8540b84153d72865e8561ddd93fa7bfa9"));
+ TestCrypter::TestDecrypt(crypt,"795643ce39d736088367822cdc50535ec6f103715e3e48f4f3b1a60a08ef59ca"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"de096f4a8f9bd97db012aa9d90d74de8cdea779c3ee8bc7633d8b5d6da703486"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"32d0a8974e3afd9c6c3ebf4d66aa4e6419f8c173de25947f98cf8b7ace49449c"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"e7c055cca2faa78cb9ac22c9357a90b4778ded9b2cc220a14cea49f931e596ea"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"b88efddd668a6801d19516d6830da4ae9811988ccbaf40df8fbb72f3f4d335fd"_hex_u8);
+ TestCrypter::TestDecrypt(crypt,"8cae76aa6a43694e961ebcb28c8ca8f8540b84153d72865e8561ddd93fa7bfa9"_hex_u8);
for (int i = 0; i != 100; i++)
{
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
index 53f3bcc421..b5de4b4b3d 100644
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -65,8 +65,9 @@ static void AddKey(CWallet& wallet, const CKey& key)
LOCK(wallet.cs_wallet);
FlatSigningProvider provider;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
- assert(desc);
+ auto descs = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
+ assert(descs.size() == 1);
+ auto& desc = descs.at(0);
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
if (!wallet.AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
}
@@ -329,6 +330,39 @@ BOOST_FIXTURE_TEST_CASE(importwallet_rescan, TestChain100Setup)
}
}
+// This test verifies that wallet settings can be added and removed
+// concurrently, ensuring no race conditions occur during either process.
+BOOST_FIXTURE_TEST_CASE(write_wallet_settings_concurrently, TestingSetup)
+{
+ auto chain = m_node.chain.get();
+ const auto NUM_WALLETS{5};
+
+ // Since we're counting the number of wallets, ensure we start without any.
+ BOOST_REQUIRE(chain->getRwSetting("wallet").isNull());
+
+ const auto& check_concurrent_wallet = [&](const auto& settings_function, int num_expected_wallets) {
+ std::vector<std::thread> threads;
+ threads.reserve(NUM_WALLETS);
+ for (auto i{0}; i < NUM_WALLETS; ++i) threads.emplace_back(settings_function, i);
+ for (auto& t : threads) t.join();
+
+ auto wallets = chain->getRwSetting("wallet");
+ BOOST_CHECK_EQUAL(wallets.getValues().size(), num_expected_wallets);
+ };
+
+ // Add NUM_WALLETS wallets concurrently, ensure we end up with NUM_WALLETS stored.
+ check_concurrent_wallet([&chain](int i) {
+ Assert(AddWalletSetting(*chain, strprintf("wallet_%d", i)));
+ },
+ /*num_expected_wallets=*/NUM_WALLETS);
+
+ // Remove NUM_WALLETS wallets concurrently, ensure we end up with 0 wallets.
+ check_concurrent_wallet([&chain](int i) {
+ Assert(RemoveWalletSetting(*chain, strprintf("wallet_%d", i)));
+ },
+ /*num_expected_wallets=*/0);
+}
+
// Check that GetImmatureCredit() returns a newly calculated value instead of
// the cached value after a MarkDirty() call.
//
@@ -889,7 +923,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWalletWithoutChain, BasicTestingSetup)
context.args = &m_args;
auto wallet = TestLoadWallet(context);
BOOST_CHECK(wallet);
- UnloadWallet(std::move(wallet));
+ WaitForDeleteWallet(std::move(wallet));
}
BOOST_FIXTURE_TEST_CASE(RemoveTxs, TestChain100Setup)
@@ -945,7 +979,7 @@ BOOST_FIXTURE_TEST_CASE(wallet_sync_tx_invalid_state_test, TestingSetup)
CMutableTransaction mtx;
mtx.vout.emplace_back(COIN, GetScriptForDestination(op_dest));
- mtx.vin.emplace_back(Txid::FromUint256(g_insecure_rand_ctx.rand256()), 0);
+ mtx.vin.emplace_back(Txid::FromUint256(m_rng.rand256()), 0);
const auto& tx_id_to_spend = wallet.AddToWallet(MakeTransactionRef(mtx), TxStateInMempool{})->GetHash();
{
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index d569c64b43..b921bc5e49 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -93,25 +93,30 @@ namespace wallet {
bool AddWalletSetting(interfaces::Chain& chain, const std::string& wallet_name)
{
- common::SettingsValue setting_value = chain.getRwSetting("wallet");
- if (!setting_value.isArray()) setting_value.setArray();
- for (const common::SettingsValue& value : setting_value.getValues()) {
- if (value.isStr() && value.get_str() == wallet_name) return true;
- }
- setting_value.push_back(wallet_name);
- return chain.updateRwSetting("wallet", setting_value);
+ const auto update_function = [&wallet_name](common::SettingsValue& setting_value) {
+ if (!setting_value.isArray()) setting_value.setArray();
+ for (const auto& value : setting_value.getValues()) {
+ if (value.isStr() && value.get_str() == wallet_name) return interfaces::SettingsAction::SKIP_WRITE;
+ }
+ setting_value.push_back(wallet_name);
+ return interfaces::SettingsAction::WRITE;
+ };
+ return chain.updateRwSetting("wallet", update_function);
}
bool RemoveWalletSetting(interfaces::Chain& chain, const std::string& wallet_name)
{
- common::SettingsValue setting_value = chain.getRwSetting("wallet");
- if (!setting_value.isArray()) return true;
- common::SettingsValue new_value(common::SettingsValue::VARR);
- for (const common::SettingsValue& value : setting_value.getValues()) {
- if (!value.isStr() || value.get_str() != wallet_name) new_value.push_back(value);
- }
- if (new_value.size() == setting_value.size()) return true;
- return chain.updateRwSetting("wallet", new_value);
+ const auto update_function = [&wallet_name](common::SettingsValue& setting_value) {
+ if (!setting_value.isArray()) return interfaces::SettingsAction::SKIP_WRITE;
+ common::SettingsValue new_value(common::SettingsValue::VARR);
+ for (const auto& value : setting_value.getValues()) {
+ if (!value.isStr() || value.get_str() != wallet_name) new_value.push_back(value);
+ }
+ if (new_value.size() == setting_value.size()) return interfaces::SettingsAction::SKIP_WRITE;
+ setting_value = std::move(new_value);
+ return interfaces::SettingsAction::WRITE;
+ };
+ return chain.updateRwSetting("wallet", update_function);
}
static void UpdateWalletSetting(interfaces::Chain& chain,
@@ -162,10 +167,14 @@ bool RemoveWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet
// Unregister with the validation interface which also drops shared pointers.
wallet->m_chain_notifications_handler.reset();
- LOCK(context.wallets_mutex);
- std::vector<std::shared_ptr<CWallet>>::iterator i = std::find(context.wallets.begin(), context.wallets.end(), wallet);
- if (i == context.wallets.end()) return false;
- context.wallets.erase(i);
+ {
+ LOCK(context.wallets_mutex);
+ std::vector<std::shared_ptr<CWallet>>::iterator i = std::find(context.wallets.begin(), context.wallets.end(), wallet);
+ if (i == context.wallets.end()) return false;
+ context.wallets.erase(i);
+ }
+ // Notify unload so that upper layers release the shared pointer.
+ wallet->NotifyUnload();
// Write the wallet setting
UpdateWalletSetting(chain, name, load_on_start, warnings);
@@ -223,38 +232,35 @@ static std::set<std::string> g_loading_wallet_set GUARDED_BY(g_loading_wallet_mu
static std::set<std::string> g_unloading_wallet_set GUARDED_BY(g_wallet_release_mutex);
// Custom deleter for shared_ptr<CWallet>.
-static void ReleaseWallet(CWallet* wallet)
+static void FlushAndDeleteWallet(CWallet* wallet)
{
const std::string name = wallet->GetName();
- wallet->WalletLogPrintf("Releasing wallet\n");
+ wallet->WalletLogPrintf("Releasing wallet %s..\n", name);
wallet->Flush();
delete wallet;
- // Wallet is now released, notify UnloadWallet, if any.
+ // Wallet is now released, notify WaitForDeleteWallet, if any.
{
LOCK(g_wallet_release_mutex);
if (g_unloading_wallet_set.erase(name) == 0) {
- // UnloadWallet was not called for this wallet, all done.
+ // WaitForDeleteWallet was not called for this wallet, all done.
return;
}
}
g_wallet_release_cv.notify_all();
}
-void UnloadWallet(std::shared_ptr<CWallet>&& wallet)
+void WaitForDeleteWallet(std::shared_ptr<CWallet>&& wallet)
{
// Mark wallet for unloading.
const std::string name = wallet->GetName();
{
LOCK(g_wallet_release_mutex);
- auto it = g_unloading_wallet_set.insert(name);
- assert(it.second);
+ g_unloading_wallet_set.insert(name);
+ // Do not expect to be the only one removing this wallet.
+ // Multiple threads could simultaneously be waiting for deletion.
}
- // The wallet can be in use so it's not possible to explicitly unload here.
- // Notify the unload intent so that all remaining shared pointers are
- // released.
- wallet->NotifyUnload();
- // Time to ditch our shared_ptr and wait for ReleaseWallet call.
+ // Time to ditch our shared_ptr and wait for FlushAndDeleteWallet call.
wallet.reset();
{
WAIT_LOCK(g_wallet_release_mutex, lock);
@@ -1037,9 +1043,8 @@ bool CWallet::IsSpentKey(const CScript& scriptPubKey) const
if (IsAddressPreviouslySpent(dest)) {
return true;
}
- if (IsLegacy()) {
- LegacyScriptPubKeyMan* spk_man = GetLegacyScriptPubKeyMan();
- assert(spk_man != nullptr);
+
+ if (LegacyScriptPubKeyMan* spk_man = GetLegacyScriptPubKeyMan()) {
for (const auto& keyid : GetAffectedKeys(scriptPubKey, *spk_man)) {
WitnessV0KeyHash wpkh_dest(keyid);
if (IsAddressPreviouslySpent(wpkh_dest)) {
@@ -1625,7 +1630,9 @@ isminetype CWallet::IsMine(const CScript& script) const
}
// Legacy wallet
- if (IsLegacy()) return GetLegacyScriptPubKeyMan()->IsMine(script);
+ if (LegacyScriptPubKeyMan* spkm = GetLegacyScriptPubKeyMan()) {
+ return spkm->IsMine(script);
+ }
return ISMINE_NO;
}
@@ -1773,14 +1780,14 @@ bool CWallet::ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const in
return spk_man->ImportPrivKeys(privkey_map, timestamp);
}
-bool CWallet::ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp)
+bool CWallet::ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp)
{
auto spk_man = GetLegacyScriptPubKeyMan();
if (!spk_man) {
return false;
}
LOCK(spk_man->cs_KeyStore);
- return spk_man->ImportPubKeys(ordered_pubkeys, pubkey_map, key_origins, add_keypool, internal, timestamp);
+ return spk_man->ImportPubKeys(ordered_pubkeys, pubkey_map, key_origins, add_keypool, timestamp);
}
bool CWallet::ImportScriptPubKeys(const std::string& label, const std::set<CScript>& script_pub_keys, const bool have_solving_data, const bool apply_label, const int64_t timestamp)
@@ -1914,14 +1921,14 @@ CWallet::ScanResult CWallet::ScanForWalletTransactions(const uint256& start_bloc
auto matches_block{fast_rescan_filter->MatchesBlock(block_hash)};
if (matches_block.has_value()) {
if (*matches_block) {
- LogPrint(BCLog::SCAN, "Fast rescan: inspect block %d [%s] (filter matched)\n", block_height, block_hash.ToString());
+ LogDebug(BCLog::SCAN, "Fast rescan: inspect block %d [%s] (filter matched)\n", block_height, block_hash.ToString());
} else {
result.last_scanned_block = block_hash;
result.last_scanned_height = block_height;
fetch_block = false;
}
} else {
- LogPrint(BCLog::SCAN, "Fast rescan: inspect block %d [%s] (WARNING: block filter not found!)\n", block_height, block_hash.ToString());
+ LogDebug(BCLog::SCAN, "Fast rescan: inspect block %d [%s] (WARNING: block filter not found!)\n", block_height, block_hash.ToString());
}
}
@@ -2225,8 +2232,8 @@ std::optional<PSBTError> CWallet::FillPSBT(PartiallySignedTransaction& psbtx, bo
// Complete if every input is now signed
complete = true;
- for (const auto& input : psbtx.inputs) {
- complete &= PSBTInputSigned(input);
+ for (size_t i = 0; i < psbtx.inputs.size(); ++i) {
+ complete &= PSBTInputSignedAndVerified(psbtx, i, &txdata);
}
return {};
@@ -2309,7 +2316,7 @@ OutputType CWallet::TransactionChangeType(const std::optional<OutputType>& chang
void CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::vector<std::pair<std::string, std::string>> orderForm)
{
LOCK(cs_wallet);
- WalletLogPrintf("CommitTransaction:\n%s", tx->ToString()); // NOLINT(bitcoin-unterminated-logprintf)
+ WalletLogPrintf("CommitTransaction:\n%s\n", util::RemoveSuffixView(tx->ToString(), "\n"));
// Add tx to wallet, because if it has change it's also ours,
// otherwise just for transaction history.
@@ -2929,7 +2936,7 @@ bool CWallet::EraseAddressReceiveRequest(WalletBatch& batch, const CTxDestinatio
return true;
}
-std::unique_ptr<WalletDatabase> MakeWalletDatabase(const std::string& name, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error_string)
+static util::Result<fs::path> GetWalletPath(const std::string& name)
{
// Do some checking on wallet path. It should be either a:
//
@@ -2942,15 +2949,24 @@ std::unique_ptr<WalletDatabase> MakeWalletDatabase(const std::string& name, cons
if (!(path_type == fs::file_type::not_found || path_type == fs::file_type::directory ||
(path_type == fs::file_type::symlink && fs::is_directory(wallet_path)) ||
(path_type == fs::file_type::regular && fs::PathFromString(name).filename() == fs::PathFromString(name)))) {
- error_string = Untranslated(strprintf(
+ return util::Error{Untranslated(strprintf(
"Invalid -wallet path '%s'. -wallet path should point to a directory where wallet.dat and "
"database/log.?????????? files can be stored, a location where such a directory could be created, "
"or (for backwards compatibility) the name of an existing data file in -walletdir (%s)",
- name, fs::quoted(fs::PathToString(GetWalletDir()))));
+ name, fs::quoted(fs::PathToString(GetWalletDir()))))};
+ }
+ return wallet_path;
+}
+
+std::unique_ptr<WalletDatabase> MakeWalletDatabase(const std::string& name, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error_string)
+{
+ const auto& wallet_path = GetWalletPath(name);
+ if (!wallet_path) {
+ error_string = util::ErrorString(wallet_path);
status = DatabaseStatus::FAILED_BAD_PATH;
return nullptr;
}
- return MakeDatabase(wallet_path, options, status, error_string);
+ return MakeDatabase(*wallet_path, options, status, error_string);
}
std::shared_ptr<CWallet> CWallet::Create(WalletContext& context, const std::string& name, std::unique_ptr<WalletDatabase> database, uint64_t wallet_creation_flags, bilingual_str& error, std::vector<bilingual_str>& warnings)
@@ -2962,7 +2978,7 @@ std::shared_ptr<CWallet> CWallet::Create(WalletContext& context, const std::stri
const auto start{SteadyClock::now()};
// TODO: Can't use std::make_shared because we need a custom deleter but
// should be possible to use std::allocate_shared.
- std::shared_ptr<CWallet> walletInstance(new CWallet(chain, name, std::move(database)), ReleaseWallet);
+ std::shared_ptr<CWallet> walletInstance(new CWallet(chain, name, std::move(database)), FlushAndDeleteWallet);
walletInstance->m_keypool_size = std::max(args.GetIntArg("-keypool", DEFAULT_KEYPOOL_SIZE), int64_t{1});
walletInstance->m_notify_tx_changed_script = args.GetArg("-walletnotify", "");
@@ -3394,6 +3410,14 @@ void CWallet::postInitProcess()
bool CWallet::BackupWallet(const std::string& strDest) const
{
+ if (m_chain) {
+ CBlockLocator loc;
+ WITH_LOCK(cs_wallet, chain().findBlock(m_last_block_processed, FoundBlock().locator(loc)));
+ if (!loc.IsNull()) {
+ WalletBatch batch(GetDatabase());
+ batch.WriteBestBlock(loc);
+ }
+ }
return GetDatabase().Backup(strDest);
}
@@ -3549,7 +3573,8 @@ std::set<ScriptPubKeyMan*> CWallet::GetScriptPubKeyMans(const CScript& script) c
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());
+ LegacyScriptPubKeyMan* spkm = GetLegacyScriptPubKeyMan();
+ if (spkm && spkm->CanProvide(script, sigdata)) spk_mans.insert(spkm);
return spk_mans;
}
@@ -3579,7 +3604,8 @@ std::unique_ptr<SigningProvider> CWallet::GetSolvingProvider(const CScript& scri
}
// Legacy wallet
- if (IsLegacy() && GetLegacyScriptPubKeyMan()->CanProvide(script, sigdata)) return GetLegacyScriptPubKeyMan()->GetSolvingProvider(script);
+ LegacyScriptPubKeyMan* spkm = GetLegacyScriptPubKeyMan();
+ if (spkm && spkm->CanProvide(script, sigdata)) return spkm->GetSolvingProvider(script);
return nullptr;
}
@@ -3608,6 +3634,16 @@ LegacyScriptPubKeyMan* CWallet::GetLegacyScriptPubKeyMan() const
return dynamic_cast<LegacyScriptPubKeyMan*>(it->second);
}
+LegacyDataSPKM* CWallet::GetLegacyDataSPKM() const
+{
+ if (IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)) {
+ return nullptr;
+ }
+ auto it = m_internal_spk_managers.find(OutputType::LEGACY);
+ if (it == m_internal_spk_managers.end()) return nullptr;
+ return dynamic_cast<LegacyDataSPKM*>(it->second);
+}
+
LegacyScriptPubKeyMan* CWallet::GetOrCreateLegacyScriptPubKeyMan()
{
SetupLegacyScriptPubKeyMan();
@@ -3624,13 +3660,22 @@ void CWallet::AddScriptPubKeyMan(const uint256& id, std::unique_ptr<ScriptPubKey
MaybeUpdateBirthTime(spkm->GetTimeFirstKey());
}
+LegacyDataSPKM* CWallet::GetOrCreateLegacyDataSPKM()
+{
+ SetupLegacyScriptPubKeyMan();
+ return GetLegacyDataSPKM();
+}
+
void CWallet::SetupLegacyScriptPubKeyMan()
{
if (!m_internal_spk_managers.empty() || !m_external_spk_managers.empty() || !m_spk_managers.empty() || IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)) {
return;
}
- auto spk_manager = std::unique_ptr<ScriptPubKeyMan>(new LegacyScriptPubKeyMan(*this, m_keypool_size));
+ std::unique_ptr<ScriptPubKeyMan> spk_manager = m_database->Format() == "bdb_ro" ?
+ std::make_unique<LegacyDataSPKM>(*this) :
+ std::make_unique<LegacyScriptPubKeyMan>(*this, m_keypool_size);
+
for (const auto& type : LEGACY_OUTPUT_TYPES) {
m_internal_spk_managers[type] = spk_manager.get();
m_external_spk_managers[type] = spk_manager.get();
@@ -3743,10 +3788,11 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
const std::string& desc_str = desc_val.getValStr();
FlatSigningProvider keys;
std::string desc_error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, desc_error, false);
- if (desc == nullptr) {
+ auto descs = Parse(desc_str, keys, desc_error, false);
+ if (descs.empty()) {
throw std::runtime_error(std::string(__func__) + ": Invalid descriptor \"" + desc_str + "\" (" + desc_error + ")");
}
+ auto& desc = descs.at(0);
if (!desc->GetOutputType()) {
continue;
}
@@ -3817,11 +3863,7 @@ void CWallet::DeactivateScriptPubKeyMan(uint256 id, OutputType type, bool intern
bool CWallet::IsLegacy() const
{
- if (m_internal_spk_managers.count(OutputType::LEGACY) == 0) {
- return false;
- }
- auto spk_man = dynamic_cast<LegacyScriptPubKeyMan*>(m_internal_spk_managers.at(OutputType::LEGACY));
- return spk_man != nullptr;
+ return !IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS);
}
DescriptorScriptPubKeyMan* CWallet::GetDescriptorScriptPubKeyMan(const WalletDescriptor& desc) const
@@ -3998,7 +4040,7 @@ std::optional<MigrationData> CWallet::GetDescriptorsForLegacy(bilingual_str& err
{
AssertLockHeld(cs_wallet);
- LegacyScriptPubKeyMan* legacy_spkm = GetLegacyScriptPubKeyMan();
+ LegacyDataSPKM* legacy_spkm = GetLegacyDataSPKM();
if (!Assume(legacy_spkm)) {
// This shouldn't happen
error = Untranslated(STR_INTERNAL_BUG("Error: Legacy wallet data missing"));
@@ -4017,7 +4059,7 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
{
AssertLockHeld(cs_wallet);
- LegacyScriptPubKeyMan* legacy_spkm = GetLegacyScriptPubKeyMan();
+ LegacyDataSPKM* legacy_spkm = GetLegacyDataSPKM();
if (!Assume(legacy_spkm)) {
// This shouldn't happen
error = Untranslated(STR_INTERNAL_BUG("Error: Legacy wallet data missing"));
@@ -4285,12 +4327,12 @@ bool DoMigration(CWallet& wallet, WalletContext& context, bilingual_str& error,
// Parse the descriptor
FlatSigningProvider keys;
std::string parse_err;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, parse_err, /* require_checksum */ true);
- assert(desc); // It shouldn't be possible to have the LegacyScriptPubKeyMan make an invalid descriptor
- assert(!desc->IsRange()); // It shouldn't be possible to have LegacyScriptPubKeyMan make a ranged watchonly descriptor
+ std::vector<std::unique_ptr<Descriptor>> descs = Parse(desc_str, keys, parse_err, /* require_checksum */ true);
+ assert(descs.size() == 1); // It shouldn't be possible to have the LegacyScriptPubKeyMan make an invalid descriptor or a multipath descriptors
+ assert(!descs.at(0)->IsRange()); // It shouldn't be possible to have LegacyScriptPubKeyMan make a ranged watchonly descriptor
// Add to the wallet
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ WalletDescriptor w_desc(std::move(descs.at(0)), creation_time, 0, 0, 0);
data->watchonly_wallet->AddWalletDescriptor(w_desc, keys, "", false);
}
@@ -4322,12 +4364,12 @@ bool DoMigration(CWallet& wallet, WalletContext& context, bilingual_str& error,
// Parse the descriptor
FlatSigningProvider keys;
std::string parse_err;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, parse_err, /* require_checksum */ true);
- assert(desc); // It shouldn't be possible to have the LegacyScriptPubKeyMan make an invalid descriptor
- assert(!desc->IsRange()); // It shouldn't be possible to have LegacyScriptPubKeyMan make a ranged watchonly descriptor
+ std::vector<std::unique_ptr<Descriptor>> descs = Parse(desc_str, keys, parse_err, /* require_checksum */ true);
+ assert(descs.size() == 1); // It shouldn't be possible to have the LegacyScriptPubKeyMan make an invalid descriptor or a multipath descriptors
+ assert(!descs.at(0)->IsRange()); // It shouldn't be possible to have LegacyScriptPubKeyMan make a ranged watchonly descriptor
// Add to the wallet
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ WalletDescriptor w_desc(std::move(descs.at(0)), creation_time, 0, 0, 0);
data->solvable_wallet->AddWalletDescriptor(w_desc, keys, "", false);
}
@@ -4352,11 +4394,29 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
// 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 (wallet->IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)) {
+ return util::Error{_("Error: This wallet is already a descriptor wallet")};
+ }
+
+ // Flush chain state before unloading wallet
+ CBlockLocator locator;
+ WITH_LOCK(wallet->cs_wallet, context.chain->findBlock(wallet->GetLastBlockHash(), FoundBlock().locator(locator)));
+ if (!locator.IsNull()) wallet->chainStateFlushed(ChainstateRole::NORMAL, locator);
+
if (!RemoveWallet(context, wallet, /*load_on_start=*/std::nullopt, warnings)) {
return util::Error{_("Unable to unload the wallet before migrating")};
}
- UnloadWallet(std::move(wallet));
+ WaitForDeleteWallet(std::move(wallet));
was_loaded = true;
+ } else {
+ // Check if the wallet is BDB
+ const auto& wallet_path = GetWalletPath(wallet_name);
+ if (!wallet_path) {
+ return util::Error{util::ErrorString(wallet_path)};
+ }
+ if (!IsBDBFile(BDBDataFile(*wallet_path))) {
+ return util::Error{_("Error: This wallet is already a descriptor wallet")};
+ }
}
// Load the wallet but only in the context of this function.
@@ -4365,6 +4425,7 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
empty_context.args = context.args;
DatabaseOptions options;
options.require_existing = true;
+ options.require_format = DatabaseFormat::BERKELEY_RO;
DatabaseStatus status;
std::unique_ptr<WalletDatabase> database = MakeWalletDatabase(wallet_name, options, status, error);
if (!database) {
@@ -4379,6 +4440,8 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
// Helper to reload as normal for some of our exit scenarios
const auto& reload_wallet = [&](std::shared_ptr<CWallet>& to_reload) {
+ // Reset options.require_format as wallets of any format may be reloaded.
+ options.require_format = std::nullopt;
assert(to_reload.use_count() == 1);
std::string name = to_reload->GetName();
to_reload.reset();
@@ -4487,7 +4550,7 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
error += _("\nUnable to cleanup failed migration");
return util::Error{error};
}
- UnloadWallet(std::move(w));
+ WaitForDeleteWallet(std::move(w));
} else {
// Unloading for wallets in local context
assert(w.use_count() == 1);
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index 5bc888462f..d3a7208b15 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -83,12 +83,9 @@ struct bilingual_str;
namespace wallet {
struct WalletContext;
-//! Explicitly unload and delete the wallet.
-//! Blocks the current thread after signaling the unload intent so that all
-//! wallet pointer owners release the wallet.
-//! Note that, when blocking is not required, the wallet is implicitly unloaded
-//! by the shared pointer deleter.
-void UnloadWallet(std::shared_ptr<CWallet>&& wallet);
+//! Explicitly delete the wallet.
+//! Blocks the current thread until the wallet is destructed.
+void WaitForDeleteWallet(std::shared_ptr<CWallet>&& wallet);
bool AddWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet);
bool RemoveWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet, std::optional<bool> load_on_start, std::vector<bilingual_str>& warnings);
@@ -686,7 +683,7 @@ public:
bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
- bool ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
+ bool ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool ImportScriptPubKeys(const std::string& label, const std::set<CScript>& script_pub_keys, const bool have_solving_data, const bool apply_label, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
/** Updates wallet birth time if 'time' is below it */
@@ -930,9 +927,9 @@ public:
/** Prepends the wallet name in logging output to ease debugging in multi-wallet use cases */
template <typename... Params>
- void WalletLogPrintf(const char* fmt, Params... parameters) const
+ void WalletLogPrintf(util::ConstevalFormatString<sizeof...(Params)> wallet_fmt, const Params&... params) const
{
- LogPrintf(("%s " + std::string{fmt}).c_str(), GetDisplayName(), parameters...);
+ LogInfo("%s %s", GetDisplayName(), tfm::format(wallet_fmt, params...));
};
/** Upgrade the wallet */
@@ -963,8 +960,10 @@ public:
//! Get the LegacyScriptPubKeyMan which is used for all types, internal, and external.
LegacyScriptPubKeyMan* GetLegacyScriptPubKeyMan() const;
LegacyScriptPubKeyMan* GetOrCreateLegacyScriptPubKeyMan();
+ LegacyDataSPKM* GetLegacyDataSPKM() const;
+ LegacyDataSPKM* GetOrCreateLegacyDataSPKM();
- //! Make a LegacyScriptPubKeyMan and set it for all types, internal, and external.
+ //! Make a Legacy(Data)SPKM and set it for all types, internal, and external.
void SetupLegacyScriptPubKeyMan();
bool WithEncryptionKey(std::function<bool (const CKeyingMaterial&)> cb) const override;
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
index f34fcfc3fd..47b84f7e6a 100644
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -187,6 +187,17 @@ bool WalletBatch::ReadBestBlock(CBlockLocator& locator)
return m_batch->Read(DBKeys::BESTBLOCK_NOMERKLE, locator);
}
+bool WalletBatch::IsEncrypted()
+{
+ DataStream prefix;
+ prefix << DBKeys::MASTER_KEY;
+ if (auto cursor = m_batch->GetNewPrefixCursor(prefix)) {
+ DataStream k, v;
+ if (cursor->Next(k, v) == DatabaseCursor::Status::MORE) return true;
+ }
+ return false;
+}
+
bool WalletBatch::WriteOrderPosNext(int64_t nOrderPosNext)
{
return WriteIC(DBKeys::ORDERPOSNEXT, nOrderPosNext);
@@ -354,9 +365,9 @@ bool LoadKey(CWallet* pwallet, DataStream& ssKey, DataStream& ssValue, std::stri
strErr = "Error reading wallet database: CPrivKey corrupt";
return false;
}
- if (!pwallet->GetOrCreateLegacyScriptPubKeyMan()->LoadKey(key, vchPubKey))
+ if (!pwallet->GetOrCreateLegacyDataSPKM()->LoadKey(key, vchPubKey))
{
- strErr = "Error reading wallet database: LegacyScriptPubKeyMan::LoadKey failed";
+ strErr = "Error reading wallet database: LegacyDataSPKM::LoadKey failed";
return false;
}
} catch (const std::exception& e) {
@@ -393,9 +404,9 @@ bool LoadCryptedKey(CWallet* pwallet, DataStream& ssKey, DataStream& ssValue, st
}
}
- if (!pwallet->GetOrCreateLegacyScriptPubKeyMan()->LoadCryptedKey(vchPubKey, vchPrivKey, checksum_valid))
+ if (!pwallet->GetOrCreateLegacyDataSPKM()->LoadCryptedKey(vchPubKey, vchPrivKey, checksum_valid))
{
- strErr = "Error reading wallet database: LegacyScriptPubKeyMan::LoadCryptedKey failed";
+ strErr = "Error reading wallet database: LegacyDataSPKM::LoadCryptedKey failed";
return false;
}
} catch (const std::exception& e) {
@@ -440,7 +451,7 @@ bool LoadHDChain(CWallet* pwallet, DataStream& ssValue, std::string& strErr)
try {
CHDChain chain;
ssValue >> chain;
- pwallet->GetOrCreateLegacyScriptPubKeyMan()->LoadHDChain(chain);
+ pwallet->GetOrCreateLegacyDataSPKM()->LoadHDChain(chain);
} catch (const std::exception& e) {
if (strErr.empty()) {
strErr = e.what();
@@ -584,9 +595,9 @@ static DBErrors LoadLegacyWalletRecords(CWallet* pwallet, DatabaseBatch& batch,
key >> hash;
CScript script;
value >> script;
- if (!pwallet->GetOrCreateLegacyScriptPubKeyMan()->LoadCScript(script))
+ if (!pwallet->GetOrCreateLegacyDataSPKM()->LoadCScript(script))
{
- strErr = "Error reading wallet database: LegacyScriptPubKeyMan::LoadCScript failed";
+ strErr = "Error reading wallet database: LegacyDataSPKM::LoadCScript failed";
return DBErrors::NONCRITICAL_ERROR;
}
return DBErrors::LOAD_OK;
@@ -607,7 +618,7 @@ static DBErrors LoadLegacyWalletRecords(CWallet* pwallet, DatabaseBatch& batch,
key >> vchPubKey;
CKeyMetadata keyMeta;
value >> keyMeta;
- pwallet->GetOrCreateLegacyScriptPubKeyMan()->LoadKeyMetadata(vchPubKey.GetID(), keyMeta);
+ pwallet->GetOrCreateLegacyDataSPKM()->LoadKeyMetadata(vchPubKey.GetID(), keyMeta);
// Extract some CHDChain info from this metadata if it has any
if (keyMeta.nVersion >= CKeyMetadata::VERSION_WITH_HDDATA && !keyMeta.hd_seed_id.IsNull() && keyMeta.hdKeypath.size() > 0) {
@@ -674,7 +685,7 @@ static DBErrors LoadLegacyWalletRecords(CWallet* pwallet, DatabaseBatch& batch,
// Set inactive chains
if (!hd_chains.empty()) {
- LegacyScriptPubKeyMan* legacy_spkm = pwallet->GetLegacyScriptPubKeyMan();
+ LegacyDataSPKM* legacy_spkm = pwallet->GetLegacyDataSPKM();
if (legacy_spkm) {
for (const auto& [hd_seed_id, chain] : hd_chains) {
if (hd_seed_id != legacy_spkm->GetHDChain().seed_id) {
@@ -695,7 +706,7 @@ static DBErrors LoadLegacyWalletRecords(CWallet* pwallet, DatabaseBatch& batch,
uint8_t fYes;
value >> fYes;
if (fYes == '1') {
- pwallet->GetOrCreateLegacyScriptPubKeyMan()->LoadWatchOnly(script);
+ pwallet->GetOrCreateLegacyDataSPKM()->LoadWatchOnly(script);
}
return DBErrors::LOAD_OK;
});
@@ -708,7 +719,7 @@ static DBErrors LoadLegacyWalletRecords(CWallet* pwallet, DatabaseBatch& batch,
key >> script;
CKeyMetadata keyMeta;
value >> keyMeta;
- pwallet->GetOrCreateLegacyScriptPubKeyMan()->LoadScriptMetadata(CScriptID(script), keyMeta);
+ pwallet->GetOrCreateLegacyDataSPKM()->LoadScriptMetadata(CScriptID(script), keyMeta);
return DBErrors::LOAD_OK;
});
result = std::max(result, watch_meta_res.m_result);
@@ -720,7 +731,7 @@ static DBErrors LoadLegacyWalletRecords(CWallet* pwallet, DatabaseBatch& batch,
key >> nIndex;
CKeyPool keypool;
value >> keypool;
- pwallet->GetOrCreateLegacyScriptPubKeyMan()->LoadKeyPool(nIndex, keypool);
+ pwallet->GetOrCreateLegacyDataSPKM()->LoadKeyPool(nIndex, keypool);
return DBErrors::LOAD_OK;
});
result = std::max(result, pool_res.m_result);
@@ -763,7 +774,7 @@ static DBErrors LoadLegacyWalletRecords(CWallet* pwallet, DatabaseBatch& batch,
// nTimeFirstKey is only reliable if all keys have metadata
if (pwallet->IsLegacy() && (key_res.m_records + ckey_res.m_records + watch_script_res.m_records) != (keymeta_res.m_records + watch_meta_res.m_records)) {
- auto spk_man = pwallet->GetOrCreateLegacyScriptPubKeyMan();
+ auto spk_man = pwallet->GetLegacyScriptPubKeyMan();
if (spk_man) {
LOCK(spk_man->cs_KeyStore);
spk_man->UpdateTimeFirstKey(1);
@@ -1236,19 +1247,19 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet)
static bool RunWithinTxn(WalletBatch& batch, std::string_view process_desc, const std::function<bool(WalletBatch&)>& func)
{
if (!batch.TxnBegin()) {
- LogPrint(BCLog::WALLETDB, "Error: cannot create db txn for %s\n", process_desc);
+ LogDebug(BCLog::WALLETDB, "Error: cannot create db txn for %s\n", process_desc);
return false;
}
// Run procedure
if (!func(batch)) {
- LogPrint(BCLog::WALLETDB, "Error: %s failed\n", process_desc);
+ LogDebug(BCLog::WALLETDB, "Error: %s failed\n", process_desc);
batch.TxnAbort();
return false;
}
if (!batch.TxnCommit()) {
- LogPrint(BCLog::WALLETDB, "Error: cannot commit db txn for %s\n", process_desc);
+ LogDebug(BCLog::WALLETDB, "Error: cannot commit db txn for %s\n", process_desc);
return false;
}
diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h
index 9474a59660..bffcc87202 100644
--- a/src/wallet/walletdb.h
+++ b/src/wallet/walletdb.h
@@ -247,6 +247,9 @@ public:
bool WriteBestBlock(const CBlockLocator& locator);
bool ReadBestBlock(CBlockLocator& locator);
+ // Returns true if wallet stores encryption keys
+ bool IsEncrypted();
+
bool WriteOrderPosNext(int64_t nOrderPosNext);
bool ReadPool(int64_t nPool, CKeyPool& keypool);
diff --git a/src/wallet/walletutil.cpp b/src/wallet/walletutil.cpp
index 0de2617d45..53e65d0194 100644
--- a/src/wallet/walletutil.cpp
+++ b/src/wallet/walletutil.cpp
@@ -94,8 +94,8 @@ WalletDescriptor GenerateWalletDescriptor(const CExtPubKey& master_key, const Ou
// Make the descriptor
FlatSigningProvider keys;
std::string error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ std::vector<std::unique_ptr<Descriptor>> desc = Parse(desc_str, keys, error, false);
+ WalletDescriptor w_desc(std::move(desc.at(0)), creation_time, 0, 0, 0);
return w_desc;
}
diff --git a/src/wallet/walletutil.h b/src/wallet/walletutil.h
index 38926c1eb8..ef9d93eb07 100644
--- a/src/wallet/walletutil.h
+++ b/src/wallet/walletutil.h
@@ -96,10 +96,14 @@ public:
{
std::string error;
FlatSigningProvider keys;
- descriptor = Parse(str, keys, error, true);
- if (!descriptor) {
+ auto descs = Parse(str, keys, error, true);
+ if (descs.empty()) {
throw std::ios_base::failure("Invalid descriptor: " + error);
}
+ if (descs.size() > 1) {
+ throw std::ios_base::failure("Can't load a multipath descriptor from databases");
+ }
+ descriptor = std::move(descs.at(0));
id = DescriptorID(*descriptor);
}
@@ -111,7 +115,7 @@ public:
SER_READ(obj, obj.DeserializeDescriptor(descriptor_str));
}
- WalletDescriptor() {}
+ WalletDescriptor() = default;
WalletDescriptor(std::shared_ptr<Descriptor> descriptor, uint64_t creation_time, int32_t range_start, int32_t range_end, int32_t next_index) : descriptor(descriptor), id(DescriptorID(*descriptor)), creation_time(creation_time), range_start(range_start), range_end(range_end), next_index(next_index) { }
};
diff --git a/src/walletinitinterface.h b/src/walletinitinterface.h
index ce8b6cfd6e..ecee2e93a9 100644
--- a/src/walletinitinterface.h
+++ b/src/walletinitinterface.h
@@ -22,7 +22,7 @@ public:
/** Add wallets that should be opened to list of chain clients. */
virtual void Construct(node::NodeContext& node) const = 0;
- virtual ~WalletInitInterface() {}
+ virtual ~WalletInitInterface() = default;
};
extern const WalletInitInterface& g_wallet_init_interface;
diff --git a/src/zmq/CMakeLists.txt b/src/zmq/CMakeLists.txt
new file mode 100644
index 0000000000..8ecb236b46
--- /dev/null
+++ b/src/zmq/CMakeLists.txt
@@ -0,0 +1,24 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+add_library(bitcoin_zmq STATIC EXCLUDE_FROM_ALL
+ zmqabstractnotifier.cpp
+ zmqnotificationinterface.cpp
+ zmqpublishnotifier.cpp
+ zmqrpc.cpp
+ zmqutil.cpp
+)
+target_compile_definitions(bitcoin_zmq
+ INTERFACE
+ ENABLE_ZMQ=1
+ PRIVATE
+ $<$<AND:$<PLATFORM_ID:Windows>,$<CXX_COMPILER_ID:GNU>>:ZMQ_STATIC>
+)
+target_link_libraries(bitcoin_zmq
+ PRIVATE
+ core_interface
+ univalue
+ $<TARGET_NAME_IF_EXISTS:libzmq>
+ $<TARGET_NAME_IF_EXISTS:PkgConfig::libzmq>
+)
diff --git a/src/zmq/zmqnotificationinterface.cpp b/src/zmq/zmqnotificationinterface.cpp
index 536e471053..0039f55698 100644
--- a/src/zmq/zmqnotificationinterface.cpp
+++ b/src/zmq/zmqnotificationinterface.cpp
@@ -24,9 +24,7 @@
#include <utility>
#include <vector>
-CZMQNotificationInterface::CZMQNotificationInterface()
-{
-}
+CZMQNotificationInterface::CZMQNotificationInterface() = default;
CZMQNotificationInterface::~CZMQNotificationInterface()
{
@@ -90,9 +88,9 @@ bool CZMQNotificationInterface::Initialize()
{
int major = 0, minor = 0, patch = 0;
zmq_version(&major, &minor, &patch);
- LogPrint(BCLog::ZMQ, "version %d.%d.%d\n", major, minor, patch);
+ LogDebug(BCLog::ZMQ, "version %d.%d.%d\n", major, minor, patch);
- LogPrint(BCLog::ZMQ, "Initialize notification interface\n");
+ LogDebug(BCLog::ZMQ, "Initialize notification interface\n");
assert(!pcontext);
pcontext = zmq_ctx_new();
@@ -105,9 +103,9 @@ bool CZMQNotificationInterface::Initialize()
for (auto& notifier : notifiers) {
if (notifier->Initialize(pcontext)) {
- LogPrint(BCLog::ZMQ, "Notifier %s ready (address = %s)\n", notifier->GetType(), notifier->GetAddress());
+ LogDebug(BCLog::ZMQ, "Notifier %s ready (address = %s)\n", notifier->GetType(), notifier->GetAddress());
} else {
- LogPrint(BCLog::ZMQ, "Notifier %s failed (address = %s)\n", notifier->GetType(), notifier->GetAddress());
+ LogDebug(BCLog::ZMQ, "Notifier %s failed (address = %s)\n", notifier->GetType(), notifier->GetAddress());
return false;
}
}
@@ -118,11 +116,11 @@ bool CZMQNotificationInterface::Initialize()
// Called during shutdown sequence
void CZMQNotificationInterface::Shutdown()
{
- LogPrint(BCLog::ZMQ, "Shutdown notification interface\n");
+ LogDebug(BCLog::ZMQ, "Shutdown notification interface\n");
if (pcontext)
{
for (auto& notifier : notifiers) {
- LogPrint(BCLog::ZMQ, "Shutdown notifier %s at %s\n", notifier->GetType(), notifier->GetAddress());
+ LogDebug(BCLog::ZMQ, "Shutdown notifier %s at %s\n", notifier->GetType(), notifier->GetAddress());
notifier->Shutdown();
}
zmq_ctx_term(pcontext);
diff --git a/src/zmq/zmqpublishnotifier.cpp b/src/zmq/zmqpublishnotifier.cpp
index 608870c489..c0a04d28a6 100644
--- a/src/zmq/zmqpublishnotifier.cpp
+++ b/src/zmq/zmqpublishnotifier.cpp
@@ -118,7 +118,7 @@ bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
return false;
}
- LogPrint(BCLog::ZMQ, "Outbound message high water mark for %s at %s is %d\n", type, address, outbound_message_high_water_mark);
+ LogDebug(BCLog::ZMQ, "Outbound message high water mark for %s at %s is %d\n", type, address, outbound_message_high_water_mark);
int rc = zmq_setsockopt(psocket, ZMQ_SNDHWM, &outbound_message_high_water_mark, sizeof(outbound_message_high_water_mark));
if (rc != 0)
@@ -159,8 +159,8 @@ bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
}
else
{
- LogPrint(BCLog::ZMQ, "Reusing socket for address %s\n", address);
- LogPrint(BCLog::ZMQ, "Outbound message high water mark for %s at %s is %d\n", type, address, outbound_message_high_water_mark);
+ LogDebug(BCLog::ZMQ, "Reusing socket for address %s\n", address);
+ LogDebug(BCLog::ZMQ, "Outbound message high water mark for %s at %s is %d\n", type, address, outbound_message_high_water_mark);
psocket = i->second->psocket;
mapPublishNotifiers.insert(std::make_pair(address, this));
@@ -191,7 +191,7 @@ void CZMQAbstractPublishNotifier::Shutdown()
if (count == 1)
{
- LogPrint(BCLog::ZMQ, "Close socket at address %s\n", address);
+ LogDebug(BCLog::ZMQ, "Close socket at address %s\n", address);
int linger = 0;
zmq_setsockopt(psocket, ZMQ_LINGER, &linger, sizeof(linger));
zmq_close(psocket);
@@ -220,7 +220,7 @@ bool CZMQAbstractPublishNotifier::SendZmqMessage(const char *command, const void
bool CZMQPublishHashBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
{
uint256 hash = pindex->GetBlockHash();
- LogPrint(BCLog::ZMQ, "Publish hashblock %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish hashblock %s to %s\n", hash.GetHex(), this->address);
uint8_t data[32];
for (unsigned int i = 0; i < 32; i++) {
data[31 - i] = hash.begin()[i];
@@ -231,7 +231,7 @@ bool CZMQPublishHashBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
bool CZMQPublishHashTransactionNotifier::NotifyTransaction(const CTransaction &transaction)
{
uint256 hash = transaction.GetHash();
- LogPrint(BCLog::ZMQ, "Publish hashtx %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish hashtx %s to %s\n", hash.GetHex(), this->address);
uint8_t data[32];
for (unsigned int i = 0; i < 32; i++) {
data[31 - i] = hash.begin()[i];
@@ -241,7 +241,7 @@ bool CZMQPublishHashTransactionNotifier::NotifyTransaction(const CTransaction &t
bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
{
- LogPrint(BCLog::ZMQ, "Publish rawblock %s to %s\n", pindex->GetBlockHash().GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish rawblock %s to %s\n", pindex->GetBlockHash().GetHex(), this->address);
std::vector<uint8_t> block{};
if (!m_get_block_by_index(block, *pindex)) {
@@ -255,7 +255,7 @@ bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
bool CZMQPublishRawTransactionNotifier::NotifyTransaction(const CTransaction &transaction)
{
uint256 hash = transaction.GetHash();
- LogPrint(BCLog::ZMQ, "Publish rawtx %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish rawtx %s to %s\n", hash.GetHex(), this->address);
DataStream ss;
ss << TX_WITH_WITNESS(transaction);
return SendZmqMessage(MSG_RAWTX, &(*ss.begin()), ss.size());
@@ -277,27 +277,27 @@ static bool SendSequenceMsg(CZMQAbstractPublishNotifier& notifier, uint256 hash,
bool CZMQPublishSequenceNotifier::NotifyBlockConnect(const CBlockIndex *pindex)
{
uint256 hash = pindex->GetBlockHash();
- LogPrint(BCLog::ZMQ, "Publish sequence block connect %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish sequence block connect %s to %s\n", hash.GetHex(), this->address);
return SendSequenceMsg(*this, hash, /* Block (C)onnect */ 'C');
}
bool CZMQPublishSequenceNotifier::NotifyBlockDisconnect(const CBlockIndex *pindex)
{
uint256 hash = pindex->GetBlockHash();
- LogPrint(BCLog::ZMQ, "Publish sequence block disconnect %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish sequence block disconnect %s to %s\n", hash.GetHex(), this->address);
return SendSequenceMsg(*this, hash, /* Block (D)isconnect */ 'D');
}
bool CZMQPublishSequenceNotifier::NotifyTransactionAcceptance(const CTransaction &transaction, uint64_t mempool_sequence)
{
uint256 hash = transaction.GetHash();
- LogPrint(BCLog::ZMQ, "Publish hashtx mempool acceptance %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish hashtx mempool acceptance %s to %s\n", hash.GetHex(), this->address);
return SendSequenceMsg(*this, hash, /* Mempool (A)cceptance */ 'A', mempool_sequence);
}
bool CZMQPublishSequenceNotifier::NotifyTransactionRemoval(const CTransaction &transaction, uint64_t mempool_sequence)
{
uint256 hash = transaction.GetHash();
- LogPrint(BCLog::ZMQ, "Publish hashtx mempool removal %s to %s\n", hash.GetHex(), this->address);
+ LogDebug(BCLog::ZMQ, "Publish hashtx mempool removal %s to %s\n", hash.GetHex(), this->address);
return SendSequenceMsg(*this, hash, /* Mempool (R)emoval */ 'R', mempool_sequence);
}
diff --git a/src/zmq/zmqutil.cpp b/src/zmq/zmqutil.cpp
index 3c6d1b9ab5..842928ed1e 100644
--- a/src/zmq/zmqutil.cpp
+++ b/src/zmq/zmqutil.cpp
@@ -12,5 +12,5 @@
void zmqError(const std::string& str)
{
- LogPrint(BCLog::ZMQ, "Error: %s, msg: %s\n", str, zmq_strerror(errno));
+ LogDebug(BCLog::ZMQ, "Error: %s, msg: %s\n", str, zmq_strerror(errno));
}